from __future__ import annotations import unittest from govoplan_idm.backend.manifest import manifest from govoplan_idm.backend.api.v1.routes import ORGANIZATION_IDENTITY_READ_SCOPES class IdmInterfaceDocumentationContractTests(unittest.TestCase): def test_route_and_contributed_action_remain_declared(self) -> None: frontend = manifest.frontend self.assertIsNotNone(frontend) self.assertEqual( {"/idm"}, {route.path for route in frontend.routes}, # type: ignore[union-attr] ) self.assertEqual( {"idm.action.view-function-assignments"}, {surface.id for surface in frontend.view_surfaces}, # type: ignore[union-attr] ) self.assertTrue(all(item.icon == "users" for item in manifest.nav_items)) def test_topics_publish_workflow_blocker_and_consequence_metadata(self) -> None: topics = {topic.id: topic for topic in manifest.documentation} self.assertIn("idm.workflow.assign-function-to-identity", topics) self.assertIn("idm.reference.assignment-governance", topics) self.assertIn("idm.reference.fields-and-consequences", topics) self.assertIn("idm.reference.typed-relationships", topics) workflow = topics["idm.workflow.assign-function-to-identity"] self.assertIn("idm.blocker.permission", workflow.metadata["help_contexts"]) governance = topics["idm.reference.assignment-governance"] self.assertIn("function_decision", governance.metadata["consequence_classes"]) reference = topics["idm.reference.fields-and-consequences"] self.assertIn("idm.field.acting-for", reference.metadata["help_contexts"]) self.assertIn("deactivate_or_expire", reference.metadata["consequence_classes"]) relationships = topics["idm.reference.typed-relationships"] self.assertEqual( { "title", "summary", "body", }, set(relationships.translations["de"]), ) self.assertIn( "idm.relationships.field.revocation-reason", relationships.metadata["help_contexts"], ) self.assertIn( "idm.typed-groups.action.resolve-memberships", relationships.metadata["help_contexts"], ) self.assertIn("Revocation immediately", relationships.metadata["consequences"][2]) self.assertIn("Access permissions remain unchanged", relationships.metadata["verification"]) def test_relationship_writers_may_use_identity_search_selectors(self) -> None: self.assertIn("idm:relationship:write", ORGANIZATION_IDENTITY_READ_SCOPES) self.assertNotIn("idm:relationship:read", ORGANIZATION_IDENTITY_READ_SCOPES) if __name__ == "__main__": unittest.main()