# Copyright (c) 2026 Krzysztof Rudnicki. MIT licence. """Trigger resolution.""" from __future__ import annotations import pytest from signal_bot.registry import CommandContext, CommandRegistry, DuplicateTriggerError async def _noop(ctx: CommandContext) -> None: return None def test_resolves_a_registered_trigger() -> None: registry = CommandRegistry() registry.register("cat", ["!cat", "!kot"], _noop) assert registry.resolve("!kot") is not None assert registry.resolve("!cat").name == "cat" def test_resolution_is_case_insensitive_and_trims() -> None: registry = CommandRegistry() registry.register("cat", ["!cat"], _noop) assert registry.resolve(" !CAT ") is not None def test_unknown_and_prefixless_text_resolves_to_nothing() -> None: registry = CommandRegistry() registry.register("cat", ["!cat"], _noop) assert registry.resolve("!nope") is None assert registry.resolve("cat") is None @pytest.mark.parametrize("text", [None, ""]) def test_empty_text_resolves_to_nothing(text: str | None) -> None: assert CommandRegistry().resolve(text) is None def test_duplicate_trigger_is_rejected() -> None: registry = CommandRegistry() registry.register("cat", ["!cat"], _noop) with pytest.raises(DuplicateTriggerError, match="!cat"): registry.register("feline", ["!cat"], _noop) def test_commands_lists_in_registration_order() -> None: registry = CommandRegistry() registry.register("cat", ["!cat"], _noop) registry.register("dog", ["!dog"], _noop) assert [c.name for c in registry.commands] == ["cat", "dog"]