Add collision detection tests

This commit is contained in:
Jared Miller 2026-02-08 13:32:49 -05:00
parent f1e4cfa4dd
commit 1a122b85e5
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C

View file

@ -0,0 +1,124 @@
"""Test collision detection when registering commands."""
import logging
import pytest
from mudlib.commands import CommandDefinition, _registry, register
@pytest.fixture(autouse=True)
def clean_registry():
"""Save and restore registry around each test."""
saved = dict(_registry)
_registry.clear()
yield
_registry.clear()
_registry.update(saved)
async def dummy_handler(player, args):
"""Placeholder command handler."""
pass
async def other_handler(player, args):
"""Another placeholder command handler."""
pass
def test_registering_command_adds_to_registry():
"""Baseline: registering a command adds it to registry."""
defn = CommandDefinition(name="test", handler=dummy_handler)
register(defn)
assert "test" in _registry
assert _registry["test"] is defn
def test_registering_same_command_again_does_not_warn(caplog):
"""Registering same command definition again does not warn."""
defn = CommandDefinition(name="test", handler=dummy_handler)
with caplog.at_level(logging.WARNING):
register(defn)
register(defn)
assert len(caplog.records) == 0
def test_registering_different_command_with_same_name_warns(caplog):
"""Registering different command with same name warns."""
defn1 = CommandDefinition(name="test", handler=dummy_handler)
defn2 = CommandDefinition(name="test", handler=other_handler)
with caplog.at_level(logging.WARNING):
register(defn1)
register(defn2)
assert len(caplog.records) == 1
assert "collision" in caplog.records[0].message.lower()
assert "test" in caplog.records[0].message
assert _registry["test"] is defn2 # last-registered wins
def test_command_alias_collides_with_existing_command_name(caplog):
"""Registering command whose alias collides with existing name warns."""
defn1 = CommandDefinition(name="north", handler=dummy_handler)
defn2 = CommandDefinition(name="navigate", handler=other_handler, aliases=["north"])
with caplog.at_level(logging.WARNING):
register(defn1)
register(defn2)
assert len(caplog.records) == 1
assert "collision" in caplog.records[0].message.lower()
assert "north" in caplog.records[0].message
def test_command_alias_collides_with_different_command_alias(caplog):
"""Registering command whose alias collides with different command's alias warns."""
defn1 = CommandDefinition(name="southwest", handler=dummy_handler, aliases=["sw"])
defn2 = CommandDefinition(name="sweep", handler=other_handler, aliases=["sw"])
with caplog.at_level(logging.WARNING):
register(defn1)
register(defn2)
assert len(caplog.records) == 1
assert "collision" in caplog.records[0].message.lower()
assert "sw" in caplog.records[0].message
def test_warning_message_includes_both_command_names(caplog):
"""Warning message includes both the existing and new command names."""
defn1 = CommandDefinition(name="existing", handler=dummy_handler)
defn2 = CommandDefinition(name="newcomer", handler=other_handler)
with caplog.at_level(logging.WARNING):
register(defn1)
register(defn2) # both have name "newcomer" but defn2 overwrites
# Re-register to trigger collision
defn3 = CommandDefinition(name="existing", handler=other_handler)
with caplog.at_level(logging.WARNING):
caplog.clear()
register(defn3)
assert len(caplog.records) == 1
record = caplog.records[0].message
assert "existing" in record
# Should show both the existing command name and the new one
assert "existing" in record
def test_same_definition_multiple_aliases_no_warning(caplog):
"""Same definition registering multiple aliases to itself doesn't warn."""
defn = CommandDefinition(name="test", handler=dummy_handler, aliases=["t", "tst"])
with caplog.at_level(logging.WARNING):
register(defn)
assert len(caplog.records) == 0
assert _registry["test"] is defn
assert _registry["t"] is defn
assert _registry["tst"] is defn