from __future__ import annotations from pathlib import Path import unittest from govoplan_dataflow.backend.manifest import get_manifest REPO_ROOT = Path(__file__).resolve().parents[1] class DataflowInterfaceDocumentationContractTests(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( { "dataflow.page", "dataflow.library", "dataflow.graph", "dataflow.sql", "dataflow.inspector", "dataflow.results", "dataflow.decisions", "dataflow.triggers", "dataflow.runs", "dataflow.widget.pipelines", }, set(surfaces), ) for surface_id in ( "dataflow.library", "dataflow.graph", "dataflow.sql", "dataflow.inspector", "dataflow.results", "dataflow.triggers", "dataflow.runs", ): self.assertEqual("dataflow.page", surfaces[surface_id].parent_id) self.assertEqual("dataflow.results", surfaces["dataflow.decisions"].parent_id) def test_help_and_consequence_metadata_remain_published(self) -> None: topics = {topic.id: topic for topic in get_manifest().documentation} boundary = topics["dataflow.module-boundary"] fields = topics["dataflow.reference.fields-and-consequences"] nodes = topics["dataflow.reference.nodes-and-expressions"] execution = topics["dataflow.execution-and-recovery"] self.assertIn("dataflow.state.read-only", boundary.metadata["help_contexts"]) self.assertIn("dataflow.field.expression", nodes.metadata["help_contexts"]) self.assertIn("dataflow.action.review-decisions", nodes.metadata["help_contexts"]) self.assertIn("save_revision", fields.metadata["consequence_classes"]) self.assertIn("delete_pipeline", fields.metadata["consequence_classes"]) self.assertIn("record_decision", fields.metadata["consequence_classes"]) self.assertIn("publish_output", execution.metadata["consequence_classes"]) self.assertIn("promote_revision", execution.metadata["consequence_classes"]) def test_webui_uses_shared_help_guard_and_consequence_components(self) -> None: page = (REPO_ROOT / "webui/src/features/dataflow/DataflowPage.tsx").read_text( encoding="utf-8" ) inspector = ( REPO_ROOT / "webui/src/features/dataflow/NodeInspector.tsx" ).read_text(encoding="utf-8") for component in ( "ActionBlockerHint", "titleHelp={}", "useUnsavedDraftGuard", "ConfirmDialog", ): self.assertIn(component, page) self.assertIn("DATAFLOW_NODE_DOCUMENTATION", inspector) self.assertNotIn("helpAction=", page) if __name__ == "__main__": unittest.main()