Follow-up to the test_api.sh fix. Same Phase 30.1 + 30.6 staleness existed in the other E2E scripts; same pattern applied. ## New tests/e2e/_lib.sh Shared bash helpers so future scripts don't reimplement: - e2e_extract_token — parse auth_token from register response - e2e_register — register + echo token - e2e_heartbeat — heartbeat with bearer auth - e2e_cleanup_all_workspaces — pre-test state reset ## test_comprehensive_e2e.sh (14 fail -> 0 fail) Root cause was deeper than test_api.sh: the script creates workspaces at Section 2 but doesn't register them until Section 3. In between, the platform provisioner spawns the Docker container, whose main.py calls /registry/register first and claims the single-issue token. The script's later register gets no auth_token back. Fix: register each workspace immediately after POST /workspaces, beating the container to the token. Empirically 5/5 wins in a tight loop. PM/Dev/QA tokens captured at creation time; bearer auth threaded through all heartbeat/update-card/discover/peers calls. Removed the duplicate register calls in Section 3/4 that followed (tokens already captured). Result: 53/68 -> 67/67 (one duplicate check dropped). ## test_activity_e2e.sh Same pattern applied on faith. Script still SKIPs cleanly when no online agent is present; when an agent IS online, it now re-registers it to mint a fresh bearer token and threads Authorization: Bearer on the 3 heartbeat calls. ## test_api.sh refactor Now sources _lib.sh and uses the shared helpers. No behavior change, still 62/62. ## .github/workflows/ci.yml — new e2e-api job Spins up Postgres 16 + Redis 7 as GitHub Actions services, builds the platform binary, runs it in background with DATABASE_URL/REDIS_URL, polls /health for 30s, then runs tests/e2e/test_api.sh. On failure dumps platform.log for triage. 10-min job timeout. This is the watchdog that would have caught Phase 30.1 auth drift the day it landed. Picks test_api.sh not test_comprehensive_e2e.sh because the latter depends on Docker-in-Docker for container provisioning which is heavier than a PR gate should carry. ## Verification - bash tests/e2e/test_api.sh -> 62/62 - bash tests/e2e/test_comprehensive_e2e.sh -> 67/67 - bash tests/e2e/test_activity_e2e.sh -> cleanly SKIPs (no agent) - go build ./... -> clean - .github/workflows/ci.yml -> valid YAML, new job added Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| e2e | ||
| README.md | ||
Tests
This repo uses the standard monorepo testing convention: unit tests live with their package, cross-component E2E tests live here.
Where to find tests
| Scope | Location |
|---|---|
| Go unit + integration (platform, CLI, handlers) | platform/**/*_test.go — run with cd platform && go test -race ./... |
| TypeScript unit (canvas components, hooks, store) | canvas/src/**/__tests__/ — run with cd canvas && npm test -- --run |
| TypeScript unit (MCP server handlers) | mcp-server/src/__tests__/ — run with cd mcp-server && npx jest |
| Python unit (workspace runtime, adapters) | workspace-template/tests/ — run with cd workspace-template && python3 -m pytest |
| Python unit (SDK: plugin + remote agent) | sdk/python/tests/ — run with cd sdk/python && python3 -m pytest |
| Cross-component E2E (spans platform + runtime + HTTP) | tests/e2e/ ← you are here |
Why split this way
- Go requires co-located
_test.gofiles to access unexported symbols. - Per-package test commands keep the inner loop fast — changing canvas doesn't re-run Go tests.
tests/e2e/covers scenarios that no single package owns: a full workspace lifecycle, A2A across two provisioned agents, delegation chains, bundle round-trips.
Running E2E
Every E2E script here assumes the platform is running at localhost:8080 and (where noted) provisioned agents are online. See the header comment of each .sh for specifics.