# Batch Report **Batch**: 01 **Tasks**: AZ-456 (Test Infrastructure) **Date**: 2026-05-11 **Cycle**: Phase A baseline, Step 6 — Implement Tests ## Task Results | Task | Status | Files Modified | Tests | AC Coverage | Issues | |------|--------|---------------|-------|-------------|--------| | AZ-456_test_infrastructure | Done | 37 created + 5 modified | 11 fast (5 AZ-456 smoke + 6 pre-existing mission-planner) PASS | 8 / 8 ACs covered | 1 Low / interpretation | ## AC Test Coverage: All covered | AC | Where | Profile | Status (this run) | |----|-------|---------|-------------------| | AC-1 (env starts) | `e2e/tests/infrastructure.e2e.ts` "AC-1" | e2e | Gated by docker + suite `:test` images (Risk 4) — test exists, will run when env allows | | AC-2 (mocks respond) | `e2e/tests/infrastructure.e2e.ts` "AC-2" (owm + tile assertions) | e2e | Gated by docker — test exists | | AC-3 (MSW intercepts) | `tests/infrastructure.test.ts` (3 tests) | fast | PASS | | AC-4 (Fast runner executes) | `tests/infrastructure.test.ts` + `scripts/run-tests.sh --fast-only` | fast | PASS | | AC-5 (E2E both browsers) | `e2e/tests/infrastructure.e2e.ts` "AC-5" + playwright.config projects | e2e | Gated by docker | | AC-6 (Static runner executes) | `scripts/run-tests.sh --static-only` produces `test-output/static-report.csv` | static | PASS (13 checks) | | AC-7 (Reports correctly shaped) | `test-output/{static-report.csv, fast-report.xml, summary.csv}` (CSV header matches spec verbatim) | all | PASS | | AC-8 (External-host firewall) | `e2e/tests/infrastructure.e2e.ts` "AC-8" route guard | e2e | Gated by docker | The four e2e ACs (1, 2, 5, 8) cannot run on a developer host without `docker compose` plus the parent suite's `azaion/{admin,flights,annotations,detect}:test` images (Risk 4 in the task spec). Per implement-skill Step 8, "A skipped test counts as **Covered** — the test exists and will run when the environment allows." ## Code Review Verdict: PASS_WITH_WARNINGS Self-review (single-task batch). Phases 1–7 of `code-review/SKILL.md` walked inline: - **Phase 1 (Context)**: AZ-456 spec, environment.md, test-data.md, module-layout.md read; Risk 4 (suite-image availability) acknowledged. - **Phase 2 (Spec compliance)**: every AC has at least one test; output paths land under `./test-output/` per spec; Vitest 3.x + MSW 2.x + Playwright 1.49+ + jsdom + RTL/jest-dom versions match the spec; Bun stubs use `oven/bun:1.3.11-alpine` matching `packageManager` pin. - **Phase 3 (Code quality)**: small, single-responsibility helpers; no bare catch/except; CSV writer escapes embedded quotes; `src_grep` falls back to `grep -r` when ripgrep is absent (caught and fixed during install-verify). One Bun-specific globally typed reference (`Bun.serve`) lives only inside Docker stub builds and is not type-checked by the project tsconfig — by design. - **Phase 4 (Security)**: no real secrets in fixtures (placeholder argon2 hashes); test bearer is `'test-bearer-default'`; OWM key static check (`STC-SEC1`) lifted from QUARANTINE per AZ-447 and now PASSES against `src/`. - **Phase 5 (Performance)**: fast suite ~3s wall-clock for 11 tests — well under the 5-min budget; static profile ~26s including `vite build`. - **Phase 6 (Cross-task consistency)**: single-task batch, N/A. - **Phase 7 (Architecture compliance)**: see Findings below. ### Findings 1. **Low / Architecture / Interpretation** — `tests/helpers/{render.tsx, auth.ts, navigate.ts}` import from `src/api/client.ts` (01_api-transport), `src/auth/AuthContext.tsx` (02_auth), and `src/i18n/i18n.ts` (00_foundation). A strict reading of `_docs/02_document/module-layout.md` "Blackbox Tests / Imports from" says "00_foundation only (and only `src/types/index.ts`)". The AZ-456 task spec, however, explicitly mandates these helpers and names the production accessors (`setToken`, `setNavigateToLogin`, `AuthProvider`, `i18n`) by file path. The accessors were created by autodev Step 4 / C06 specifically for testability. Recommendation: clarify the layout rule to read "test ASSERTIONS may only import from `src/types`" (Black-box discipline applies to test bodies, not to setup helpers / composition-root wrappers). The task spec is the more specific authority and should win over the layout aspiration in this case. No action taken in this batch; surfaced for user / team confirmation at the batch boundary. 2. **Out-of-scope tile-URL issue surfaced (informational, not a finding against this batch)** — `src/features/flights/types.ts` contains hardcoded `https://{s}.tile.openstreetmap.org/...` and `https://server.arcgisonline.com/...` literals that AZ-450 (Step 4 testability "refactor_tile_urls") was supposed to make configurable. AZ-456 originally added a static check (`STC-S4`) for this; the check was removed before the green run because it is beyond AZ-456's spec list (`unpkg.com`, banned libs, no SW registration, no literal OWM key). The hardcoded tile URLs are a real concern for AC-N6 / Step 8 refactor but are NOT this task's problem to fix. ## Auto-Fix Attempts: 0 ## Stuck Agents: None ## Files Changed (42) ### Created — `tests/` (24) ``` tests/setup.ts tests/msw/server.ts tests/msw/helpers.ts tests/msw/handlers/index.ts tests/msw/handlers/admin.ts tests/msw/handlers/flights.ts tests/msw/handlers/annotations.ts tests/msw/handlers/detect.ts tests/msw/handlers/loader.ts tests/msw/handlers/resource.ts tests/msw/handlers/owm.ts tests/msw/handlers/tiles.ts tests/fixtures/enum_spec_snapshot.ts tests/fixtures/seed_users.ts tests/fixtures/seed_aircraft.ts tests/fixtures/seed_flights.ts tests/fixtures/seed_classes.ts tests/fixtures/seed_media.ts tests/fixtures/seed_annotations.ts tests/fixtures/seed_user_settings.ts tests/helpers/render.tsx tests/helpers/auth.ts tests/helpers/navigate.ts tests/helpers/sse-mock.ts tests/infrastructure.test.ts (smoke: AC-3, AC-4, AC-7 partial) ``` ### Created — `e2e/` (10) ``` e2e/playwright.config.ts e2e/docker-compose.suite-e2e.yml e2e/stubs/owm/Dockerfile e2e/stubs/owm/server.ts e2e/stubs/tile/Dockerfile e2e/stubs/tile/server.ts e2e/runner/Dockerfile e2e/runner/entrypoint.sh e2e/tests/infrastructure.e2e.ts (smoke: AC-1, AC-2, AC-5, AC-8) e2e/fixtures/seeds.sql ``` ### Created — root config (2) ``` vitest.config.ts tsconfig.test.json ``` ### Modified (5) ``` package.json # +test/test:fast/test:e2e scripts; +devDeps bun.lock # auto-updated .gitignore # +/test-output/ scripts/run-tests.sh # CSV output to test-output/, tsc --noEmit, vite build, ripgrep fallback scripts/run-performance-tests.sh # path swap to test-output/, compose path swap to project-local ``` ## Verification Run (host) ``` $ bun run test:fast ✓ mission-planner/src/test/jsonImport.test.ts (6 tests) 8ms ✓ tests/infrastructure.test.ts (5 tests) 40ms Test Files 2 passed (2) Tests 11 passed (11) $ ./scripts/run-tests.sh [run-tests] static profile PASSED — see .../test-output/static-report.csv (13/13) [run-tests] fast profile PASSED (11/11) [run-tests] exit code : 0 ``` E2E profile not exercised in this batch — requires `docker compose -f e2e/docker-compose.suite-e2e.yml up -d` plus parent-suite `:test` image availability (Risk 4). The compose file, stubs (`owm-stub`, `tile-stub`), and `playwright-runner` Docker image are all in place; the smoke test in `e2e/tests/infrastructure.e2e.ts` will exercise AC-1 / AC-2 / AC-5 / AC-8 once the env is brought up. ## Next Batch 26 test-implementation tasks remain in `_docs/02_tasks/todo/` (AZ-457..AZ-482). All carry **Component**: `Blackbox Tests` and **Dependencies**: `AZ-456` — they unblock immediately now that the infrastructure has landed. Suggested next batch (4 tasks, dependency-disjoint, ~12 pts total): AZ-457 (auth token handling), AZ-459 (wire-contract enums), AZ-465 (i18n), AZ-481 (CI image labels) — they touch unrelated subsystems so a code-review on the batch is coherent. Recommendation: continue in a new conversation. Context for this batch is non-trivial (37 new files, 5 modifications, 14 static checks, 11 fast tests) and the next batch will load distinct task specs.