from __future__ import annotations import unittest from govoplan_datasources.backend.manifest import manifest class DatasourcesInterfaceDocumentationContractTests(unittest.TestCase): def test_route_and_surfaces_remain_declared(self) -> None: frontend = manifest.frontend self.assertIsNotNone(frontend) self.assertEqual({"/datasources"}, {item.path for item in frontend.routes}) # type: ignore[union-attr] self.assertEqual( { "datasources.page", "datasources.catalogue", "datasources.staging", "datasources.origins", "datasources.governance", "datasources.preview", }, {item.id for item in frontend.view_surfaces}, # type: ignore[union-attr] ) def test_help_and_consequence_metadata_remain_published(self) -> None: topics = {topic.id: topic for topic in manifest.documentation} lifecycle = topics["datasources.lifecycle"] governance = topics["datasources.governance"] quality = topics["datasources.quality-gates"] reference = topics["datasources.reference.fields-and-consequences"] self.assertIn("datasources.staging", lifecycle.metadata["help_contexts"]) self.assertIn("datasources.field.authority-mode", governance.metadata["help_contexts"]) self.assertIn("datasources.staging.validation", quality.metadata["help_contexts"]) self.assertIn("policy version and hash", quality.body) self.assertTrue(quality.metadata["limitations"]) self.assertIn("datasources.action.promote", reference.metadata["help_contexts"]) self.assertIn("freeze", reference.metadata["consequence_classes"]) self.assertIn("retire", reference.metadata["consequence_classes"]) if __name__ == "__main__": unittest.main()