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_all_static_topics_have_complete_german_content(self) -> None: for topic in get_manifest().documentation: german = (topic.translations or {}).get("de", {}) self.assertEqual({"title", "summary", "body"}, set(german), topic.id) self.assertTrue( all(str(value).strip() for value in german.values()), topic.id ) 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"] owner_links = topics["cases.workflow.link-owner-references"] 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"]) self.assertEqual("reference", reference.metadata["kind"]) self.assertIn( "link_owner_reference", owner_links.metadata["consequence_classes"], ) def test_information_governance_claims_are_bounded_and_documented(self) -> None: manifest = get_manifest() governance = manifest.information_governance self.assertEqual("enforced", governance.temporal_browsing.adoption) self.assertEqual("enforced", governance.purpose_aware_access.adoption) self.assertEqual("enforced", governance.institutional_context.adoption) self.assertEqual("contract_only", governance.retention.adoption) self.assertIn("legal holds", governance.retention.limitation or "") self.assertTrue(governance.current_authorization_for_historical_reads) topics = {topic.id: topic for topic in manifest.documentation} purpose = topics["cases.governance.purpose-bound-access"] self.assertIn("cases.field.access-purpose", purpose.metadata["help_contexts"]) self.assertIn("cases.field.allowed-purposes", purpose.metadata["help_contexts"]) 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", "QUICK_ACCESS_RESULT_EVENT", "linkCaseEvidence", "unlinkCaseEvidence", ): self.assertIn(component, detail_page) for component in ( "ConfirmDialog", "DocumentationHelpLink", "ReferenceSelect", "useUnsavedDraftGuard", ): self.assertIn(component, access_dialog) if __name__ == "__main__": unittest.main()