Files
TJWaterServerBinary/tests/api/test_project_endpoints.py
T

122 lines
4.3 KiB
Python

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