from __future__ import annotations import unittest from pathlib import Path from topology_api.app import create_app ROOT = Path(__file__).resolve().parents[1] HTML_PATH = ROOT / "data" / "wiki" / "guanghan_topology_demo.html" CONFIG_PATH = ROOT / "topology_api" / "config.py" class TopologyApiServingTests(unittest.TestCase): @classmethod def setUpClass(cls) -> None: app = create_app() app.config.update(TESTING=True) cls.client = app.test_client() def test_app_serves_demo_page_and_health(self) -> None: health = self.client.get("/health") self.assertEqual(health.status_code, 200) self.assertEqual(health.get_json(), {"status": "ok"}) page = self.client.get("/guanghan_topology_demo.html") self.assertEqual(page.status_code, 200) self.assertIn("广寒基地拓扑结构", page.get_data(as_text=True)) page.close() def test_page_uses_same_origin_api(self) -> None: html = HTML_PATH.read_text(encoding="utf-8") self.assertNotIn("http://localhost:5000", html) self.assertIn("const API_BASE = ''", html) def test_config_has_no_default_password(self) -> None: source = CONFIG_PATH.read_text(encoding="utf-8") self.assertNotRegex( source, r'os\.environ\.get\(\s*["\']PGPASSWORD["\']\s*,', ) class TopologyApiQueryTests(unittest.TestCase): @classmethod def setUpClass(cls) -> None: app = create_app() app.config.update(TESTING=True) cls.client = app.test_client() def test_invalid_time_is_json_400(self) -> None: response = self.client.get( "/api/v1/bases/guanghan/snapshot?at=not-a-time" ) self.assertEqual(response.status_code, 400) self.assertEqual(response.get_json()["error"], "invalid_time") def test_time_and_mission_preserve_context(self) -> None: response = self.client.get( "/api/v1/bases/guanghan/snapshot" "?mission=GHC-01&at=2025-01-02T08:00:00%2B08:00" ) self.assertEqual(response.status_code, 200) query = response.get_json()["query"] self.assertEqual(query["requestedMission"], "GHC-01") self.assertEqual(query["anchorSource"], "explicit_time") def test_mission_list_is_database_backed(self) -> None: response = self.client.get("/api/v1/bases/guanghan/missions") self.assertEqual(response.status_code, 200) missions = response.get_json()["missions"] self.assertIn("GHC-05", [mission["code"] for mission in missions]) for mission in missions: self.assertIn("title", mission) self.assertIn("occurrenceStatus", mission) self.assertIn("lastEventAt", mission) if __name__ == "__main__": unittest.main()