from __future__ import annotations from pathlib import Path import unittest from govoplan_risk_compliance.backend.manifest import get_manifest REPO_ROOT = Path(__file__).resolve().parents[1] class RiskComplianceInterfaceDocumentationContractTests(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] expected = { "risk_compliance.sanctions.sources", "risk_compliance.sanctions.screening", "risk_compliance.sanctions.review", "risk_compliance.assurance.graph", "risk_compliance.action.import-snapshot", "risk_compliance.action.run-screening", "risk_compliance.review.disposition", "risk_compliance.assurance.editor", "risk_compliance.action.connect-assurance", } self.assertEqual(expected, set(surfaces)) self.assertEqual( "risk_compliance.workspace", frontend.routes[0].surface_id, # type: ignore[union-attr] ) for surface_id in ( "risk_compliance.sanctions.sources", "risk_compliance.sanctions.screening", "risk_compliance.sanctions.review", "risk_compliance.assurance.graph", ): self.assertEqual("risk_compliance.workspace", surfaces[surface_id].parent_id) self.assertEqual( "risk_compliance.sanctions.sources", surfaces["risk_compliance.action.import-snapshot"].parent_id, ) self.assertEqual( "risk_compliance.sanctions.screening", surfaces["risk_compliance.action.run-screening"].parent_id, ) self.assertEqual( "risk_compliance.sanctions.review", surfaces["risk_compliance.review.disposition"].parent_id, ) self.assertEqual( "risk_compliance.assurance.graph", surfaces["risk_compliance.assurance.editor"].parent_id, ) def test_help_and_consequence_metadata_remain_published(self) -> None: topics = {topic.id: topic for topic in get_manifest().documentation} topic = topics["risk_compliance.module-boundary"] for context in ( "risk_compliance.action.import-snapshot", "risk_compliance.action.run-screening", "risk_compliance.review.disposition", "risk_compliance.assurance.editor", "risk_compliance.action.connect-assurance", ): self.assertIn(context, topic.metadata["help_contexts"]) for consequence in ( "import_snapshot", "run_screening", "record_disposition", "record_exception", "revise_assurance_object", "connect_assurance_objects", ): self.assertIn(consequence, topic.metadata["consequence_classes"]) def test_webui_uses_shared_governed_operation_patterns(self) -> None: page = ( REPO_ROOT / "webui/src/features/riskCompliance/RiskCompliancePage.tsx" ).read_text(encoding="utf-8") module = (REPO_ROOT / "webui/src/module.ts").read_text(encoding="utf-8") for component in ( "ActionBlockerHint", "ConfirmDialog", "DocumentationHelpLink", "MetricCard", "SelectionList", "useUnsavedDraftGuard", ): self.assertIn(component, page) self.assertIn("risk_compliance.assurance.graph", module) self.assertIn("risk_compliance.action.connect-assurance", module) if __name__ == "__main__": unittest.main()