aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorGravatar Ionite <[email protected]>2023-03-09 17:42:50 -0500
committerGravatar Ionite <[email protected]>2023-03-09 17:42:50 -0500
commit1ccf515979bd05b659a25d5deb0022e8ee7ca63b (patch)
tree6ca8047fa35c698f1f170c02554a90276abe23ec /tests
parentMerge branch 'main' into snekbox-files (diff)
parentMerge #2459: Update nested delimiter to double underscore (diff)
Merge branch 'main' into snekbox-files
# Conflicts: # bot/constants.py # bot/exts/utils/snekbox/_cog.py # config-default.yml
Diffstat (limited to 'tests')
-rw-r--r--tests/bot/exts/backend/test_error_handler.py20
-rw-r--r--tests/bot/exts/info/doc/test_parsing.py23
-rw-r--r--tests/bot/exts/recruitment/talentpool/test_review.py14
-rw-r--r--tests/helpers.py31
4 files changed, 75 insertions, 13 deletions
diff --git a/tests/bot/exts/backend/test_error_handler.py b/tests/bot/exts/backend/test_error_handler.py
index adb0252a5..0ba2fcf11 100644
--- a/tests/bot/exts/backend/test_error_handler.py
+++ b/tests/bot/exts/backend/test_error_handler.py
@@ -47,7 +47,7 @@ class ErrorHandlerTests(unittest.IsolatedAsyncioTestCase):
)
self.cog.try_silence = AsyncMock()
self.cog.try_get_tag = AsyncMock()
- self.cog.try_run_eval = AsyncMock(return_value=False)
+ self.cog.try_run_fixed_codeblock = AsyncMock(return_value=False)
for case in test_cases:
with self.subTest(try_silence_return=case["try_silence_return"], try_get_tag=case["called_try_get_tag"]):
@@ -75,7 +75,7 @@ class ErrorHandlerTests(unittest.IsolatedAsyncioTestCase):
self.cog.try_silence = AsyncMock()
self.cog.try_get_tag = AsyncMock()
- self.cog.try_run_eval = AsyncMock()
+ self.cog.try_run_fixed_codeblock = AsyncMock()
error = errors.CommandNotFound()
@@ -83,7 +83,7 @@ class ErrorHandlerTests(unittest.IsolatedAsyncioTestCase):
self.cog.try_silence.assert_not_awaited()
self.cog.try_get_tag.assert_not_awaited()
- self.cog.try_run_eval.assert_not_awaited()
+ self.cog.try_run_fixed_codeblock.assert_not_awaited()
self.ctx.send.assert_not_awaited()
async def test_error_handler_user_input_error(self):
@@ -334,13 +334,13 @@ class TryGetTagTests(unittest.IsolatedAsyncioTestCase):
self.ctx = MockContext()
self.tag = Tags(self.bot)
self.cog = error_handler.ErrorHandler(self.bot)
- self.bot.get_command.return_value = self.tag.get_command
+ self.bot.get_cog.return_value = self.tag
async def test_try_get_tag_get_command(self):
"""Should call `Bot.get_command` with `tags get` argument."""
- self.bot.get_command.reset_mock()
+ self.bot.get_cog.reset_mock()
await self.cog.try_get_tag(self.ctx)
- self.bot.get_command.assert_called_once_with("tags get")
+ self.bot.get_cog.assert_called_once_with("Tags")
async def test_try_get_tag_invoked_from_error_handler(self):
"""`self.ctx` should have `invoked_from_error_handler` `True`."""
@@ -350,14 +350,14 @@ class TryGetTagTests(unittest.IsolatedAsyncioTestCase):
async def test_try_get_tag_no_permissions(self):
"""Test how to handle checks failing."""
- self.tag.get_command.can_run = AsyncMock(return_value=False)
+ self.bot.can_run = AsyncMock(return_value=False)
self.ctx.invoked_with = "foo"
self.assertIsNone(await self.cog.try_get_tag(self.ctx))
async def test_try_get_tag_command_error(self):
"""Should call `on_command_error` when `CommandError` raised."""
err = errors.CommandError()
- self.tag.get_command.can_run = AsyncMock(side_effect=err)
+ self.bot.can_run = AsyncMock(side_effect=err)
self.cog.on_command_error = AsyncMock()
self.assertIsNone(await self.cog.try_get_tag(self.ctx))
self.cog.on_command_error.assert_awaited_once_with(self.ctx, err)
@@ -365,7 +365,7 @@ class TryGetTagTests(unittest.IsolatedAsyncioTestCase):
async def test_dont_call_suggestion_tag_sent(self):
"""Should never call command suggestion if tag is already sent."""
self.ctx.message = MagicMock(content="foo")
- self.ctx.invoke = AsyncMock(return_value=True)
+ self.tag.get_command_ctx = AsyncMock(return_value=True)
self.cog.send_command_suggestion = AsyncMock()
await self.cog.try_get_tag(self.ctx)
@@ -385,7 +385,7 @@ class TryGetTagTests(unittest.IsolatedAsyncioTestCase):
async def test_call_suggestion(self):
"""Should call command suggestion if user is not a mod."""
self.ctx.invoked_with = "foo"
- self.ctx.invoke = AsyncMock(return_value=False)
+ self.tag.get_command_ctx = AsyncMock(return_value=False)
self.cog.send_command_suggestion = AsyncMock()
await self.cog.try_get_tag(self.ctx)
diff --git a/tests/bot/exts/info/doc/test_parsing.py b/tests/bot/exts/info/doc/test_parsing.py
index 1663d8491..d2105a53c 100644
--- a/tests/bot/exts/info/doc/test_parsing.py
+++ b/tests/bot/exts/info/doc/test_parsing.py
@@ -1,6 +1,7 @@
from unittest import TestCase
from bot.exts.info.doc import _parsing as parsing
+from bot.exts.info.doc._markdown import DocMarkdownConverter
class SignatureSplitter(TestCase):
@@ -64,3 +65,25 @@ class SignatureSplitter(TestCase):
for input_string, expected_output in test_cases:
with self.subTest(input_string=input_string):
self.assertEqual(list(parsing._split_parameters(input_string)), expected_output)
+
+
+class MarkdownConverterTest(TestCase):
+ def test_hr_removed(self):
+ test_cases = (
+ ('<hr class="docutils"/>', ""),
+ ("<hr>", ""),
+ )
+ self._run_tests(test_cases)
+
+ def test_whitespace_removed(self):
+ test_cases = (
+ ("lines\nof\ntext", "lines of text"),
+ ("lines\n\nof\n\ntext", "lines of text"),
+ )
+ self._run_tests(test_cases)
+
+ def _run_tests(self, test_cases: tuple[tuple[str, str], ...]):
+ for input_string, expected_output in test_cases:
+ with self.subTest(input_string=input_string):
+ d = DocMarkdownConverter(page_url="https://example.com")
+ self.assertEqual(d.convert(input_string), expected_output)
diff --git a/tests/bot/exts/recruitment/talentpool/test_review.py b/tests/bot/exts/recruitment/talentpool/test_review.py
index 03c78ab08..1ddb73ab0 100644
--- a/tests/bot/exts/recruitment/talentpool/test_review.py
+++ b/tests/bot/exts/recruitment/talentpool/test_review.py
@@ -67,6 +67,7 @@ class ReviewerTests(unittest.IsolatedAsyncioTestCase):
MockMessage(author=self.bot_user, content="Not a review", created_at=not_too_recent),
MockMessage(author=self.bot_user, content="Not a review", created_at=not_too_recent),
],
+ not_too_recent.timestamp(),
True,
),
@@ -77,6 +78,7 @@ class ReviewerTests(unittest.IsolatedAsyncioTestCase):
MockMessage(author=self.bot_user, content="Zig for Helper!", created_at=not_too_recent),
MockMessage(author=self.bot_user, content="Scaleios for Helper!", created_at=not_too_recent),
],
+ not_too_recent.timestamp(),
False,
),
@@ -85,6 +87,7 @@ class ReviewerTests(unittest.IsolatedAsyncioTestCase):
[
MockMessage(author=self.bot_user, content="Chrisjl for Helper!", created_at=too_recent),
],
+ too_recent.timestamp(),
False,
),
@@ -96,18 +99,25 @@ class ReviewerTests(unittest.IsolatedAsyncioTestCase):
MockMessage(author=self.bot_user, content="wookie for Helper!", created_at=not_too_recent),
MockMessage(author=self.bot_user, content="Not a review", created_at=not_too_recent),
],
+ not_too_recent.timestamp(),
True,
),
# No messages, so ready.
- ([], True),
+ ([], None, True),
)
- for messages, expected in cases:
+ for messages, last_review_timestamp, expected in cases:
with self.subTest(messages=messages, expected=expected):
self.voting_channel.history = AsyncIterator(messages)
+
+ cache_get_mock = AsyncMock(return_value=last_review_timestamp)
+ self.reviewer.status_cache.get = cache_get_mock
+
res = await self.reviewer.is_ready_for_review()
+
self.assertIs(res, expected)
+ cache_get_mock.assert_called_with("last_vote_date")
@patch("bot.exts.recruitment.talentpool._review.MIN_NOMINATION_TIME", timedelta(days=7))
async def test_get_nomination_to_review(self):
diff --git a/tests/helpers.py b/tests/helpers.py
index 4b980ac21..1a71f210a 100644
--- a/tests/helpers.py
+++ b/tests/helpers.py
@@ -222,7 +222,7 @@ class MockRole(CustomMockMixin, unittest.mock.Mock, ColourMixin, HashableMixin):
# Create a Member instance to get a realistic Mock of `discord.Member`
-member_data = {'user': 'lemon', 'roles': [1]}
+member_data = {'user': 'lemon', 'roles': [1], 'flags': 2}
state_mock = unittest.mock.MagicMock()
member_instance = discord.Member(data=member_data, guild=guild_instance, state=state_mock)
@@ -479,6 +479,25 @@ class MockContext(CustomMockMixin, unittest.mock.MagicMock):
self.invoked_from_error_handler = kwargs.get('invoked_from_error_handler', False)
+class MockInteraction(CustomMockMixin, unittest.mock.MagicMock):
+ """
+ A MagicMock subclass to mock Interaction objects.
+
+ Instances of this class will follow the specifications of `discord.Interaction`
+ instances. For more information, see the `MockGuild` docstring.
+ """
+
+ def __init__(self, **kwargs) -> None:
+ super().__init__(**kwargs)
+ self.me = kwargs.get('me', MockMember())
+ self.client = kwargs.get('client', MockBot())
+ self.guild = kwargs.get('guild', MockGuild())
+ self.user = kwargs.get('user', MockMember())
+ self.channel = kwargs.get('channel', MockTextChannel())
+ self.message = kwargs.get('message', MockMessage())
+ self.invoked_from_error_handler = kwargs.get('invoked_from_error_handler', False)
+
+
attachment_instance = discord.Attachment(data=unittest.mock.MagicMock(id=1), state=unittest.mock.MagicMock())
@@ -530,6 +549,16 @@ class MockMessage(CustomMockMixin, unittest.mock.MagicMock):
self.channel = kwargs.get('channel', MockTextChannel())
+class MockInteractionMessage(MockMessage):
+ """
+ A MagicMock subclass to mock InteractionMessage objects.
+
+ Instances of this class will follow the specifications of `discord.InteractionMessage` instances. For more
+ information, see the `MockGuild` docstring.
+ """
+ pass
+
+
emoji_data = {'require_colons': True, 'managed': True, 'id': 1, 'name': 'hyperlemon'}
emoji_instance = discord.Emoji(guild=MockGuild(), state=unittest.mock.MagicMock(), data=emoji_data)