aboutsummaryrefslogtreecommitdiffstats
path: root/tests/base.py
diff options
context:
space:
mode:
authorGravatar Mark <[email protected]>2020-02-23 15:42:20 -0800
committerGravatar GitHub <[email protected]>2020-02-23 15:42:20 -0800
commitc81a4d401ea434e98b0a1ece51d3d10f1a3ad226 (patch)
tree1fe8caf0ae751cfe94a71fcf02ffbbfda5bd8812 /tests/base.py
parentMerge pull request #749 from python-discord/reminder-enhancements (diff)
parentMerge remote-tracking branch 'origin/master' into bug/backend/b704/ready-miss... (diff)
Merge pull request #711 from python-discord/bug/backend/b704/ready-missing-cache
Prevent the role syncer from wiping the database table during API latency
Diffstat (limited to 'tests/base.py')
-rw-r--r--tests/base.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/tests/base.py b/tests/base.py
index 029a249ed..88693f382 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -1,6 +1,12 @@
import logging
import unittest
from contextlib import contextmanager
+from typing import Dict
+
+import discord
+from discord.ext import commands
+
+from tests import helpers
class _CaptureLogHandler(logging.Handler):
@@ -65,3 +71,31 @@ class LoggingTestCase(unittest.TestCase):
standard_message = self._truncateMessage(base_message, record_message)
msg = self._formatMessage(msg, standard_message)
self.fail(msg)
+
+
+class CommandTestCase(unittest.TestCase):
+ """TestCase with additional assertions that are useful for testing Discord commands."""
+
+ @helpers.async_test
+ async def assertHasPermissionsCheck(
+ self,
+ cmd: commands.Command,
+ permissions: Dict[str, bool],
+ ) -> None:
+ """
+ Test that `cmd` raises a `MissingPermissions` exception if author lacks `permissions`.
+
+ Every permission in `permissions` is expected to be reported as missing. In other words, do
+ not include permissions which should not raise an exception along with those which should.
+ """
+ # Invert permission values because it's more intuitive to pass to this assertion the same
+ # permissions as those given to the check decorator.
+ permissions = {k: not v for k, v in permissions.items()}
+
+ ctx = helpers.MockContext()
+ ctx.channel.permissions_for.return_value = discord.Permissions(**permissions)
+
+ with self.assertRaises(commands.MissingPermissions) as cm:
+ await cmd.can_run(ctx)
+
+ self.assertCountEqual(permissions.keys(), cm.exception.missing_perms)