diff options
| author | 2022-03-15 10:19:18 +0000 | |
|---|---|---|
| committer | 2022-03-15 10:19:18 +0000 | |
| commit | 93fafa22e3a01583fe4e5c232f1cef03d7b289ff (patch) | |
| tree | f494bc71d420f758fe4a81b4691334774b9c9273 /tests | |
| parent | Merge pull request #2114 from python-discord/jb3/increase-watch-limit (diff) | |
| parent | Revert "Migrate from Discord.py to disnake" (diff) | |
Merge pull request #2113 from python-discord/revert-disnake
Revert disnake
Diffstat (limited to 'tests')
22 files changed, 132 insertions, 132 deletions
| diff --git a/tests/README.md b/tests/README.md index fc03b3d43..b7fddfaa2 100644 --- a/tests/README.md +++ b/tests/README.md @@ -121,9 +121,9 @@ As we are trying to test our "units" of code independently, we want to make sure  However, the features that we are trying to test often depend on those objects generated by external pieces of code. It would be difficult to test a bot command without having access to a `Context` instance. Fortunately, there's a solution for that: we use fake objects that act like the true object. We call these fake objects "mocks". -To create these mock object, we mainly use the [`unittest.mock`](https://docs.python.org/3/library/unittest.mock.html) module. In addition, we have also defined a couple of specialized mock objects that mock specific `disnake` types (see the section on the below.). +To create these mock object, we mainly use the [`unittest.mock`](https://docs.python.org/3/library/unittest.mock.html) module. In addition, we have also defined a couple of specialized mock objects that mock specific `discord.py` types (see the section on the below.). -An example of mocking is when we provide a command with a mocked version of `disnake.ext.commands.Context` object instead of a real `Context` object. This makes sure we can then check (_assert_) if the `send` method of the mocked Context object was called with the correct message content (without having to send a real message to the Discord API!): +An example of mocking is when we provide a command with a mocked version of `discord.ext.commands.Context` object instead of a real `Context` object. This makes sure we can then check (_assert_) if the `send` method of the mocked Context object was called with the correct message content (without having to send a real message to the Discord API!):  ```py  import asyncio @@ -152,15 +152,15 @@ class BotCogTests(unittest.TestCase):  By default, the `unittest.mock.Mock` and `unittest.mock.MagicMock` classes cannot mock coroutines, since the `__call__` method they provide is synchronous. The [`AsyncMock`](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.AsyncMock) that has been [introduced in Python 3.8](https://docs.python.org/3.9/whatsnew/3.8.html#unittest) is an asynchronous version of `MagicMock` that can be used anywhere a coroutine is expected. -### Special mocks for some `disnake` types +### Special mocks for some `discord.py` types  To quote Ned Batchelder, Mock objects are "automatic chameleons". This means that they will happily allow the access to any attribute or method and provide a mocked value in return. One downside to this is that if the code you are testing gets the name of the attribute wrong, your mock object will not complain and the test may still pass. -In order to avoid that, we have defined a number of Mock types in [`helpers.py`](/tests/helpers.py) that follow the specifications of the actual disnake types they are mocking. This means that trying to access an attribute or method on a mocked object that does not exist on the equivalent `disnake` object will result in an `AttributeError`. In addition, these mocks have some sensible defaults and **pass `isinstance` checks for the types they are mocking**. +In order to avoid that, we have defined a number of Mock types in [`helpers.py`](/tests/helpers.py) that follow the specifications of the actual Discord types they are mocking. This means that trying to access an attribute or method on a mocked object that does not exist on the equivalent `discord.py` object will result in an `AttributeError`. In addition, these mocks have some sensible defaults and **pass `isinstance` checks for the types they are mocking**.  These special mocks are added when they are needed, so if you think it would be sensible to add another one, feel free to propose one in your PR. -**Note:** These mock types only "know" the attributes that are set by default when these `disnake` types are first initialized. If you need to work with dynamically set attributes that are added after initialization, you can still explicitly mock them: +**Note:** These mock types only "know" the attributes that are set by default when these `discord.py` types are first initialized. If you need to work with dynamically set attributes that are added after initialization, you can still explicitly mock them:  ```py  import unittest.mock @@ -245,7 +245,7 @@ All in all, it's not only important to consider if all statements or branches we  ### Unit Testing vs Integration Testing -Another restriction of unit testing is that it tests, well, in units. Even if we can guarantee that the units work as they should independently, we have no guarantee that they will actually work well together. Even more, while the mocking described above gives us a lot of flexibility in factoring out external code, we are work under the implicit assumption that we fully understand those external parts and utilize it correctly. What if our mocked `Context` object works with a `send` method, but `disnake` has changed it to a `send_message` method in a recent update? It could mean our tests are passing, but the code it's testing still doesn't work in production. +Another restriction of unit testing is that it tests, well, in units. Even if we can guarantee that the units work as they should independently, we have no guarantee that they will actually work well together. Even more, while the mocking described above gives us a lot of flexibility in factoring out external code, we are work under the implicit assumption that we fully understand those external parts and utilize it correctly. What if our mocked `Context` object works with a `send` method, but `discord.py` has changed it to a `send_message` method in a recent update? It could mean our tests are passing, but the code it's testing still doesn't work in production.  The answer to this is that we also need to make sure that the individual parts come together into a working application. In addition, we will also need to make sure that the application communicates correctly with external applications. Since we currently have no automated integration tests or functional tests, that means **it's still very important to fire up the bot and test the code you've written manually** in addition to the unit tests you've written. diff --git a/tests/base.py b/tests/base.py index dea7dd678..5e304ea9d 100644 --- a/tests/base.py +++ b/tests/base.py @@ -3,8 +3,8 @@ import unittest  from contextlib import contextmanager  from typing import Dict -import disnake -from disnake.ext import commands +import discord +from discord.ext import commands  from bot.log import get_logger  from tests import helpers @@ -80,7 +80,7 @@ class LoggingTestsMixin:  class CommandTestCase(unittest.IsolatedAsyncioTestCase): -    """TestCase with additional assertions that are useful for testing disnake commands.""" +    """TestCase with additional assertions that are useful for testing Discord commands."""      async def assertHasPermissionsCheck(  # noqa: N802          self, @@ -98,7 +98,7 @@ class CommandTestCase(unittest.IsolatedAsyncioTestCase):          permissions = {k: not v for k, v in permissions.items()}          ctx = helpers.MockContext() -        ctx.channel.permissions_for.return_value = disnake.Permissions(**permissions) +        ctx.channel.permissions_for.return_value = discord.Permissions(**permissions)          with self.assertRaises(commands.MissingPermissions) as cm:              await cmd.can_run(ctx) diff --git a/tests/bot/exts/backend/sync/test_cog.py b/tests/bot/exts/backend/sync/test_cog.py index 4ed7de64d..fdd0ab74a 100644 --- a/tests/bot/exts/backend/sync/test_cog.py +++ b/tests/bot/exts/backend/sync/test_cog.py @@ -1,7 +1,7 @@  import unittest  from unittest import mock -import disnake +import discord  from bot import constants  from bot.api import ResponseCodeError @@ -257,9 +257,9 @@ class SyncCogListenerTests(SyncCogTestCase):          self.assertTrue(self.cog.on_member_update.__cog_listener__)          subtests = ( -            ("activities", disnake.Game("Pong"), disnake.Game("Frogger")), +            ("activities", discord.Game("Pong"), discord.Game("Frogger")),              ("nick", "old nick", "new nick"), -            ("status", disnake.Status.online, disnake.Status.offline), +            ("status", discord.Status.online, discord.Status.offline),          )          for attribute, old_value, new_value in subtests: diff --git a/tests/bot/exts/backend/sync/test_roles.py b/tests/bot/exts/backend/sync/test_roles.py index 9ecb8fae0..541074336 100644 --- a/tests/bot/exts/backend/sync/test_roles.py +++ b/tests/bot/exts/backend/sync/test_roles.py @@ -1,7 +1,7 @@  import unittest  from unittest import mock -import disnake +import discord  from bot.exts.backend.sync._syncers import RoleSyncer, _Diff, _Role  from tests import helpers @@ -34,8 +34,8 @@ class RoleSyncerDiffTests(unittest.IsolatedAsyncioTestCase):          for role in roles:              mock_role = helpers.MockRole(**role) -            mock_role.colour = disnake.Colour(role["colour"]) -            mock_role.permissions = disnake.Permissions(role["permissions"]) +            mock_role.colour = discord.Colour(role["colour"]) +            mock_role.permissions = discord.Permissions(role["permissions"])              guild.roles.append(mock_role)          return guild diff --git a/tests/bot/exts/backend/sync/test_users.py b/tests/bot/exts/backend/sync/test_users.py index f55f5360f..2fc97af2d 100644 --- a/tests/bot/exts/backend/sync/test_users.py +++ b/tests/bot/exts/backend/sync/test_users.py @@ -1,7 +1,7 @@  import unittest  from unittest import mock -from disnake.errors import NotFound +from discord.errors import NotFound  from bot.exts.backend.sync._syncers import UserSyncer, _Diff  from tests import helpers diff --git a/tests/bot/exts/backend/test_error_handler.py b/tests/bot/exts/backend/test_error_handler.py index 83b5f2749..35fa0ee59 100644 --- a/tests/bot/exts/backend/test_error_handler.py +++ b/tests/bot/exts/backend/test_error_handler.py @@ -1,7 +1,7 @@  import unittest  from unittest.mock import AsyncMock, MagicMock, call, patch -from disnake.ext.commands import errors +from discord.ext.commands import errors  from bot.api import ResponseCodeError  from bot.errors import InvalidInfractedUserError, LockedResourceError diff --git a/tests/bot/exts/events/test_code_jams.py b/tests/bot/exts/events/test_code_jams.py index fdff36b61..0856546af 100644 --- a/tests/bot/exts/events/test_code_jams.py +++ b/tests/bot/exts/events/test_code_jams.py @@ -1,8 +1,8 @@  import unittest  from unittest.mock import AsyncMock, MagicMock, create_autospec, patch -from disnake import CategoryChannel -from disnake.ext.commands import BadArgument +from discord import CategoryChannel +from discord.ext.commands import BadArgument  from bot.constants import Roles  from bot.exts.events import code_jams diff --git a/tests/bot/exts/filters/test_antimalware.py b/tests/bot/exts/filters/test_antimalware.py index 0cab405d0..06d78de9d 100644 --- a/tests/bot/exts/filters/test_antimalware.py +++ b/tests/bot/exts/filters/test_antimalware.py @@ -1,7 +1,7 @@  import unittest  from unittest.mock import AsyncMock, Mock -from disnake import NotFound +from discord import NotFound  from bot.constants import Channels, STAFF_ROLES  from bot.exts.filters import antimalware diff --git a/tests/bot/exts/filters/test_security.py b/tests/bot/exts/filters/test_security.py index 46fa82fd7..c0c3baa42 100644 --- a/tests/bot/exts/filters/test_security.py +++ b/tests/bot/exts/filters/test_security.py @@ -1,7 +1,7 @@  import unittest  from unittest.mock import MagicMock -from disnake.ext.commands import NoPrivateMessage +from discord.ext.commands import NoPrivateMessage  from bot.exts.filters import security  from tests.helpers import MockBot, MockContext diff --git a/tests/bot/exts/filters/test_token_remover.py b/tests/bot/exts/filters/test_token_remover.py index dd56c10dd..4db27269a 100644 --- a/tests/bot/exts/filters/test_token_remover.py +++ b/tests/bot/exts/filters/test_token_remover.py @@ -3,7 +3,7 @@ from re import Match  from unittest import mock  from unittest.mock import MagicMock -from disnake import Colour, NotFound +from discord import Colour, NotFound  from bot import constants  from bot.exts.filters import token_remover diff --git a/tests/bot/exts/info/test_information.py b/tests/bot/exts/info/test_information.py index 9a35de7a9..d896b7652 100644 --- a/tests/bot/exts/info/test_information.py +++ b/tests/bot/exts/info/test_information.py @@ -3,7 +3,7 @@ import unittest  import unittest.mock  from datetime import datetime -import disnake +import discord  from bot import constants  from bot.exts.info import information @@ -43,7 +43,7 @@ class InformationCogTests(unittest.IsolatedAsyncioTestCase):          embed = kwargs.pop('embed')          self.assertEqual(embed.title, "Role information (Total 1 role)") -        self.assertEqual(embed.colour, disnake.Colour.og_blurple()) +        self.assertEqual(embed.colour, discord.Colour.og_blurple())          self.assertEqual(embed.description, f"\n`{self.moderator_role.id}` - {self.moderator_role.mention}\n")      async def test_role_info_command(self): @@ -51,19 +51,19 @@ class InformationCogTests(unittest.IsolatedAsyncioTestCase):          dummy_role = helpers.MockRole(              name="Dummy",              id=112233445566778899, -            colour=disnake.Colour.og_blurple(), +            colour=discord.Colour.og_blurple(),              position=10,              members=[self.ctx.author], -            permissions=disnake.Permissions(0) +            permissions=discord.Permissions(0)          )          admin_role = helpers.MockRole(              name="Admins",              id=998877665544332211, -            colour=disnake.Colour.red(), +            colour=discord.Colour.red(),              position=3,              members=[self.ctx.author], -            permissions=disnake.Permissions(0), +            permissions=discord.Permissions(0),          )          self.ctx.guild.roles.extend([dummy_role, admin_role]) @@ -81,7 +81,7 @@ class InformationCogTests(unittest.IsolatedAsyncioTestCase):          admin_embed = admin_kwargs["embed"]          self.assertEqual(dummy_embed.title, "Dummy info") -        self.assertEqual(dummy_embed.colour, disnake.Colour.og_blurple()) +        self.assertEqual(dummy_embed.colour, discord.Colour.og_blurple())          self.assertEqual(dummy_embed.fields[0].value, str(dummy_role.id))          self.assertEqual(dummy_embed.fields[1].value, f"#{dummy_role.colour.value:0>6x}") @@ -91,7 +91,7 @@ class InformationCogTests(unittest.IsolatedAsyncioTestCase):          self.assertEqual(dummy_embed.fields[5].value, "0")          self.assertEqual(admin_embed.title, "Admins info") -        self.assertEqual(admin_embed.colour, disnake.Colour.red()) +        self.assertEqual(admin_embed.colour, discord.Colour.red())  class UserInfractionHelperMethodTests(unittest.IsolatedAsyncioTestCase): @@ -449,7 +449,7 @@ class UserEmbedTests(unittest.IsolatedAsyncioTestCase):          user.created_at = user.joined_at = datetime.utcnow()          embed = await self.cog.create_user_embed(ctx, user, False) -        self.assertEqual(embed.colour, disnake.Colour(100)) +        self.assertEqual(embed.colour, discord.Colour(100))      @unittest.mock.patch(          f"{COG_PATH}.basic_user_infraction_counts", @@ -463,11 +463,11 @@ class UserEmbedTests(unittest.IsolatedAsyncioTestCase):          """The embed should be created with the og blurple colour if the user has no assigned roles."""          ctx = helpers.MockContext() -        user = helpers.MockMember(id=217, colour=disnake.Colour.default()) +        user = helpers.MockMember(id=217, colour=discord.Colour.default())          user.created_at = user.joined_at = datetime.utcnow()          embed = await self.cog.create_user_embed(ctx, user, False) -        self.assertEqual(embed.colour, disnake.Colour.og_blurple()) +        self.assertEqual(embed.colour, discord.Colour.og_blurple())      @unittest.mock.patch(          f"{COG_PATH}.basic_user_infraction_counts", diff --git a/tests/bot/exts/moderation/infraction/test_infractions.py b/tests/bot/exts/moderation/infraction/test_infractions.py index b85d086c9..052048053 100644 --- a/tests/bot/exts/moderation/infraction/test_infractions.py +++ b/tests/bot/exts/moderation/infraction/test_infractions.py @@ -3,7 +3,7 @@ import textwrap  import unittest  from unittest.mock import ANY, AsyncMock, DEFAULT, MagicMock, Mock, patch -from disnake.errors import NotFound +from discord.errors import NotFound  from bot.constants import Event  from bot.exts.moderation.clean import Clean diff --git a/tests/bot/exts/moderation/infraction/test_utils.py b/tests/bot/exts/moderation/infraction/test_utils.py index eaa0e701e..ff81ddd65 100644 --- a/tests/bot/exts/moderation/infraction/test_utils.py +++ b/tests/bot/exts/moderation/infraction/test_utils.py @@ -3,7 +3,7 @@ from collections import namedtuple  from datetime import datetime  from unittest.mock import AsyncMock, MagicMock, call, patch -from disnake import Embed, Forbidden, HTTPException, NotFound +from discord import Embed, Forbidden, HTTPException, NotFound  from bot.api import ResponseCodeError  from bot.constants import Colours, Icons diff --git a/tests/bot/exts/moderation/test_incidents.py b/tests/bot/exts/moderation/test_incidents.py index 725455bbe..cfe0c4b03 100644 --- a/tests/bot/exts/moderation/test_incidents.py +++ b/tests/bot/exts/moderation/test_incidents.py @@ -7,7 +7,7 @@ from unittest import mock  from unittest.mock import AsyncMock, MagicMock, Mock, call, patch  import aiohttp -import disnake +import discord  from async_rediscache import RedisSession  from bot.constants import Colours @@ -24,7 +24,7 @@ class MockAsyncIterable:      Helper for mocking asynchronous for loops.      It does not appear that the `unittest` library currently provides anything that would -    allow us to simply mock an async iterator, such as `disnake.TextChannel.history`. +    allow us to simply mock an async iterator, such as `discord.TextChannel.history`.      We therefore write our own helper to wrap a regular synchronous iterable, and feed      its values via `__anext__` rather than `__next__`. @@ -60,7 +60,7 @@ class MockSignal(enum.Enum):      B = "B" -mock_404 = disnake.NotFound( +mock_404 = discord.NotFound(      response=MagicMock(aiohttp.ClientResponse),  # Mock the erroneous response      message="Not found",  ) @@ -70,8 +70,8 @@ class TestDownloadFile(unittest.IsolatedAsyncioTestCase):      """Collection of tests for the `download_file` helper function."""      async def test_download_file_success(self): -        """If `to_file` succeeds, function returns the acquired `disnake.File`.""" -        file = MagicMock(disnake.File, filename="bigbadlemon.jpg") +        """If `to_file` succeeds, function returns the acquired `discord.File`.""" +        file = MagicMock(discord.File, filename="bigbadlemon.jpg")          attachment = MockAttachment(to_file=AsyncMock(return_value=file))          acquired_file = await incidents.download_file(attachment) @@ -86,7 +86,7 @@ class TestDownloadFile(unittest.IsolatedAsyncioTestCase):      async def test_download_file_fail(self):          """If `to_file` fails on a non-404 error, function logs the exception & returns None.""" -        arbitrary_error = disnake.HTTPException(MagicMock(aiohttp.ClientResponse), "Arbitrary API error") +        arbitrary_error = discord.HTTPException(MagicMock(aiohttp.ClientResponse), "Arbitrary API error")          attachment = MockAttachment(to_file=AsyncMock(side_effect=arbitrary_error))          with self.assertLogs(logger=incidents.log, level=logging.ERROR): @@ -121,7 +121,7 @@ class TestMakeEmbed(unittest.IsolatedAsyncioTestCase):      async def test_make_embed_with_attachment_succeeds(self):          """Incident's attachment is downloaded and displayed in the embed's image field.""" -        file = MagicMock(disnake.File, filename="bigbadjoe.jpg") +        file = MagicMock(discord.File, filename="bigbadjoe.jpg")          attachment = MockAttachment(filename="bigbadjoe.jpg")          incident = MockMessage(content="this is an incident", attachments=[attachment]) @@ -394,7 +394,7 @@ class TestArchive(TestIncidents):              author=MockUser(name="author_name", display_avatar=Mock(url="author_avatar")),              id=123,          ) -        built_embed = MagicMock(disnake.Embed, id=123)  # We patch `make_embed` to return this +        built_embed = MagicMock(discord.Embed, id=123)  # We patch `make_embed` to return this          with patch("bot.exts.moderation.incidents.make_embed", AsyncMock(return_value=(built_embed, None))):              archive_return = await self.cog_instance.archive(incident, MagicMock(value="A"), MockMember()) @@ -616,7 +616,7 @@ class TestResolveMessage(TestIncidents):          """          self.cog_instance.bot._connection._get_message = MagicMock(return_value=None)  # Cache returns None -        arbitrary_error = disnake.HTTPException( +        arbitrary_error = discord.HTTPException(              response=MagicMock(aiohttp.ClientResponse),              message="Arbitrary error",          ) @@ -649,7 +649,7 @@ class TestOnRawReactionAdd(TestIncidents):          super().setUp()  # Ensure `cog_instance` is assigned          self.payload = MagicMock( -            disnake.RawReactionActionEvent, +            discord.RawReactionActionEvent,              channel_id=123,  # Patched at class level              message_id=456,              member=MockMember(bot=False), diff --git a/tests/bot/exts/moderation/test_modlog.py b/tests/bot/exts/moderation/test_modlog.py index 6c9ebed95..79e04837d 100644 --- a/tests/bot/exts/moderation/test_modlog.py +++ b/tests/bot/exts/moderation/test_modlog.py @@ -1,6 +1,6 @@  import unittest -import disnake +import discord  from bot.exts.moderation.modlog import ModLog  from tests.helpers import MockBot, MockTextChannel @@ -19,7 +19,7 @@ class ModLogTests(unittest.IsolatedAsyncioTestCase):          self.bot.get_channel.return_value = self.channel          await self.cog.send_log_message(              icon_url="foo", -            colour=disnake.Colour.blue(), +            colour=discord.Colour.blue(),              title="bar",              text="foo bar" * 3000          ) diff --git a/tests/bot/exts/moderation/test_silence.py b/tests/bot/exts/moderation/test_silence.py index 539651d6c..92ce3418a 100644 --- a/tests/bot/exts/moderation/test_silence.py +++ b/tests/bot/exts/moderation/test_silence.py @@ -7,7 +7,7 @@ from unittest import mock  from unittest.mock import AsyncMock, Mock  from async_rediscache import RedisSession -from disnake import PermissionOverwrite +from discord import PermissionOverwrite  from bot.constants import Channels, Guild, MODERATION_ROLES, Roles  from bot.exts.moderation import silence @@ -152,7 +152,7 @@ class SilenceCogTests(unittest.IsolatedAsyncioTestCase):          # It's too annoying to test cancel_all since it's a done callback and wrapped in a lambda.          self.assertTrue(self.cog._init_task.cancelled()) -    @autospec("disnake.ext.commands", "has_any_role") +    @autospec("discord.ext.commands", "has_any_role")      @mock.patch.object(silence.constants, "MODERATION_ROLES", new=(1, 2, 3))      async def test_cog_check(self, role_check):          """Role check was called with `MODERATION_ROLES`""" diff --git a/tests/bot/exts/test_cogs.py b/tests/bot/exts/test_cogs.py index 5cb071d58..f8e120262 100644 --- a/tests/bot/exts/test_cogs.py +++ b/tests/bot/exts/test_cogs.py @@ -8,7 +8,7 @@ from collections import defaultdict  from types import ModuleType  from unittest import mock -from disnake.ext import commands +from discord.ext import commands  from bot import exts @@ -34,7 +34,7 @@ class CommandNameTests(unittest.TestCase):              raise ImportError(name=name)  # pragma: no cover          # The mock prevents asyncio.get_event_loop() from being called. -        with mock.patch("disnake.ext.tasks.loop"): +        with mock.patch("discord.ext.tasks.loop"):              prefix = f"{exts.__name__}."              for module in pkgutil.walk_packages(exts.__path__, prefix, onerror=on_error):                  if not module.ispkg: diff --git a/tests/bot/exts/utils/test_snekbox.py b/tests/bot/exts/utils/test_snekbox.py index bec7574fb..8bdeedd27 100644 --- a/tests/bot/exts/utils/test_snekbox.py +++ b/tests/bot/exts/utils/test_snekbox.py @@ -2,8 +2,8 @@ import asyncio  import unittest  from unittest.mock import AsyncMock, MagicMock, Mock, call, create_autospec, patch -from disnake import AllowedMentions -from disnake.ext import commands +from discord import AllowedMentions +from discord.ext import commands  from bot import constants  from bot.exts.utils import snekbox diff --git a/tests/bot/test_converters.py b/tests/bot/test_converters.py index afb8a973d..1bb678db2 100644 --- a/tests/bot/test_converters.py +++ b/tests/bot/test_converters.py @@ -4,7 +4,7 @@ from datetime import MAXYEAR, datetime, timezone  from unittest.mock import MagicMock, patch  from dateutil.relativedelta import relativedelta -from disnake.ext.commands import BadArgument +from discord.ext.commands import BadArgument  from bot.converters import Duration, HushDurationConverter, ISODateTime, PackageName diff --git a/tests/bot/utils/test_checks.py b/tests/bot/utils/test_checks.py index 5675e10ec..4ae11d5d3 100644 --- a/tests/bot/utils/test_checks.py +++ b/tests/bot/utils/test_checks.py @@ -1,7 +1,7 @@  import unittest  from unittest.mock import MagicMock -from disnake import DMChannel +from discord import DMChannel  from bot.utils import checks  from bot.utils.checks import InWhitelistCheckFailure diff --git a/tests/helpers.py b/tests/helpers.py index bd1418ab9..9d4988d23 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -7,9 +7,9 @@ import unittest.mock  from asyncio import AbstractEventLoop  from typing import Iterable, Optional -import disnake +import discord  from aiohttp import ClientSession -from disnake.ext.commands import Context +from discord.ext.commands import Context  from bot.api import APIClient  from bot.async_stats import AsyncStatsClient @@ -26,11 +26,11 @@ for logger in logging.Logger.manager.loggerDict.values():      logger.setLevel(logging.CRITICAL) -class HashableMixin(disnake.mixins.EqualityComparable): +class HashableMixin(discord.mixins.EqualityComparable):      """ -    Mixin that provides similar hashing and equality functionality as disnake's `Hashable` mixin. +    Mixin that provides similar hashing and equality functionality as discord.py's `Hashable` mixin. -    Note: disnake`s `Hashable` mixin bit-shifts `self.id` (`>> 22`); to prevent hash-collisions +    Note: discord.py`s `Hashable` mixin bit-shifts `self.id` (`>> 22`); to prevent hash-collisions      for the relative small `id` integers we generally use in tests, this bit-shift is omitted.      """ @@ -39,22 +39,22 @@ class HashableMixin(disnake.mixins.EqualityComparable):  class ColourMixin: -    """A mixin for Mocks that provides the aliasing of (accent_)color->(accent_)colour like disnake does.""" +    """A mixin for Mocks that provides the aliasing of (accent_)color->(accent_)colour like discord.py does."""      @property -    def color(self) -> disnake.Colour: +    def color(self) -> discord.Colour:          return self.colour      @color.setter -    def color(self, color: disnake.Colour) -> None: +    def color(self, color: discord.Colour) -> None:          self.colour = color      @property -    def accent_color(self) -> disnake.Colour: +    def accent_color(self) -> discord.Colour:          return self.accent_colour      @accent_color.setter -    def accent_color(self, color: disnake.Colour) -> None: +    def accent_color(self, color: discord.Colour) -> None:          self.accent_colour = color @@ -63,7 +63,7 @@ class CustomMockMixin:      Provides common functionality for our custom Mock types.      The `_get_child_mock` method automatically returns an AsyncMock for coroutine methods of the mock -    object. As disnake also uses synchronous methods that nonetheless return coroutine objects, the +    object. As discord.py also uses synchronous methods that nonetheless return coroutine objects, the      class attribute `additional_spec_asyncs` can be overwritten with an iterable containing additional      attribute names that should also mocked with an AsyncMock instead of a regular MagicMock/Mock. The      class method `spec_set` can be overwritten with the object that should be uses as the specification @@ -119,7 +119,7 @@ class CustomMockMixin:          return klass(**kw) -# Create a guild instance to get a realistic Mock of `disnake.Guild` +# Create a guild instance to get a realistic Mock of `discord.Guild`  guild_data = {      'id': 1,      'name': 'guild', @@ -139,20 +139,20 @@ guild_data = {      'owner_id': 1,      'afk_channel_id': 464033278631084042,  } -guild_instance = disnake.Guild(data=guild_data, state=unittest.mock.MagicMock()) +guild_instance = discord.Guild(data=guild_data, state=unittest.mock.MagicMock())  class MockGuild(CustomMockMixin, unittest.mock.Mock, HashableMixin):      """ -    A `Mock` subclass to mock `disnake.Guild` objects. +    A `Mock` subclass to mock `discord.Guild` objects. -    A MockGuild instance will follow the specifications of a `disnake.Guild` instance. This means +    A MockGuild instance will follow the specifications of a `discord.Guild` instance. This means      that if the code you're testing tries to access an attribute or method that normally does not -    exist for a `disnake.Guild` object this will raise an `AttributeError`. This is to make sure our -    tests fail if the code we're testing uses a `disnake.Guild` object in the wrong way. +    exist for a `discord.Guild` object this will raise an `AttributeError`. This is to make sure our +    tests fail if the code we're testing uses a `discord.Guild` object in the wrong way.      One restriction of that is that if the code tries to access an attribute that normally does not -    exist for `disnake.Guild` instance but was added dynamically, this will raise an exception with +    exist for `discord.Guild` instance but was added dynamically, this will raise an exception with      the mocked object. To get around that, you can set the non-standard attribute explicitly for the      instance of `MockGuild`: @@ -160,10 +160,10 @@ class MockGuild(CustomMockMixin, unittest.mock.Mock, HashableMixin):      >>> guild.attribute_that_normally_does_not_exist = unittest.mock.MagicMock()      In addition to attribute simulation, mocked guild object will pass an `isinstance` check against -    `disnake.Guild`: +    `discord.Guild`:      >>> guild = MockGuild() -    >>> isinstance(guild, disnake.Guild) +    >>> isinstance(guild, discord.Guild)      True      For more info, see the `Mocking` section in `tests/README.md`. @@ -179,16 +179,16 @@ class MockGuild(CustomMockMixin, unittest.mock.Mock, HashableMixin):              self.roles.extend(roles) -# Create a Role instance to get a realistic Mock of `disnake.Role` +# Create a Role instance to get a realistic Mock of `discord.Role`  role_data = {'name': 'role', 'id': 1} -role_instance = disnake.Role(guild=guild_instance, state=unittest.mock.MagicMock(), data=role_data) +role_instance = discord.Role(guild=guild_instance, state=unittest.mock.MagicMock(), data=role_data)  class MockRole(CustomMockMixin, unittest.mock.Mock, ColourMixin, HashableMixin):      """ -    A Mock subclass to mock `disnake.Role` objects. +    A Mock subclass to mock `discord.Role` objects. -    Instances of this class will follow the specifications of `disnake.Role` instances. For more +    Instances of this class will follow the specifications of `discord.Role` instances. For more      information, see the `MockGuild` docstring.      """      spec_set = role_instance @@ -198,40 +198,40 @@ class MockRole(CustomMockMixin, unittest.mock.Mock, ColourMixin, HashableMixin):              'id': next(self.discord_id),              'name': 'role',              'position': 1, -            'colour': disnake.Colour(0xdeadbf), -            'permissions': disnake.Permissions(), +            'colour': discord.Colour(0xdeadbf), +            'permissions': discord.Permissions(),          }          super().__init__(**collections.ChainMap(kwargs, default_kwargs))          if isinstance(self.colour, int): -            self.colour = disnake.Colour(self.colour) +            self.colour = discord.Colour(self.colour)          if isinstance(self.permissions, int): -            self.permissions = disnake.Permissions(self.permissions) +            self.permissions = discord.Permissions(self.permissions)          if 'mention' not in kwargs:              self.mention = f'&{self.name}'      def __lt__(self, other): -        """Simplified position-based comparisons similar to those of `disnake.Role`.""" +        """Simplified position-based comparisons similar to those of `discord.Role`."""          return self.position < other.position      def __ge__(self, other): -        """Simplified position-based comparisons similar to those of `disnake.Role`.""" +        """Simplified position-based comparisons similar to those of `discord.Role`."""          return self.position >= other.position -# Create a Member instance to get a realistic Mock of `disnake.Member` +# Create a Member instance to get a realistic Mock of `discord.Member`  member_data = {'user': 'lemon', 'roles': [1]}  state_mock = unittest.mock.MagicMock() -member_instance = disnake.Member(data=member_data, guild=guild_instance, state=state_mock) +member_instance = discord.Member(data=member_data, guild=guild_instance, state=state_mock)  class MockMember(CustomMockMixin, unittest.mock.Mock, ColourMixin, HashableMixin):      """      A Mock subclass to mock Member objects. -    Instances of this class will follow the specifications of `disnake.Member` instances. For more +    Instances of this class will follow the specifications of `discord.Member` instances. For more      information, see the `MockGuild` docstring.      """      spec_set = member_instance @@ -249,11 +249,11 @@ class MockMember(CustomMockMixin, unittest.mock.Mock, ColourMixin, HashableMixin              self.mention = f"@{self.name}" -# Create a User instance to get a realistic Mock of `disnake.User` +# Create a User instance to get a realistic Mock of `discord.User`  _user_data_mock = collections.defaultdict(unittest.mock.MagicMock, {      "accent_color": 0  }) -user_instance = disnake.User( +user_instance = discord.User(      data=unittest.mock.MagicMock(get=unittest.mock.Mock(side_effect=_user_data_mock.get)),      state=unittest.mock.MagicMock()  ) @@ -263,7 +263,7 @@ class MockUser(CustomMockMixin, unittest.mock.Mock, ColourMixin, HashableMixin):      """      A Mock subclass to mock User objects. -    Instances of this class will follow the specifications of `disnake.User` instances. For more +    Instances of this class will follow the specifications of `discord.User` instances. For more      information, see the `MockGuild` docstring.      """      spec_set = user_instance @@ -305,7 +305,7 @@ class MockBot(CustomMockMixin, unittest.mock.MagicMock):      """      A MagicMock subclass to mock Bot objects. -    Instances of this class will follow the specifications of `disnake.ext.commands.Bot` instances. +    Instances of this class will follow the specifications of `discord.ext.commands.Bot` instances.      For more information, see the `MockGuild` docstring.      """      spec_set = Bot( @@ -324,7 +324,7 @@ class MockBot(CustomMockMixin, unittest.mock.MagicMock):          self.stats = unittest.mock.create_autospec(spec=AsyncStatsClient, spec_set=True) -# Create a TextChannel instance to get a realistic MagicMock of `disnake.TextChannel` +# Create a TextChannel instance to get a realistic MagicMock of `discord.TextChannel`  channel_data = {      'id': 1,      'type': 'TextChannel', @@ -337,17 +337,17 @@ channel_data = {  }  state = unittest.mock.MagicMock()  guild = unittest.mock.MagicMock() -text_channel_instance = disnake.TextChannel(state=state, guild=guild, data=channel_data) +text_channel_instance = discord.TextChannel(state=state, guild=guild, data=channel_data)  channel_data["type"] = "VoiceChannel" -voice_channel_instance = disnake.VoiceChannel(state=state, guild=guild, data=channel_data) +voice_channel_instance = discord.VoiceChannel(state=state, guild=guild, data=channel_data)  class MockTextChannel(CustomMockMixin, unittest.mock.Mock, HashableMixin):      """      A MagicMock subclass to mock TextChannel objects. -    Instances of this class will follow the specifications of `disnake.TextChannel` instances. For +    Instances of this class will follow the specifications of `discord.TextChannel` instances. For      more information, see the `MockGuild` docstring.      """      spec_set = text_channel_instance @@ -364,7 +364,7 @@ class MockVoiceChannel(CustomMockMixin, unittest.mock.Mock, HashableMixin):      """      A MagicMock subclass to mock VoiceChannel objects. -    Instances of this class will follow the specifications of `disnake.VoiceChannel` instances. For +    Instances of this class will follow the specifications of `discord.VoiceChannel` instances. For      more information, see the `MockGuild` docstring.      """      spec_set = voice_channel_instance @@ -381,14 +381,14 @@ class MockVoiceChannel(CustomMockMixin, unittest.mock.Mock, HashableMixin):  state = unittest.mock.MagicMock()  me = unittest.mock.MagicMock()  dm_channel_data = {"id": 1, "recipients": [unittest.mock.MagicMock()]} -dm_channel_instance = disnake.DMChannel(me=me, state=state, data=dm_channel_data) +dm_channel_instance = discord.DMChannel(me=me, state=state, data=dm_channel_data)  class MockDMChannel(CustomMockMixin, unittest.mock.Mock, HashableMixin):      """      A MagicMock subclass to mock TextChannel objects. -    Instances of this class will follow the specifications of `disnake.TextChannel` instances. For +    Instances of this class will follow the specifications of `discord.TextChannel` instances. For      more information, see the `MockGuild` docstring.      """      spec_set = dm_channel_instance @@ -398,17 +398,17 @@ class MockDMChannel(CustomMockMixin, unittest.mock.Mock, HashableMixin):          super().__init__(**collections.ChainMap(kwargs, default_kwargs)) -# Create CategoryChannel instance to get a realistic MagicMock of `disnake.CategoryChannel` +# Create CategoryChannel instance to get a realistic MagicMock of `discord.CategoryChannel`  category_channel_data = {      'id': 1, -    'type': disnake.ChannelType.category, +    'type': discord.ChannelType.category,      'name': 'category',      'position': 1,  }  state = unittest.mock.MagicMock()  guild = unittest.mock.MagicMock() -category_channel_instance = disnake.CategoryChannel( +category_channel_instance = discord.CategoryChannel(      state=state, guild=guild, data=category_channel_data  ) @@ -419,7 +419,7 @@ class MockCategoryChannel(CustomMockMixin, unittest.mock.Mock, HashableMixin):          super().__init__(**collections.ChainMap(default_kwargs, kwargs)) -# Create a Message instance to get a realistic MagicMock of `disnake.Message` +# Create a Message instance to get a realistic MagicMock of `discord.Message`  message_data = {      'id': 1,      'webhook_id': 431341013479718912, @@ -438,10 +438,10 @@ message_data = {  }  state = unittest.mock.MagicMock()  channel = unittest.mock.MagicMock() -message_instance = disnake.Message(state=state, channel=channel, data=message_data) +message_instance = discord.Message(state=state, channel=channel, data=message_data) -# Create a Context instance to get a realistic MagicMock of `disnake.ext.commands.Context` +# Create a Context instance to get a realistic MagicMock of `discord.ext.commands.Context`  context_instance = Context(      message=unittest.mock.MagicMock(),      prefix="$", @@ -455,7 +455,7 @@ class MockContext(CustomMockMixin, unittest.mock.MagicMock):      """      A MagicMock subclass to mock Context objects. -    Instances of this class will follow the specifications of `disnake.ext.commands.Context` +    Instances of this class will follow the specifications of `discord.ext.commands.Context`      instances. For more information, see the `MockGuild` docstring.      """      spec_set = context_instance @@ -471,14 +471,14 @@ class MockContext(CustomMockMixin, unittest.mock.MagicMock):          self.invoked_from_error_handler = kwargs.get('invoked_from_error_handler', False) -attachment_instance = disnake.Attachment(data=unittest.mock.MagicMock(id=1), state=unittest.mock.MagicMock()) +attachment_instance = discord.Attachment(data=unittest.mock.MagicMock(id=1), state=unittest.mock.MagicMock())  class MockAttachment(CustomMockMixin, unittest.mock.MagicMock):      """      A MagicMock subclass to mock Attachment objects. -    Instances of this class will follow the specifications of `disnake.Attachment` instances. For +    Instances of this class will follow the specifications of `discord.Attachment` instances. For      more information, see the `MockGuild` docstring.      """      spec_set = attachment_instance @@ -488,7 +488,7 @@ class MockMessage(CustomMockMixin, unittest.mock.MagicMock):      """      A MagicMock subclass to mock Message objects. -    Instances of this class will follow the specifications of `disnake.Message` instances. For more +    Instances of this class will follow the specifications of `discord.Message` instances. For more      information, see the `MockGuild` docstring.      """      spec_set = message_instance @@ -501,14 +501,14 @@ class MockMessage(CustomMockMixin, unittest.mock.MagicMock):  emoji_data = {'require_colons': True, 'managed': True, 'id': 1, 'name': 'hyperlemon'} -emoji_instance = disnake.Emoji(guild=MockGuild(), state=unittest.mock.MagicMock(), data=emoji_data) +emoji_instance = discord.Emoji(guild=MockGuild(), state=unittest.mock.MagicMock(), data=emoji_data)  class MockEmoji(CustomMockMixin, unittest.mock.MagicMock):      """      A MagicMock subclass to mock Emoji objects. -    Instances of this class will follow the specifications of `disnake.Emoji` instances. For more +    Instances of this class will follow the specifications of `discord.Emoji` instances. For more      information, see the `MockGuild` docstring.      """      spec_set = emoji_instance @@ -518,27 +518,27 @@ class MockEmoji(CustomMockMixin, unittest.mock.MagicMock):          self.guild = kwargs.get('guild', MockGuild()) -partial_emoji_instance = disnake.PartialEmoji(animated=False, name='guido') +partial_emoji_instance = discord.PartialEmoji(animated=False, name='guido')  class MockPartialEmoji(CustomMockMixin, unittest.mock.MagicMock):      """      A MagicMock subclass to mock PartialEmoji objects. -    Instances of this class will follow the specifications of `disnake.PartialEmoji` instances. For +    Instances of this class will follow the specifications of `discord.PartialEmoji` instances. For      more information, see the `MockGuild` docstring.      """      spec_set = partial_emoji_instance -reaction_instance = disnake.Reaction(message=MockMessage(), data={'me': True}, emoji=MockEmoji()) +reaction_instance = discord.Reaction(message=MockMessage(), data={'me': True}, emoji=MockEmoji())  class MockReaction(CustomMockMixin, unittest.mock.MagicMock):      """      A MagicMock subclass to mock Reaction objects. -    Instances of this class will follow the specifications of `disnake.Reaction` instances. For +    Instances of this class will follow the specifications of `discord.Reaction` instances. For      more information, see the `MockGuild` docstring.      """      spec_set = reaction_instance @@ -556,14 +556,14 @@ class MockReaction(CustomMockMixin, unittest.mock.MagicMock):          self.__str__.return_value = str(self.emoji) -webhook_instance = disnake.Webhook(data=unittest.mock.MagicMock(), session=unittest.mock.MagicMock()) +webhook_instance = discord.Webhook(data=unittest.mock.MagicMock(), session=unittest.mock.MagicMock())  class MockAsyncWebhook(CustomMockMixin, unittest.mock.MagicMock):      """      A MagicMock subclass to mock Webhook objects using an AsyncWebhookAdapter. -    Instances of this class will follow the specifications of `disnake.Webhook` instances. For +    Instances of this class will follow the specifications of `discord.Webhook` instances. For      more information, see the `MockGuild` docstring.      """      spec_set = webhook_instance diff --git a/tests/test_helpers.py b/tests/test_helpers.py index c5e799a85..81285e009 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -2,20 +2,20 @@ import asyncio  import unittest  import unittest.mock -import disnake +import discord  from tests import helpers  class DiscordMocksTests(unittest.TestCase): -    """Tests for our specialized disnake mocks.""" +    """Tests for our specialized discord.py mocks."""      def test_mock_role_default_initialization(self):          """Test if the default initialization of MockRole results in the correct object."""          role = helpers.MockRole() -        # The `spec` argument makes sure `isistance` checks with `disnake.Role` pass -        self.assertIsInstance(role, disnake.Role) +        # The `spec` argument makes sure `isistance` checks with `discord.Role` pass +        self.assertIsInstance(role, discord.Role)          self.assertEqual(role.name, "role")          self.assertEqual(role.position, 1) @@ -61,8 +61,8 @@ class DiscordMocksTests(unittest.TestCase):          """Test if the default initialization of Mockmember results in the correct object."""          member = helpers.MockMember() -        # The `spec` argument makes sure `isistance` checks with `disnake.Member` pass -        self.assertIsInstance(member, disnake.Member) +        # The `spec` argument makes sure `isistance` checks with `discord.Member` pass +        self.assertIsInstance(member, discord.Member)          self.assertEqual(member.name, "member")          self.assertListEqual(member.roles, [helpers.MockRole(name="@everyone", position=1, id=0)]) @@ -86,18 +86,18 @@ class DiscordMocksTests(unittest.TestCase):          """Test if MockMember accepts and sets abitrary keyword arguments."""          member = helpers.MockMember(              nick="Dino Man", -            colour=disnake.Colour.default(), +            colour=discord.Colour.default(),          )          self.assertEqual(member.nick, "Dino Man") -        self.assertEqual(member.colour, disnake.Colour.default()) +        self.assertEqual(member.colour, discord.Colour.default())      def test_mock_guild_default_initialization(self):          """Test if the default initialization of Mockguild results in the correct object."""          guild = helpers.MockGuild() -        # The `spec` argument makes sure `isistance` checks with `disnake.Guild` pass -        self.assertIsInstance(guild, disnake.Guild) +        # The `spec` argument makes sure `isistance` checks with `discord.Guild` pass +        self.assertIsInstance(guild, discord.Guild)          self.assertListEqual(guild.roles, [helpers.MockRole(name="@everyone", position=1, id=0)])          self.assertListEqual(guild.members, []) @@ -127,15 +127,15 @@ class DiscordMocksTests(unittest.TestCase):          """Tests if MockBot initializes with the correct values."""          bot = helpers.MockBot() -        # The `spec` argument makes sure `isistance` checks with `disnake.ext.commands.Bot` pass -        self.assertIsInstance(bot, disnake.ext.commands.Bot) +        # The `spec` argument makes sure `isistance` checks with `discord.ext.commands.Bot` pass +        self.assertIsInstance(bot, discord.ext.commands.Bot)      def test_mock_context_default_initialization(self):          """Tests if MockContext initializes with the correct values."""          context = helpers.MockContext() -        # The `spec` argument makes sure `isistance` checks with `disnake.ext.commands.Context` pass -        self.assertIsInstance(context, disnake.ext.commands.Context) +        # The `spec` argument makes sure `isistance` checks with `discord.ext.commands.Context` pass +        self.assertIsInstance(context, discord.ext.commands.Context)          self.assertIsInstance(context.bot, helpers.MockBot)          self.assertIsInstance(context.guild, helpers.MockGuild) | 
