Files
geointel/backend/tests/test_qa_service.py
T
Codex 6ea3586a3e
GeoIntel CI / docs-smoke (push) Has been cancelled
GeoIntel CI / contract-smoke (push) Has been cancelled
Initial GeoIntel V1 foundation
2026-06-16 23:36:32 +02:00

102 lines
3.1 KiB
Python

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