from __future__ import annotations import unittest from govoplan_postbox.backend.manifest import manifest class PostboxInterfaceDocumentationContractTests(unittest.TestCase): def test_route_and_contributed_surfaces_remain_declared(self) -> None: frontend = manifest.frontend self.assertIsNotNone(frontend) self.assertEqual( {"/postbox"}, {route.path for route in frontend.routes}, # type: ignore[union-attr] ) self.assertEqual( { "postbox.admin.templates", "postbox.inbox.directory", "postbox.inbox.messages", "postbox.quick_access.messages", "postbox.widget.inbox", }, {surface.id for surface in frontend.view_surfaces}, # type: ignore[union-attr] ) self.assertTrue(all(item.icon == "inbox" for item in manifest.nav_items)) def test_topics_publish_stable_help_privacy_and_consequence_metadata(self) -> None: topics = {topic.id: topic for topic in manifest.documentation} self.assertIn("postbox.function-bound-containers", topics) self.assertIn("postbox.reference.fields-and-consequences", topics) guide = topics["postbox.function-bound-containers"] self.assertIn("postbox.inbox.messages", guide.metadata["help_contexts"]) self.assertIn("postbox.state.unavailable", guide.metadata["help_contexts"]) self.assertGreaterEqual(len(guide.metadata["privacy_notes"]), 3) reference = topics["postbox.reference.fields-and-consequences"] self.assertIn("postbox.field.classification", reference.metadata["help_contexts"]) self.assertIn("postbox.action.delete-grouping", reference.metadata["help_contexts"]) self.assertIn("archive_postbox", reference.metadata["consequence_classes"]) self.assertIn("withdraw_or_expire", reference.metadata["consequence_classes"]) if __name__ == "__main__": unittest.main()