# AetherForge Test Suite One command runs everything: ```bat test.bat ``` Or with PowerShell directly: ```powershell .\scripts\test-suite.ps1 ``` ## Phases | Phase | What it runs | Location | |-------|----------------|----------| | 1 | Go server unit + integration tests | `server/` | | 2 | Go agent tests | `agent/` | | 3 | Fusion module compile check | `fusion/` | | 4 | Frontend unit tests (Vitest) | `server/web/` | | 5 | Frontend production build | `server/web/` | | 6 | Server binary compile | `server/` | | 7 | Agent binary compile | `agent/` | | 8 | E2E smoke (Playwright) | `server/web/e2e/` — starts temp server | ## Run individual suites ```bat cd server && go test ./... cd agent && go test ./... cd server\web && npm test cd server\web && npm run test:e2e ``` ## E2E only (server already running) E2E credentials match `server/internal/api/integration_test.go` (`testuser` / `testpass`). Seed `users.json` in the server data directory **before** first start, or the server generates a random `admin` password instead. ```bat set AETHERFORGE_E2E_USER=testuser set AETHERFORGE_E2E_PASS=testpass powershell -NoProfile -Command "[IO.File]::WriteAllText('data\\users.json','{\"testuser\":\"testpass\"}')" set AETHERFORGE_URL=http://127.0.0.1:8989 cd server\web && npm run test:e2e ``` `test.bat` phase 8 seeds `users.json` automatically in a temp data dir. Override creds with `AETHERFORGE_E2E_USER` / `AETHERFORGE_E2E_PASS` (used by Playwright, `test-suite.ps1`, and `scripts/smoke-test.ps1`). ## Adding tests - **Go:** `*_test.go` next to the code under test - **Frontend:** `src/**/*.test.ts` (Vitest) - **E2E:** `server/web/e2e/*.spec.ts` (Playwright) Coverage areas: forge/fusion, auth, DB, pool reconnect, API routes, fleet filters, preflight validation, media crypto roundtrip, dashboard login smoke, remote actions UI (offline gating via Playwright API mock). ### Agent logs (not a missing API) There is no dedicated REST endpoint to push agent log files. Logs reach the dashboard by design through: - **`get_log` command** — Fleet Roster → Remote Control → Fetch Log (or `GET /api/v1/agents/{id}/log?refresh=1` triggers the command and returns cached tail) - **`upload_log` AI tool** — when AI autonomy is enabled, the agent reports log content via `/api/v1/agent/report` after an Ollama tool call Unit tests cover `AgentRemoteActions` offline gating in `components.test.tsx`; Playwright `e2e/remote-actions.spec.ts` mocks an offline agent and asserts disabled buttons. ### Frontend types (`types/index.ts`) TypeScript interfaces in `server/web/src/types/` are compile-time contracts only — no runtime JSON schema guards. Validation lives in forms, forge preflight, and server-side handlers.