from types import SimpleNamespace from unittest.mock import AsyncMock from uuid import uuid4 from fastapi.testclient import TestClient from tests.conftest import build_test_app, install_stub, load_module_from_path class DummyChangeSet: def __init__(self, operations=None): if operations is None: self.operations = [] elif isinstance(operations, dict): self.operations = [operations] else: self.operations = operations def _load_project_module(monkeypatch): class DummyProjectContext: project_code = "demo" install_stub(monkeypatch, "app.services", package=True) install_stub( monkeypatch, "app.services.project_info", {}, ) install_stub( monkeypatch, "app.services.tjnetwork", { "ChangeSet": DummyChangeSet, "list_project": lambda: ["demo"], "have_project": lambda network: network == "demo", "create_project": lambda network: None, "delete_project": lambda network: None, "copy_project": lambda source, target: None, "import_inp": lambda network, cs: {"ok": True}, "export_inp": lambda network, version: DummyChangeSet({"kind": "export"}), "get_all_vertices": lambda network: [], "get_all_scada_info": lambda network: [], "get_all_district_metering_areas": lambda network: [], "get_all_service_areas": lambda network: [], "get_all_virtual_districts": lambda network: [], "convert_inp_v3_to_v2": lambda inp: DummyChangeSet({"inp": inp}), }, ) install_stub( monkeypatch, "app.auth.project_dependencies", { "ProjectContext": DummyProjectContext, "get_metadata_repository": lambda: None, "get_project_context": lambda: DummyProjectContext(), "use_project_business_routing": lambda: None, }, ) return load_module_from_path( "tests_project_endpoints_module", "app/api/v1/endpoints/project.py", ) def test_project_info_returns_404_when_missing(monkeypatch): module = _load_project_module(monkeypatch) repo = SimpleNamespace(get_project_detail_by_code=AsyncMock(return_value=None)) app = build_test_app(module.router, "/api/v1") app.dependency_overrides[module.get_metadata_repository] = lambda: repo client = TestClient(app) response = client.get("/api/v1/projects/current", params={"network": "missing"}) assert response.status_code == 404 assert response.json()["detail"] == "Project missing not found" def test_project_info_returns_project_workspace(monkeypatch): module = _load_project_module(monkeypatch) detail = SimpleNamespace( project_id=uuid4(), name="Demo Project", code="demo", description="desc", gs_workspace="ws", map_extent={"xmin": 1, "ymin": 2, "xmax": 3, "ymax": 4}, status="active", ) repo = SimpleNamespace(get_project_detail_by_code=AsyncMock(return_value=detail)) app = build_test_app(module.router, "/api/v1") app.dependency_overrides[module.get_metadata_repository] = lambda: repo client = TestClient(app) response = client.get("/api/v1/projects/current", params={"network": "demo"}) assert response.status_code == 200 payload = response.json() assert payload["code"] == "demo" assert payload["gs_workspace"] == "ws" assert "geoserver" not in payload def test_legacy_open_project_endpoint_is_removed(monkeypatch): module = _load_project_module(monkeypatch) client = TestClient(build_test_app(module.router, "/api/v1")) response = client.post("/api/v1/projects/current", params={"network": "demo"}) assert response.status_code == 405 def test_legacy_physical_project_routes_are_removed(monkeypatch): module = _load_project_module(monkeypatch) client = TestClient(build_test_app(module.router, "/api/v1")) assert client.get("/api/v1/project-codes").status_code == 404 assert client.get("/api/v1/projects/existence").status_code == 404 assert client.post("/api/v1/project-copies").status_code == 404 assert client.get("/api/v1/projects/current/lock").status_code == 404 assert client.post("/api/v1/project-conversions").status_code == 404