from __future__ import annotations import unittest from govoplan_admin.backend.manifest import manifest class InterfaceDocumentationContractTests(unittest.TestCase): def test_admin_topics_publish_stable_help_contexts(self) -> None: topics = {topic.id: topic for topic in manifest.documentation} expected = { "admin.workspace": {"admin.workspace", "admin.overview"}, "admin.governance-and-module-lifecycle": { "admin.system-settings", "admin.configuration-changes", "admin.configuration-packages", "admin.governance-templates", }, "admin.module-lifecycle-workflow": { "admin.module-lifecycle", "admin.module-lifecycle.queue-blocker", "admin.module-lifecycle.plan", "admin.module-lifecycle.evidence", }, "admin.tenant-module-entitlements": { "admin.system-tenant-modules", "admin.tenant-modules", }, } for topic_id, contexts in expected.items(): self.assertIn(topic_id, topics) metadata = topics[topic_id].metadata or {} self.assertTrue( contexts.issubset(set(metadata.get("help_contexts", ()))), topic_id, ) def test_admin_contributed_surfaces_remain_declared(self) -> None: surface_ids = { surface.id for surface in manifest.frontend.view_surfaces } self.assertEqual( surface_ids, { "admin.section.overview", "admin.section.system-settings", "admin.section.system-configuration-changes", "admin.section.system-configuration-packages", "admin.section.system-role-templates", "admin.section.system-groups", "admin.section.system-modules", "admin.section.system-tenant-modules", "admin.section.tenant-modules", }, ) def test_module_administrator_has_only_tenant_module_permissions(self) -> None: permissions = {item.scope for item in manifest.permissions} template = next(item for item in manifest.role_templates if item.slug == "module_admin") self.assertEqual({"admin:module:read", "admin:module:write"}, permissions) self.assertEqual(tuple(sorted(permissions)), tuple(sorted(template.permissions))) if __name__ == "__main__": unittest.main()