aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/bot/rules/test_everyone_ping.py102
1 files changed, 102 insertions, 0 deletions
diff --git a/tests/bot/rules/test_everyone_ping.py b/tests/bot/rules/test_everyone_ping.py
new file mode 100644
index 000000000..3ecc43cdc
--- /dev/null
+++ b/tests/bot/rules/test_everyone_ping.py
@@ -0,0 +1,102 @@
+from typing import Iterable
+
+from bot.rules import everyone_ping
+from tests.bot.rules import DisallowedCase, RuleTest
+from tests.helpers import MockGuild, MockMessage
+
+NUM_GUILD_MEMBERS = 100
+
+
+def make_msg(author: str, message: str) -> MockMessage:
+ """Build a message with `message` as the content sent."""
+ mocked_guild = MockGuild(member_count=NUM_GUILD_MEMBERS)
+ return MockMessage(author=author, content=message, guild=mocked_guild)
+
+
+class EveryonePingRuleTest(RuleTest):
+ """Tests the `everyone_ping` antispam rule."""
+
+ def setUp(self):
+ self.apply = everyone_ping.apply
+ self.config = {
+ "max": 0, # Max allowed @everyone pings per user
+ "interval": 10,
+ }
+
+ async def test_disallows_everyone_ping(self):
+ """Cases with an @everyone ping."""
+ cases = (
+ DisallowedCase(
+ [make_msg("bob", "@everyone")],
+ ("bob",),
+ 1
+ ),
+ DisallowedCase(
+ [make_msg("bob", "Let me ping @everyone in the server.")],
+ ("bob",),
+ 1
+ ),
+ DisallowedCase(
+ [make_msg("bob", "`codeblock message` and @everyone ping")],
+ ("bob",),
+ 1
+ ),
+ DisallowedCase(
+ [make_msg("bob", "`sandwich` @everyone `ping between codeblocks`.")],
+ ("bob",),
+ 1
+ ),
+ DisallowedCase(
+ [make_msg("bob", "This is a multiline\n@everyone\nping.")],
+ ("bob",),
+ 1
+ ),
+ # Not actually valid code blocks
+ DisallowedCase(
+ [make_msg("bob", "`@everyone``")],
+ ("bob",),
+ 1
+ ),
+ DisallowedCase(
+ [make_msg("bob", "`@everyone``````")],
+ ("bob",),
+ 1
+ ),
+ DisallowedCase(
+ [make_msg("bob", "``@everyone``````")],
+ ("bob",),
+ 1
+ ),
+ )
+
+ await self.run_disallowed(cases)
+
+ async def test_allows_inline_codeblock_everyone_ping(self):
+ """Cases with an @everyone ping in an inline codeblock."""
+ cases = (
+ [make_msg("bob", "Codeblock has `@everyone` ping.")],
+ [make_msg("bob", "Multiple `codeblocks` including `@everyone` ping.")],
+ [make_msg("bob", "This is a valid ``inline @everyone` ping.")],
+ )
+
+ await self.run_allowed(cases)
+
+ async def test_allows_multiline_codeblock_everyone_ping(self):
+ """Cases with an @everyone ping in a multiline codeblock."""
+ cases = (
+ [make_msg("bob", "```Multiline codeblock has\nan `@everyone` ping.```")],
+ [make_msg("bob", "``` `@everyone``` ` `")],
+ )
+
+ await self.run_allowed(cases)
+
+ def relevant_messages(self, case: DisallowedCase) -> Iterable[MockMessage]:
+ last_message = case.recent_messages[0]
+ return tuple(
+ msg
+ for msg in case.recent_messages
+ if msg.author == last_message.author
+ )
+
+ def get_report(self, case: DisallowedCase) -> str:
+ return "pinged the everyone role"