"""Tests for the defang/refang plugin.""" import asyncio import importlib.util import sys from pathlib import Path from derp.irc import Message # plugins/ is not a Python package -- load the module from file path _spec = importlib.util.spec_from_file_location( "plugins.defang", Path(__file__).resolve().parent.parent / "plugins" / "defang.py", ) _mod = importlib.util.module_from_spec(_spec) sys.modules[_spec.name] = _mod _spec.loader.exec_module(_mod) from plugins.defang import ( # noqa: E402 _defang, _refang, cmd_defang, cmd_refang, ) # -- Helpers ----------------------------------------------------------------- class _FakeBot: def __init__(self): self.replied: list[str] = [] async def reply(self, message, text: str) -> None: self.replied.append(text) def _msg(text: str) -> Message: return Message( raw="", prefix="alice!~alice@host", nick="alice", command="PRIVMSG", params=["#test", text], tags={}, ) # -- Pure function: _defang -------------------------------------------------- class TestDefangFunction: def test_http_url(self): result = _defang("http://evil.com") assert "[://]" in result def test_https_url(self): result = _defang("https://evil.com/path") assert "[://]" in result def test_ftp_url(self): result = _defang("ftp://files.evil.com") assert "ftp[://]" in result def test_ip_address(self): assert _defang("192.168.1.1") == "192[.]168[.]1[.]1" def test_path_dots_preserved(self): result = _defang("http://evil.com/file.php?q=1") assert "[://]" in result assert "file.php" in result def test_domain_only(self): assert _defang("evil.com") == "evil[.]com" # -- Pure function: _refang -------------------------------------------------- class TestRefangFunction: def test_basic(self): assert _refang("evil[.]com") == "evil.com" def test_protocol(self): assert _refang("http[://]evil[.]com") == "http://evil.com" def test_hxxp(self): assert _refang("hxxps[://]evil[.]com") == "https://evil.com" def test_hXXp(self): assert _refang("hXXps[://]evil[.]com") == "https://evil.com" def test_at_sign(self): assert _refang("user[at]evil[.]com") == "user@evil.com" def test_at_uppercase(self): assert _refang("user[AT]evil[.]com") == "user@evil.com" # -- Roundtrip --------------------------------------------------------------- class TestRoundtrip: def test_ip(self): original = "10.0.0.1" defanged = _defang(original) refanged = _refang(defanged) assert refanged == original def test_domain(self): original = "evil.com" defanged = _defang(original) assert "[.]" in defanged refanged = _refang(defanged) assert refanged == original def test_refang_hxxp(self): """Refang handles hxxp notation not produced by _defang.""" assert _refang("hxxps://evil[.]com") == "https://evil.com" # -- Command: defang --------------------------------------------------------- class TestCmdDefang: def test_url(self): bot = _FakeBot() asyncio.run(cmd_defang(bot, _msg("!defang https://evil.com/path"))) assert "[://]" in bot.replied[0] def test_ip(self): bot = _FakeBot() asyncio.run(cmd_defang(bot, _msg("!defang 192.168.1.1"))) assert bot.replied[0] == "192[.]168[.]1[.]1" def test_missing_args(self): bot = _FakeBot() asyncio.run(cmd_defang(bot, _msg("!defang"))) assert "Usage" in bot.replied[0] # -- Command: refang --------------------------------------------------------- class TestCmdRefang: def test_url(self): bot = _FakeBot() asyncio.run(cmd_refang(bot, _msg("!refang hxxps[://]evil[.]com"))) assert bot.replied[0] == "https://evil.com" def test_ip(self): bot = _FakeBot() asyncio.run(cmd_refang(bot, _msg("!refang 10[.]0[.]0[.]1"))) assert bot.replied[0] == "10.0.0.1" def test_missing_args(self): bot = _FakeBot() asyncio.run(cmd_refang(bot, _msg("!refang"))) assert "Usage" in bot.replied[0]