Initial public release
GeoIntel release gates / Compile, test, contracts and builds (push) Successful in 1m49s
GeoIntel release gates / Python and npm vulnerability policy (push) Successful in 21s
GeoIntel release gates / Production AI image, SBOM and container scan (push) Successful in 5m39s
GeoIntel release gates / Deploy exact gated revision to Unraid (push) Failing after 58m43s
GeoIntel release gates / Compile, test, contracts and builds (push) Successful in 1m49s
GeoIntel release gates / Python and npm vulnerability policy (push) Successful in 21s
GeoIntel release gates / Production AI image, SBOM and container scan (push) Successful in 5m39s
GeoIntel release gates / Deploy exact gated revision to Unraid (push) Failing after 58m43s
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from uuid import uuid4
|
||||
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from app.main import app
|
||||
from app.models import Project
|
||||
from app.schemas.demo import DemoWorkflowResponse
|
||||
from app.services.demo_workflow_service import DemoWorkflowService
|
||||
|
||||
|
||||
def test_demo_workflow_endpoint_returns_canonical_envelope(monkeypatch) -> None:
|
||||
project_id = uuid4()
|
||||
area_id = uuid4()
|
||||
reference_dataset_id = uuid4()
|
||||
candidate_dataset_id = uuid4()
|
||||
quality_check_id = uuid4()
|
||||
|
||||
monkeypatch.setattr(
|
||||
DemoWorkflowService,
|
||||
"seed",
|
||||
lambda _db: DemoWorkflowResponse(
|
||||
project_id=project_id,
|
||||
area_id=area_id,
|
||||
reference_dataset_id=reference_dataset_id,
|
||||
candidate_dataset_id=candidate_dataset_id,
|
||||
quality_check_id=quality_check_id,
|
||||
metric_count=6,
|
||||
status="ready",
|
||||
message="Demo workflow seeded from explicit local fixtures.",
|
||||
created=True,
|
||||
),
|
||||
)
|
||||
|
||||
response = TestClient(app).post("/api/v1/demo/workflow")
|
||||
|
||||
assert response.status_code == 201
|
||||
payload = response.json()
|
||||
assert set(payload) == {"data"}
|
||||
assert payload["data"]["project_id"] == str(project_id)
|
||||
assert payload["data"]["reference_dataset_id"] == str(reference_dataset_id)
|
||||
assert payload["data"]["candidate_dataset_id"] == str(candidate_dataset_id)
|
||||
assert payload["data"]["quality_check_id"] == str(quality_check_id)
|
||||
assert payload["data"]["metric_count"] == 6
|
||||
assert payload["data"]["status"] == "ready"
|
||||
assert payload["data"]["created"] is True
|
||||
|
||||
|
||||
def test_demo_workflow_service_uses_explicit_golden_fixtures() -> None:
|
||||
reference_path = DemoWorkflowService._fixture_path("reference_buildings.geojson")
|
||||
candidate_path = DemoWorkflowService._fixture_path("predicted_buildings.geojson")
|
||||
|
||||
assert reference_path.exists()
|
||||
assert candidate_path.exists()
|
||||
assert DemoWorkflowService.PROJECT_NAME == "GeoIntel Demo - Building QA"
|
||||
assert DemoWorkflowService.REFERENCE_FILENAME == "demo_reference_buildings.geojson"
|
||||
assert DemoWorkflowService.CANDIDATE_FILENAME == "demo_predicted_buildings.geojson"
|
||||
assert DemoWorkflowService.EXPECTED_METRICS_FILENAME == "expected_qa_metrics.json"
|
||||
assert DemoWorkflowService._demo_area_geometry()["coordinates"][0][0][0][0] < 4.99
|
||||
assert DemoWorkflowService._demo_area_geometry()["coordinates"][0][0][2][0] > 4.992
|
||||
|
||||
|
||||
def test_demo_workflow_service_supports_container_fixture_mount() -> None:
|
||||
service = (DemoWorkflowService._repo_root() / "backend" / "app" / "services" / "demo_workflow_service.py").read_text(encoding="utf-8")
|
||||
|
||||
assert "GEOINTEL_FIXTURES_ROOT" in service
|
||||
assert 'Path("/app/fixtures/golden")' in service
|
||||
assert "reference_payload, reference_raw = DemoWorkflowService._load_fixture" in service
|
||||
assert "project = existing" in service
|
||||
assert "if not reference:" in service
|
||||
assert "if not candidate:" in service
|
||||
assert "_sync_demo_area" in service
|
||||
assert "_quality_check_matches_expected" in service
|
||||
|
||||
|
||||
def test_demo_workflow_uses_reserved_server_owned_project_identity() -> None:
|
||||
service = (DemoWorkflowService._repo_root() / "backend" / "app" / "services" / "demo_workflow_service.py").read_text(encoding="utf-8")
|
||||
|
||||
assert "db.get(Project, DemoWorkflowService.PROJECT_ID)" in service
|
||||
assert "PUBLIC_DEMO_PROJECT_MARKER" in service
|
||||
assert "PUBLIC_DEMO_IDENTITY_CONFLICT" in service
|
||||
assert "id=DemoWorkflowService.PROJECT_ID" in service
|
||||
|
||||
|
||||
def test_explicit_demo_seed_reactivates_an_archived_fixture_project() -> None:
|
||||
project = Project(id=uuid4(), name=DemoWorkflowService.PROJECT_NAME, status="archived")
|
||||
|
||||
class Session:
|
||||
added = []
|
||||
commits = 0
|
||||
refreshed = []
|
||||
|
||||
def add(self, value) -> None:
|
||||
self.added.append(value)
|
||||
|
||||
def commit(self) -> None:
|
||||
self.commits += 1
|
||||
|
||||
def refresh(self, value) -> None:
|
||||
self.refreshed.append(value)
|
||||
|
||||
db = Session()
|
||||
result = DemoWorkflowService._activate_explicit_demo_project(db, project)
|
||||
|
||||
assert result is project
|
||||
assert project.status == "active"
|
||||
assert db.added == [project]
|
||||
assert db.commits == 1
|
||||
assert db.refreshed == [project]
|
||||
Reference in New Issue
Block a user