from pathlib import Path ROOT = Path(__file__).resolve().parents[2] def read_text(relative_path: str) -> str: return (ROOT / relative_path).read_text(encoding="utf-8") def test_qa_feature_evidence_contract_is_documented_and_rendered() -> None: schema = read_text("backend/app/schemas/qa.py") quality_panel = read_text("frontend/src/components/quality/QualityResultsPanel.tsx") api_contracts = read_text("docs/API_CONTRACTS.md") for field_name in ("match_evidence", "false_positive_evidence", "false_negative_evidence"): assert field_name in schema assert field_name in quality_panel assert field_name in api_contracts assert "Kaartbewijs per object" in quality_panel assert "Overeenkomende object-ID's" in quality_panel assert "ID's van onterecht gevonden objecten" in quality_panel assert "ID's van gemiste objecten" in quality_panel assert "evidenceLabel" in quality_panel def test_qa_services_persist_feature_evidence_without_new_migrations() -> None: qa_route = read_text("backend/app/api/routes/qa.py") detection_service = read_text("backend/app/services/detection_service.py") segmentation_service = read_text("backend/app/services/segmentation_service.py") migrations = "\n".join(path.name for path in (ROOT / "backend" / "alembic" / "versions").glob("*.py")) for field_name in ("match_evidence", "false_positive_evidence", "false_negative_evidence"): assert field_name in qa_route assert field_name in detection_service assert field_name in segmentation_service assert "quality_check_items" not in migrations