from __future__ import annotations import json from pathlib import Path from types import SimpleNamespace from uuid import uuid4 from app.models import Area, Dataset from app.services.qa_service import QaService class FakeSession: def __init__(self, datasets=None, areas=None): self.datasets = {item.id: item for item in (datasets or [])} self.areas = {item.id: item for item in (areas or [])} def get(self, model, item_id): if model.__name__ == "Dataset": return self.datasets.get(item_id) if model.__name__ == "Area": return self.areas.get(item_id) return None def _write_dataset(path: Path, coordinates: list[list[list[float]]]) -> None: payload = { "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": coordinates, }, }, ], } path.write_text(json.dumps(payload), encoding="utf-8") def test_qa_compare_candidate_with_reference_returns_metrics(tmp_path) -> None: project_id = uuid4() candidate_id = uuid4() reference_id = uuid4() candidate_path = tmp_path / "candidate.geojson" reference_path = tmp_path / "reference.geojson" polygon = [[[4.0, 51.0], [4.1, 51.0], [4.1, 51.1], [4.0, 51.1], [4.0, 51.0]]] _write_dataset(candidate_path, polygon) _write_dataset(reference_path, polygon) candidate = Dataset( id=candidate_id, project_id=project_id, name="candidate.geojson", dataset_type="vector", source="test", storage_path=str(candidate_path), crs="EPSG:4326", metadata_json={"crs_assumed": False}, ) reference = Dataset( id=reference_id, project_id=project_id, name="reference.geojson", dataset_type="vector", source="test", storage_path=str(reference_path), crs="EPSG:4326", metadata_json={"crs_assumed": False}, ) result = QaService.compare_candidate_with_reference( db=FakeSession([candidate, reference]), project_id=project_id, candidate_dataset_id=candidate_id, reference_dataset_id=reference_id, iou_threshold=0.5, ) assert result.status == "ok" assert result.matches == 1 assert result.false_positives == 0 assert result.false_negatives == 0 assert result.precision == 1.0 assert result.recall == 1.0 assert result.f1_score == 1.0 def test_dataset_reference_metadata_migration_declares_required_columns() -> None: migration_path = Path(__file__).parents[1] / "alembic" / "versions" / "202606120001_add_dataset_reference_metadata.py" migration_text = migration_path.read_text(encoding="utf-8") for column_name in ( "dataset_role", "source_name", "reference_layer_name", "source_metadata", "provenance_metadata", "imported_at", ): assert column_name in migration_text