"""Tests for internal web UI skeleton (#426).""" import sys import unittest from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) from starlette.testclient import TestClient from webui.app import create_app class TestWebuiSkeleton(unittest.TestCase): def setUp(self): self.client = TestClient(create_app()) def test_health_returns_json(self): response = self.client.get("/health") self.assertEqual(response.status_code, 200) data = response.json() self.assertEqual(data["status"], "ok") self.assertEqual(data["service"], "mcp-control-plane-webui") self.assertEqual(data["mode"], "read-only-mvp") self.assertIn("timestamp", data) self.assertIn("deployment", data) self.assertEqual(data["deployment"]["mode"], "internal-operator-console") def test_home_renders(self): response = self.client.get("/") self.assertEqual(response.status_code, 200) self.assertIn("Operator console", response.text) self.assertIn("Read-only MVP", response.text) def test_runtime_is_implemented(self): response = self.client.get("/runtime") self.assertEqual(response.status_code, 200) self.assertIn("Runtime health", response.text) def test_audit_is_implemented(self): response = self.client.get("/audit") self.assertEqual(response.status_code, 200) self.assertIn("Report audit", response.text) def test_prompts_is_implemented(self): response = self.client.get("/prompts") self.assertEqual(response.status_code, 200) self.assertIn("Prompt library", response.text) def test_projects_is_implemented(self): response = self.client.get("/projects") self.assertEqual(response.status_code, 200) self.assertIn("Gitea-Tools", response.text) def test_worktrees_is_implemented(self): response = self.client.get("/worktrees") self.assertEqual(response.status_code, 200) self.assertIn("Worktree hygiene", response.text) def test_leases_is_implemented(self): response = self.client.get("/leases") self.assertEqual(response.status_code, 200) self.assertIn("Leases", response.text) self.assertIn("Collision warnings", response.text) def test_actions_is_implemented(self): response = self.client.get("/actions") self.assertEqual(response.status_code, 200) self.assertIn("Gated actions", response.text) def test_post_is_rejected(self): response = self.client.post("/health") self.assertEqual(response.status_code, 405) self.assertEqual(response.json()["error"], "read-only-mvp") def test_queue_route_renders(self): response = self.client.get("/queue") self.assertEqual(response.status_code, 200) self.assertIn("Live queue", response.text) def test_nav_links_on_all_pages(self): paths = ("/", "/queue", "/projects", "/prompts", "/runtime", "/audit", "/worktrees", "/leases", "/actions") hrefs = ("/queue", "/projects", "/prompts", "/runtime", "/audit", "/worktrees", "/leases", "/actions") for path in paths: with self.subTest(path=path): text = self.client.get(path).text for href in hrefs: self.assertIn(f'href="{href}"', text) if __name__ == "__main__": unittest.main()