Files
transcription/docs/tests.md
T
2026-06-23 10:49:11 -05:00

5.2 KiB

Testing

The greenfield test structure mirrors the source tree at a high level and keeps the first pass shallow and easy to extend.

Source To Test Map

  • src/handwriting/bootstrap.py, src/handwriting/config.py, src/handwriting/logging_buffer.py, src/handwriting/main.py -> tests/handwriting/test_core.py
  • src/handwriting/ai/** -> tests/handwriting/ai/
  • src/handwriting/api/** -> tests/handwriting/api/
  • src/handwriting/db/** -> tests/handwriting/db/
  • src/handwriting/services/** -> tests/handwriting/services/
  • src/handwriting/ui/components/** and src/handwriting/ui/pages/** -> tests/handwriting/ui/
  • Shared test helpers and fixtures -> tests/conftest.py plus subtree conftest.py files where needed

Major Sections

  • tests/handwriting/test_core.py: bootstrap, config, logging, and entrypoint coverage.
  • tests/handwriting/ai/: AI contracts, runtime orchestration, graph wiring, and node behavior.
  • tests/handwriting/api/: HTTP routes and request/response contract checks.
  • tests/handwriting/db/: session setup, models, and repositories.
  • tests/handwriting/services/: service-layer orchestration and domain logic.
  • tests/handwriting/ui/: NiceGUI components and pages.
  • tests/conftest.py: shared lightweight fixtures and deterministic defaults.
  • tests/handwriting/**/conftest.py: subtree-specific fixtures only where a package needs its own setup.

Implemented In This Pass (Core + DB)

Created Files

  • tests/handwriting/test_core.py
  • tests/handwriting/conftest.py
  • tests/handwriting/db/conftest.py
  • tests/handwriting/db/test_session.py
  • tests/handwriting/db/test_models.py
  • tests/handwriting/db/test_job_repo.py
  • tests/handwriting/db/test_service_job.py

Updated Files

  • tests/conftest.py: added shared settings_factory fixture.
  • pyproject.toml: registered strict markers and async pytest mode.

Marker Taxonomy

  • unit: fast deterministic unit tests.
  • db: database-backed tests against PostgreSQL-backed fixtures.
  • document: document-store tests for MongoDB-backed persistence behavior.
  • integration: cross-layer integration tests (reserved for expanded next pass).
  • smoke: high-value end-to-end surface checks.
  • slow: long-running tests.
  • external: tests that require external services/credentials.

Fixture Ownership

  • tests/conftest.py: global lightweight fixtures used across all sections.
  • tests/handwriting/conftest.py: core package-level environment fixtures.
  • tests/handwriting/db/conftest.py:
    • PostgreSQL fixtures (postgres_engine, db_session) for default data-layer tests.
    • optional MongoDB fixture (mongo_client) gated by PYTEST_MONGO_URL for document-store integration checks.

Initial Coverage Added

  • tests/handwriting/test_core.py
    • settings identity and URL validation behavior.
    • logging UI buffer wiring.
    • buffer incremental read behavior.
    • minimal main module export smoke check.
  • tests/handwriting/db/test_session.py
    • session scope, factory, and engine helper behavior.
  • tests/handwriting/db/test_models.py
    • model defaults and enum/value shape checks.
  • tests/handwriting/db/test_job_repo.py
    • repository list/detail happy path and not-found/missing-image edges.
  • tests/handwriting/db/test_service_job.py
    • job creation happy path and validation errors for unsupported type / oversized payload.

Run Commands

  • Collect only: uv run pytest --collect-only -q
  • Fast local path: uv run pytest -m unit -q
  • DB path: uv run pytest -m "db or integration" -q
  • Full path: uv run pytest -q

Current Verification Snapshot

  • uv run pytest --collect-only -q -> 19 tests collected.
  • uv run pytest -m unit -q -> 11 passed, 8 deselected.
  • uv run pytest -m "db or integration" -q -> 7 passed, 12 deselected.

Jobs Page Diagnostics

To investigate cases where /jobs renders without a table, the scaffold now includes focused service and UI coverage:

  • tests/handwriting/services/test_ui_jobs.py
    • verifies the list_jobs_for_ui contract used by the page.
    • includes the join edge case where a job with a missing image relation does not appear in list output.
  • tests/handwriting/ui/test_jobs_page_runtime.py
    • verifies runtime guard behavior for missing app state (settings, session_factory).
  • tests/handwriting/ui/test_jobs_page_rendering.py
    • includes a detector test for initial render behavior on /jobs.
    • verifies empty, table, and error rendering branches after refresh.
  • tests/handwriting/ui/test_jobs_page_smoke.py
    • confirms route registration and refresh button wiring.

Targeted commands:

  • uv run pytest tests/handwriting/ui/test_jobs_page_rendering.py -q
  • uv run pytest -m "unit or integration" -q
  • uv run pytest -m smoke -k jobs -q
  • HANDWRITING_E2E_BASE_URL=http://localhost uv run pytest tests/handwriting/ui/test_jobs_page_browser_smoke.py -q

Next Pass

The next pass can expand each major section into markers, fixtures, and test case placeholders.

Glossary

  • Contract mapping: Verifying that adapter input/output shapes match expected boundaries.
  • Document-store tests: Tests that validate behavior against document-oriented persistence components.
  • Marker taxonomy: The test marker classification scheme used to select test slices.