## Step 6: Test and Verification Hardening (MVP closeout) ## Objective Complete MVP verification by building a **requirements-traceable, deterministic test strategy** across unit/integration/external lanes, then enforcing stable validation commands and reporting. This step finalizes the MVP implementation sequence from `docs/mvp.md` (Step 6 in the build order: tests and automated verification). --- ## MCP Resource Integration (what was applied) I reviewed all top-level skills/prompts from `john-stream-mcp` and integrated the relevant guidance into this plan: ### Directly applied - `resource://skills/pytesting/document` - `resource://catalog/prompts/pytest-scaffold` - `resource://prompts/pytest-scaffold/document` - `resource://catalog/prompts/pytest-fill-scaffold` - `resource://prompts/pytest-fill-scaffold/document` - `resource://skills/nicegui/document` - `resource://skills/nicegui-ui-customization/document` - `resource://skills/fastapi-uv-docker/document` - `resource://skills/python-logging-dictconfig/document` - `resource://skills/python-typing/document` - `resource://skills/ruff-linting-formating/document` ### Reviewed but informational/non-blocking for Step 6 - `copilot-customization`, `mcp-details`, `vscode-configuration`, `zensical-docs`, and authoring/shim prompts. - These are primarily customization/documentation tooling resources, not core MVP test-lane blockers. - Step 6 includes optional workflow follow-ups where relevant (e.g., VS Code task conveniences). --- ## Scope ### In scope - Strengthen and complete test coverage for the shipped MVP slice (Steps 1–5) - Add requirement-to-test traceability for REQ-0..REQ-12 (MVP subset emphasized) - Enforce deterministic default lanes (`unit`, `integration`) - Keep `external` lane opt-in and isolated - Validate app/UI/service/worker contracts end-to-end at test level ### Out of scope - Major architecture rewrites (async SQLAlchemy migration, queue system, etc.) - Full production deployment rollout - Post-MVP feature expansion (revision history, search, export) --- ## Planned Deliverables ### Test files (new/updated) - `tests/test_traceability.py` *(or docs-based traceability matrix if preferred)* - `tests/integration/test_pipeline_flow.py` *(upload -> queued -> worker -> transcript/failed)* - `tests/ui/test_upload_page.py` (augment loading/error/ready-state checks as practical) - `tests/ui/test_jobs_page.py` (augment refresh/error behavior checks as practical) - Existing tests touched only when needed; preserve naming/hierarchy unless explicitly approved. ### Optional docs output - `docs/tests.md` or `docs/verification.md` with lane definitions and command matrix - REQ-to-test mapping table --- ## Design and Policy Decisions (MCP-aligned) 1. **Scaffold-first, fill-second workflow is mandatory** - First create/adjust skeletons and collect. - Then fill test bodies. - Preserve scaffold names/docstrings during fill. 2. **Deterministic-first default lanes** - `unit` and `integration` run by default. - `external` remains explicit opt-in. 3. **One behavior target per test** - Short, behavior-focused names. - Precise assertions on observable outcomes. 4. **Test double discipline (from pytesting skill)** - Prefer real-input/real-object paths first. - If monkeypatch/mocks/fakes are needed for a boundary, keep narrowly scoped. - Avoid call-only assertions. 5. **NiceGUI responsiveness expectations** - Verify loading/success/error state transitions where testable. - Ensure user-facing feedback behavior is covered. 6. **FastAPI/ops baseline checks** - Keep `/healthz` route validation in default lanes. - Keep startup/shutdown lifecycle assertions present. --- ## Implementation Plan + Checklist ## Phase A — Coverage and traceability audit - [ ] Build a REQ-to-test matrix for MVP requirements: - [ ] REQ-0, REQ-1, REQ-2, REQ-3, REQ-4, REQ-5, REQ-6, REQ-8, REQ-12 - [ ] Identify weak spots: - [ ] full pipeline integration (service + worker + persistence) - [ ] UI state transition assertions (loading/error/ready) - [ ] failure-path persistence verification robustness - [ ] Record current baseline command results before edits ## Phase B — Scaffold phase (pytest-scaffold resources) Target modules/areas: - pipeline integration flow - UI behavior augmentations - traceability checks/document validators (if test-backed) - [ ] Scaffold new/adjusted test files/classes/methods only - [ ] Keep one-line intent docstrings - [ ] Keep behavior-focused names - [ ] Run: `uv run pytest --collect-only -q` ## Phase C — Fill phase (pytest-fill-scaffold resources) - [ ] Fill scaffolded methods with deterministic setup/assertions - [ ] Preserve scaffold names/hierarchy/docstrings - [ ] Add/adjust fixtures at nearest useful scope - [ ] Keep DB tests in `integration`; pure helper tests in `unit` ### Required coverage additions #### Pipeline integration - [ ] Upload service creates document/job and file path persists - [ ] Worker success path creates transcript and terminal status - [ ] Worker failure path persists error detail and terminal failed status - [ ] Queue-empty behavior remains stable (`False` return / no side effects) #### UI behavior (practical, testable boundaries) - [ ] Upload helper flow success and UploadError surfacing - [ ] Jobs data helpers return stable normalized view models - [ ] Refresh/detail fallback behavior for missing/invalid job IDs #### Traceability - [ ] Every in-scope MVP REQ has at least one mapped test/assertion point - [ ] Document and/or enforce mapping consistency ## Phase D — External lane stability - [ ] Keep real-image external tests isolated under `@pytest.mark.external` - [ ] Ensure no external test leaks into default runs - [ ] Confirm artifact capture behavior remains stable ## Phase E — Quality gates and workflow - [ ] Confirm logging/lifecycle startup tests still pass after changes - [ ] (If enabled) add/update lint/type check commands in docs: - [ ] Ruff lane (if configured) - [ ] typing lane (if configured) - [ ] Optionally add VS Code task aliases for test lanes (non-blocking) --- ## Marker and Fixture Strategy - `unit`: pure logic, helper behavior, formatting/normalization - `integration`: DB + service + app lifecycle contracts - `external`: live provider/real image checks only Fixture policy: - Prefer reusable fixtures in `tests/conftest.py` only when broadly shared - Use subtree/local fixtures for domain-specific setup - Keep setup explicit and readable --- ## Validation Sequence (strict) - [ ] `uv run pytest --collect-only -q` - [ ] `uv run pytest -m unit -q` - [ ] `uv run pytest -m integration -q` - [ ] `uv run pytest -m "not external" -q` - [ ] `uv run pytest tests/integration/test_pipeline_flow.py -q` *(if added)* - [ ] `uv run pytest tests/ui/test_upload_page.py -q` - [ ] `uv run pytest tests/ui/test_jobs_page.py -q` - [ ] `uv run pytest -q` Optional external verification: - [ ] `uv run pytest -m external -q` --- ## Guardrails - Do not rename/re-nest scaffolded tests during fill unless explicitly requested. - Do not broaden external dependencies in default lane. - Do not add flaky timing-based assertions; keep deterministic boundaries. - Keep business logic out of UI tests; test through service/helper boundaries. - Preserve one-way dependency direction in test setup patterns. --- ## Definition of Done (Step 6) - [ ] MVP requirement coverage is explicitly traceable - [ ] Deterministic lanes (`unit` + `integration`) are stable and green - [ ] External lane remains opt-in and green when enabled - [ ] Pipeline success/failure lifecycle paths are verified end-to-end - [ ] UI helper/state behavior has explicit success/error assertions - [ ] Full suite passes with `uv run pytest -q` - [ ] Verification evidence is captured in implementation report --- ## PR Checklist (Step 6) ### Implementation - [ ] Added/updated test files per scoped gaps - [ ] Added REQ traceability mapping - [ ] Kept default lanes deterministic - [ ] Preserved scaffold invariants during fill ### Testing (MCP-compliant) - [ ] Used scaffold prompt flow first - [ ] Used fill prompt flow second - [ ] Preserved naming/docstrings/hierarchy - [ ] Marker usage documented (`unit`, `integration`, `external`) ### Evidence - [ ] Collected command outputs in strict order - [ ] Listed files changed - [ ] Listed MCP resources used and why - [ ] Noted residual risks/open questions (if any)