import pytest from infrasynth.notifications.resolvers import VariableResolverRegistry class TestVariableResolverRegistry: def teardown_method(self): VariableResolverRegistry._resolvers.clear() def test_register_via_decorator(self): @VariableResolverRegistry.register("ticket_number", label="NĂºmero") def resolve(recipient, context, request=None): return context["ticket_id"] result = VariableResolverRegistry.resolve("ticket_number", "a@b.com", {"ticket_id": 42}) assert result == 42 def test_register_with_namespace(self): @VariableResolverRegistry.register("user_name", namespace="helpdesk") def resolve(recipient, context, request=None): return "John" assert VariableResolverRegistry.resolve("user_name", "", {}, namespace="helpdesk") == "John" def test_namespace_scoped_resolver_not_global(self): @VariableResolverRegistry.register("only_ns", namespace="helpdesk") def resolve(recipient, context, request=None): return "x" assert VariableResolverRegistry.resolve("only_ns", "", {}) is None def test_namespace_priority_over_global(self): @VariableResolverRegistry.register("price", namespace="helpdesk") def ns_resolve(recipient, context, request=None): return "ns" @VariableResolverRegistry.register("price") def global_resolve(recipient, context, request=None): return "global" result = VariableResolverRegistry.resolve("price", "", {}, namespace="helpdesk") assert result == "ns" def test_unknown_variable_returns_none(self): assert VariableResolverRegistry.resolve("nope", "", {}) is None def test_resolver_exception_propagates(self): @VariableResolverRegistry.register("boom") def resolve(recipient, context, request=None): raise ValueError("boom") with pytest.raises(ValueError, match="boom"): VariableResolverRegistry.resolve("boom", "", {}) def test_get_available_variables(self): @VariableResolverRegistry.register("a", label="A var", namespace="ns1") def resolve_a(recipient, context, request=None): return 1 @VariableResolverRegistry.register("b", label="B var", namespace="ns2") def resolve_b(recipient, context, request=None): return 2 ns1 = VariableResolverRegistry.get_available_variables("ns1") assert "ns1:a" in ns1 assert "ns2:b" not in ns1 assert ns1["ns1:a"]["label"] == "A var" def test_get_available_variables_all(self): @VariableResolverRegistry.register("x", namespace="n1") def resolve_x(recipient, context, request=None): return 1 all_vars = VariableResolverRegistry.get_available_variables() assert "n1:x" in all_vars def test_register_returns_function(self): def fn(recipient, context, request=None): return 1 assert VariableResolverRegistry.register("y")(fn) is fn