40 lines
1.6 KiB
Python
40 lines
1.6 KiB
Python
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 "Feature-level QA/QC evidence" 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
|