ignore-channels: fnmatch patterns + silent before classifier gate (beh-09) — no emoji leak into ignored channels

This commit is contained in:
Oleksandr Kozachuk
2026-07-15 18:58:37 +02:00
parent da50395dc7
commit 7fa23068a4
3 changed files with 73 additions and 2 deletions
+49
View File
@@ -65,6 +65,55 @@ class TestClassifierGate(ClassifierGateBase):
self.bot.respond.assert_not_awaited()
class TestIgnoredChannels(ClassifierGateBase):
def ignored_msg(self, channel_name):
message = self.public_msg("hello there")
message.channel.name = channel_name
message.add_reaction = AsyncMock()
return message
async def test_pattern_match_suppresses_reaction_and_reply(self):
"""BEH-09: fnmatch pattern hit -> no classifier call, no emoji, no reply."""
self.gate_setup({"reply": False, "factual": False, "emoji": "👍"})
self.bot.config["ignore-channels"] = ["todo*"]
message = self.ignored_msg("todo-lists")
await self.bot.on_message(message)
self.bot.airesponder.classify.assert_not_awaited()
message.add_reaction.assert_not_awaited()
self.bot.respond.assert_not_awaited()
async def test_exact_name_still_matches(self):
"""BEH-09: plain names keep working as exact matches."""
self.gate_setup({"reply": True, "factual": False, "emoji": None})
self.bot.config["ignore-channels"] = ["blengon"]
await self.bot.on_message(self.ignored_msg("blengon"))
self.bot.respond.assert_not_awaited()
async def test_non_matching_channel_passes(self):
"""BEH-09: unmatched channels reach the responder as before."""
self.gate_setup({"reply": True, "factual": False, "emoji": None})
self.bot.config["ignore-channels"] = ["todo*"]
await self.bot.on_message(self.ignored_msg("chat"))
self.bot.respond.assert_awaited_once()
async def test_dm_never_ignored(self):
"""BEH-09: a DM whose recipient name matches a pattern is still answered."""
self.gate_setup({"reply": True, "factual": False, "emoji": None})
self.bot.config["ignore-channels"] = ["todo*"]
message = self.public_msg("hei bot")
message.channel = MagicMock(spec=DMChannel)
message.channel.recipient = MagicMock()
message.channel.recipient.name = "todo-fan"
await self.bot.on_message(message)
self.bot.respond.assert_awaited_once()
def test_channel_by_name_honors_patterns(self):
"""BEH-09: channel_by_name resolution skips pattern-ignored channels."""
self.bot.config["ignore-channels"] = ["todo*"]
fallback = MagicMock(spec=TextChannel)
self.assertIs(self.bot.channel_by_name("todo-lists", fallback), fallback)
class TestTypingPacing(OpsBase):
async def send_with(self, answer, factual, cps=30):
if cps is not None: