import pytest from iti.config import BaseConfig from iti.modules import ModuleMenuSeed, ModulePermission, ModuleRegistry from iti import create_app class DemoModule: name = "demo" def register_permissions(self, app): app.state.iti_modules.register_permission(ModulePermission("demo.read", "Demo Read")) def register_menu_seed(self, app): app.state.iti_modules.register_menu_seed( ModuleMenuSeed(id="demo", name="Demo", type="menu", sort=10) ) def test_module_registry_rejects_duplicate_names(): registry = ModuleRegistry() registry.register(DemoModule()) with pytest.raises(ValueError, match="already registered"): registry.register(DemoModule()) def test_create_app_runs_module_registration(): app = create_app( modules=[DemoModule()], config_mapping=BaseConfig(database_url="sqlite+pysqlite:///:memory:"), ) registry = app.state.iti_modules assert registry.permissions["demo.read"].name == "Demo Read" assert registry.list_menu_seeds()[0].id == "demo" def test_create_app_runs_register_mq_between_tasks_and_routes(): phases = [] class MQModule: name = "mq-demo" def init_app(self, app): phases.append("init_app") def register_tasks(self, app): phases.append("register_tasks") def register_mq(self, app): phases.append("register_mq") def register_routes(self, app): phases.append("register_routes") def register_permissions(self, app): phases.append("register_permissions") def register_menu_seed(self, app): phases.append("register_menu_seed") create_app( modules=[MQModule()], config_mapping=BaseConfig( database_url="sqlite+pysqlite:///:memory:", exchange_enabled=False, ), ) assert phases == [ "init_app", "register_tasks", "register_mq", "register_routes", "register_permissions", "register_menu_seed", ]