from __future__ import annotations from pathlib import Path import unittest from govoplan_cases.backend.manifest import get_manifest REPO_ROOT = Path(__file__).resolve().parents[1] class CasesInterfaceDocumentationContractTests(unittest.TestCase): def test_backend_surfaces_and_hierarchy_remain_declared(self) -> None: frontend = get_manifest().frontend self.assertIsNotNone(frontend) surfaces = {item.id: item for item in frontend.view_surfaces} # type: ignore[union-attr] self.assertEqual( { "cases.navigation", "cases.list", "cases.list.filters", "cases.detail", "cases.detail.summary", "cases.detail.editor", "cases.detail.references", "cases.detail.timeline", "cases.detail.history", "cases.detail.access", "cases.detail.decision", }, set(surfaces), ) self.assertEqual("cases.list", surfaces["cases.list.filters"].parent_id) for surface_id in ( "cases.detail.summary", "cases.detail.editor", "cases.detail.references", "cases.detail.timeline", "cases.detail.history", "cases.detail.access", "cases.detail.decision", ): self.assertEqual("cases.detail", surfaces[surface_id].parent_id) def test_help_and_consequence_metadata_remain_published(self) -> None: topics = {topic.id: topic for topic in get_manifest().documentation} context = topics["cases.institutional-context"] reference = topics["cases.reference.lifecycle-access-and-evidence"] self.assertIn("cases.state.read-only", context.metadata["help_contexts"]) self.assertIn("cases.field.access-grant", reference.metadata["help_contexts"]) self.assertIn("update_case", reference.metadata["consequence_classes"]) self.assertIn("close_case", reference.metadata["consequence_classes"]) self.assertIn("change_access", reference.metadata["consequence_classes"]) def test_webui_uses_shared_help_guard_and_confirmation_components(self) -> None: list_page = ( REPO_ROOT / "webui/src/features/cases/CasesPage.tsx" ).read_text(encoding="utf-8") detail_page = ( REPO_ROOT / "webui/src/features/cases/CaseDetailPage.tsx" ).read_text(encoding="utf-8") access_dialog = ( REPO_ROOT / "webui/src/features/cases/CaseShareDialog.tsx" ).read_text(encoding="utf-8") self.assertIn("DocumentationHelpLink", list_page) for component in ( "ActionBlockerHint", "DocumentationHelpLink", "FormField", "useUnsavedDraftGuard", ): self.assertIn(component, detail_page) for component in ( "ConfirmDialog", "DocumentationHelpLink", "ReferenceSelect", "useUnsavedDraftGuard", ): self.assertIn(component, access_dialog) if __name__ == "__main__": unittest.main()