diff options
author | 2019-09-15 17:18:00 +0200 | |
---|---|---|
committer | 2019-09-18 23:14:09 +0200 | |
commit | 7f70a4eb064458b56892c046a34cce598a2053e2 (patch) | |
tree | 1262411194cbf68549bb01947025964852262e09 | |
parent | Merge pull request #438 from python-discord/hemlock-infraction-date-humanization (diff) |
Add tests for `bot.rules.attachments`.
This also fixes an issue with the `attachments` rule not respecting the most recent message sent by a user.
-rw-r--r-- | bot/rules/attachments.py | 4 | ||||
-rw-r--r-- | tests/rules/__init__.py | 0 | ||||
-rw-r--r-- | tests/rules/test_attachments.py | 52 |
3 files changed, 54 insertions, 2 deletions
diff --git a/bot/rules/attachments.py b/bot/rules/attachments.py index 47b927101..80a15d440 100644 --- a/bot/rules/attachments.py +++ b/bot/rules/attachments.py @@ -11,14 +11,14 @@ async def apply( config: Dict[str, int] ) -> Optional[Tuple[str, Iterable[Member], Iterable[Message]]]: - relevant_messages = tuple( + relevant_messages = [last_message] + [ msg for msg in recent_messages if ( msg.author == last_message.author and len(msg.attachments) > 0 ) - ) + ] total_recent_attachments = sum(len(msg.attachments) for msg in relevant_messages) if total_recent_attachments > config['max']: diff --git a/tests/rules/__init__.py b/tests/rules/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/rules/__init__.py diff --git a/tests/rules/test_attachments.py b/tests/rules/test_attachments.py new file mode 100644 index 000000000..6f025b3cb --- /dev/null +++ b/tests/rules/test_attachments.py @@ -0,0 +1,52 @@ +import asyncio +from dataclasses import dataclass +from typing import Any, List + +import pytest + +from bot.rules import attachments + + +# Using `MagicMock` sadly doesn't work for this usecase +# since it's __eq__ compares the MagicMock's ID. We just +# want to compare the actual attributes we set. +@dataclass +class FakeMessage: + author: str + attachments: List[Any] + + +def msg(total_attachments: int): + return FakeMessage(author='lemon', attachments=list(range(total_attachments))) + + + 'messages', + ( + (msg(0), msg(0), msg(0)), + (msg(2), msg(2)), + (msg(0),), + ) +) +def test_allows_messages_without_too_many_attachments(messages): + last_message, *recent_messages = messages + coro = attachments.apply(last_message, recent_messages, {'max': 5}) + assert asyncio.run(coro) is None + + + ('messages', 'relevant_messages', 'total'), + ( + ((msg(4), msg(0), msg(6)), [msg(4), msg(6)], 10), + ((msg(6),), [msg(6)], 6), + ((msg(1),) * 6, [msg(1)] * 6, 6), + ) +) +def test_disallows_messages_with_too_many_attachments(messages, relevant_messages, total): + last_message, *recent_messages = messages + coro = attachments.apply(last_message, recent_messages, {'max': 5}) + assert asyncio.run(coro) == ( + f"sent {total} attachments in 5s", + ('lemon',), + relevant_messages + ) |