aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/bot/exts/backend/sync/test_base.py2
-rw-r--r--tests/bot/exts/backend/sync/test_cog.py2
-rw-r--r--tests/bot/exts/backend/test_error_handler.py22
-rw-r--r--tests/bot/exts/info/test_information.py24
-rw-r--r--tests/bot/exts/moderation/infraction/test_utils.py2
-rw-r--r--tests/bot/exts/recruitment/talentpool/test_review.py41
-rw-r--r--tests/helpers.py35
7 files changed, 80 insertions, 48 deletions
diff --git a/tests/bot/exts/backend/sync/test_base.py b/tests/bot/exts/backend/sync/test_base.py
index a17c1fa10..4dacfda17 100644
--- a/tests/bot/exts/backend/sync/test_base.py
+++ b/tests/bot/exts/backend/sync/test_base.py
@@ -1,7 +1,7 @@
import unittest
from unittest import mock
-from botcore.site_api import ResponseCodeError
+from pydis_core.site_api import ResponseCodeError
from bot.exts.backend.sync._syncers import Syncer
from tests import helpers
diff --git a/tests/bot/exts/backend/sync/test_cog.py b/tests/bot/exts/backend/sync/test_cog.py
index 87b76c6b4..2ce950965 100644
--- a/tests/bot/exts/backend/sync/test_cog.py
+++ b/tests/bot/exts/backend/sync/test_cog.py
@@ -2,7 +2,7 @@ import unittest
from unittest import mock
import discord
-from botcore.site_api import ResponseCodeError
+from pydis_core.site_api import ResponseCodeError
from bot import constants
from bot.exts.backend import sync
diff --git a/tests/bot/exts/backend/test_error_handler.py b/tests/bot/exts/backend/test_error_handler.py
index 562c827b9..0ba2fcf11 100644
--- a/tests/bot/exts/backend/test_error_handler.py
+++ b/tests/bot/exts/backend/test_error_handler.py
@@ -1,8 +1,8 @@
import unittest
from unittest.mock import AsyncMock, MagicMock, call, patch
-from botcore.site_api import ResponseCodeError
from discord.ext.commands import errors
+from pydis_core.site_api import ResponseCodeError
from bot.errors import InvalidInfractedUserError, LockedResourceError
from bot.exts.backend import error_handler
@@ -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/test_information.py b/tests/bot/exts/info/test_information.py
index 9f5143c01..65595e959 100644
--- a/tests/bot/exts/info/test_information.py
+++ b/tests/bot/exts/info/test_information.py
@@ -603,9 +603,9 @@ class RuleCommandTests(unittest.IsolatedAsyncioTestCase):
async def test_return_none_if_one_rule_number_is_invalid(self):
test_cases = [
- (('1', '6', '7', '8'), (6, 7, 8)),
- (('10', "first"), (10, )),
- (("first", 10), (10, ))
+ ("1 6 7 8", (6, 7, 8)),
+ ("10 first", (10,)),
+ ("first 10", (10,))
]
for raw_user_input, extracted_rule_numbers in test_cases:
@@ -614,7 +614,7 @@ class RuleCommandTests(unittest.IsolatedAsyncioTestCase):
str(rule_number) for rule_number in extracted_rule_numbers
if rule_number < 1 or rule_number > len(self.full_rules))
- final_rule_numbers = await self.cog.rules(self.cog, self.ctx, *raw_user_input)
+ final_rule_numbers = await self.cog.rules(self.cog, self.ctx, args=raw_user_input)
self.assertEqual(
self.ctx.send.call_args,
@@ -624,26 +624,26 @@ class RuleCommandTests(unittest.IsolatedAsyncioTestCase):
async def test_return_correct_rule_numbers(self):
test_cases = [
- (("1", "2", "first"), {1, 2}),
- (("1", "hello", "2", "second"), {1}),
- (("second", "third", "unknown", "999"), {2, 3})
+ ("1 2 first", {1, 2}),
+ ("1 hello 2 second", {1}),
+ ("second third unknown 999", {2, 3}),
]
for raw_user_input, expected_matched_rule_numbers in test_cases:
with self.subTest(identifier=raw_user_input):
- final_rule_numbers = await self.cog.rules(self.cog, self.ctx, *raw_user_input)
+ final_rule_numbers = await self.cog.rules(self.cog, self.ctx, args=raw_user_input)
self.assertEqual(expected_matched_rule_numbers, final_rule_numbers)
async def test_return_default_rules_when_no_input_or_no_match_are_found(self):
test_cases = [
- ((), None),
- (("hello", "2", "second"), None),
- (("hello", "999"), None),
+ ("", None),
+ ("hello 2 second", None),
+ ("hello 999", None),
]
for raw_user_input, expected_matched_rule_numbers in test_cases:
with self.subTest(identifier=raw_user_input):
- final_rule_numbers = await self.cog.rules(self.cog, self.ctx, *raw_user_input)
+ final_rule_numbers = await self.cog.rules(self.cog, self.ctx, args=raw_user_input)
embed = self.ctx.send.call_args.kwargs['embed']
self.assertEqual(information.DEFAULT_RULES_DESCRIPTION, embed.description)
self.assertEqual(expected_matched_rule_numbers, final_rule_numbers)
diff --git a/tests/bot/exts/moderation/infraction/test_utils.py b/tests/bot/exts/moderation/infraction/test_utils.py
index 29dadf372..122935e37 100644
--- a/tests/bot/exts/moderation/infraction/test_utils.py
+++ b/tests/bot/exts/moderation/infraction/test_utils.py
@@ -3,8 +3,8 @@ from collections import namedtuple
from datetime import datetime
from unittest.mock import AsyncMock, MagicMock, patch
-from botcore.site_api import ResponseCodeError
from discord import Embed, Forbidden, HTTPException, NotFound
+from pydis_core.site_api import ResponseCodeError
from bot.constants import Colours, Icons
from bot.exts.moderation.infraction import _utils as utils
diff --git a/tests/bot/exts/recruitment/talentpool/test_review.py b/tests/bot/exts/recruitment/talentpool/test_review.py
index ed9b66e12..03c78ab08 100644
--- a/tests/bot/exts/recruitment/talentpool/test_review.py
+++ b/tests/bot/exts/recruitment/talentpool/test_review.py
@@ -1,6 +1,6 @@
import unittest
from datetime import datetime, timedelta, timezone
-from unittest.mock import Mock, patch
+from unittest.mock import AsyncMock, Mock, patch
from bot.exts.recruitment.talentpool import _review
from tests.helpers import MockBot, MockMember, MockMessage, MockTextChannel
@@ -31,10 +31,12 @@ def nomination(
num_entries: int,
reviewed: bool = False,
id: int | None = None
-) -> tuple[int, dict]:
- return (
- id or MockMember().id,
- {"inserted_at": inserted_at.isoformat(), "entries": [Mock() for _ in range(num_entries)], "reviewed": reviewed},
+) -> Mock:
+ return Mock(
+ id=id or MockMember().id,
+ inserted_at=inserted_at,
+ entries=[Mock() for _ in range(num_entries)],
+ reviewed=reviewed
)
@@ -48,8 +50,8 @@ class ReviewerTests(unittest.IsolatedAsyncioTestCase):
self.voting_channel = MockTextChannel()
self.bot.get_channel = Mock(return_value=self.voting_channel)
- self.pool = Mock(name="MockTalentPool")
- self.reviewer = _review.Reviewer(self.bot, self.pool)
+ self.nomination_api = Mock(name="MockNominationAPI")
+ self.reviewer = _review.Reviewer(self.bot, self.nomination_api)
@patch("bot.exts.recruitment.talentpool._review.MAX_ONGOING_REVIEWS", 3)
@patch("bot.exts.recruitment.talentpool._review.MIN_REVIEW_INTERVAL", timedelta(days=1))
@@ -108,8 +110,8 @@ class ReviewerTests(unittest.IsolatedAsyncioTestCase):
self.assertIs(res, expected)
@patch("bot.exts.recruitment.talentpool._review.MIN_NOMINATION_TIME", timedelta(days=7))
- async def test_get_user_for_review(self):
- """Test get_user_for_review function."""
+ async def test_get_nomination_to_review(self):
+ """Test get_nomination_to_review function."""
now = datetime.now(timezone.utc)
# Each case contains a list of nominations, followed by the index in that list
@@ -146,19 +148,19 @@ class ReviewerTests(unittest.IsolatedAsyncioTestCase):
]
for (case_num, (nominations, expected)) in enumerate(cases, 1):
- nomination_dict = dict(nominations)
-
with self.subTest(case_num=case_num):
- self.pool.cache = nomination_dict
- res = await self.reviewer.get_user_for_review()
+ get_nominations_mock = AsyncMock(return_value=nominations)
+ self.nomination_api.get_nominations = get_nominations_mock
+ res = await self.reviewer.get_nomination_to_review()
if expected is None:
self.assertIsNone(res)
else:
- self.assertEqual(res, nominations[expected][0])
+ self.assertEqual(res, nominations[expected])
+ get_nominations_mock.assert_called_once_with(active=True)
@patch("bot.exts.recruitment.talentpool._review.MIN_NOMINATION_TIME", timedelta(days=0))
- async def test_get_user_for_review_order(self):
+ async def test_get_nomination_to_review_order(self):
now = datetime.now(timezone.utc)
# Each case in cases is a list of nominations in the order they should be chosen from first to last
@@ -196,8 +198,9 @@ class ReviewerTests(unittest.IsolatedAsyncioTestCase):
with self.subTest(case_num=case_num):
for i in range(len(case)):
with self.subTest(nomination_num=i+1):
- sub_case = dict(case[i:])
- self.pool.cache = sub_case
+ get_nominations_mock = AsyncMock(return_value=case[i:])
+ self.nomination_api.get_nominations = get_nominations_mock
- res = await self.reviewer.get_user_for_review()
- self.assertEqual(res, case[i][0])
+ res = await self.reviewer.get_nomination_to_review()
+ self.assertEqual(res, case[i])
+ get_nominations_mock.assert_called_once_with(active=True)
diff --git a/tests/helpers.py b/tests/helpers.py
index 35a8a71f7..020f1aee5 100644
--- a/tests/helpers.py
+++ b/tests/helpers.py
@@ -9,9 +9,9 @@ from typing import Iterable, Optional
import discord
from aiohttp import ClientSession
-from botcore.async_stats import AsyncStatsClient
-from botcore.site_api import APIClient
from discord.ext.commands import Context
+from pydis_core.async_stats import AsyncStatsClient
+from pydis_core.site_api import APIClient
from bot.bot import Bot
from tests._autospec import autospec # noqa: F401 other modules import it via this module
@@ -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)