aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Sebastiaan Zeeff <[email protected]>2019-08-23 13:26:37 +0200
committerGravatar Sebastiaan Zeeff <[email protected]>2019-08-23 13:27:58 +0200
commit861f272ccf76abfe317b96827e4632b2657d5d69 (patch)
tree4b16184a4e8026cda2f5905a97e325219e24b261
parentFirst adding default value, then removing it to make it required. (diff)
Making the comparison operators for Role act like those for d.py Role objects
Diffstat (limited to '')
-rw-r--r--pydis_site/apps/api/models/bot/role.py15
-rw-r--r--pydis_site/apps/api/tests/test_roles.py42
2 files changed, 49 insertions, 8 deletions
diff --git a/pydis_site/apps/api/models/bot/role.py b/pydis_site/apps/api/models/bot/role.py
index 836d9f27..58bbf8b4 100644
--- a/pydis_site/apps/api/models/bot/role.py
+++ b/pydis_site/apps/api/models/bot/role.py
@@ -7,7 +7,12 @@ from pydis_site.apps.api.models.utils import ModelReprMixin
class Role(ModelReprMixin, models.Model):
- """A role on our Discord server."""
+ """
+ A role on our Discord server.
+
+ The comparison operators <, <=, >, >=, ==, != act the same as they do with Role-objects of the
+ discord.py library, see https://discordpy.readthedocs.io/en/latest/api.html#discord.Role
+ """
id = models.BigIntegerField(
primary_key=True,
@@ -49,10 +54,14 @@ class Role(ModelReprMixin, models.Model):
help_text="The position of the role in the role hierarchy of the Discord Guild."
)
- def __str__(self):
+ def __str__(self) -> str:
"""Returns the name of the current role, for display purposes."""
return self.name
- def __lt__(self, other: Role):
+ def __lt__(self, other: Role) -> bool:
"""Compares the roles based on their position in the role hierarchy of the guild."""
return self.position < other.position
+
+ def __le__(self, other: Role) -> bool:
+ """Compares the roles based on their position in the role hierarchy of the guild."""
+ return self.position <= other.position
diff --git a/pydis_site/apps/api/tests/test_roles.py b/pydis_site/apps/api/tests/test_roles.py
index 882083bb..0a6cea9e 100644
--- a/pydis_site/apps/api/tests/test_roles.py
+++ b/pydis_site/apps/api/tests/test_roles.py
@@ -28,6 +28,13 @@ class CreationTests(APISubdomainTestCase):
permissions=5,
position=0,
)
+ cls.lowest_position_duplicate = Role.objects.create(
+ id=6,
+ name="lowest position duplicate",
+ colour=6,
+ permissions=6,
+ position=0,
+ )
def _validate_roledict(self, role_dict: dict) -> None:
"""Helper method to validate a dict representing a role."""
@@ -36,24 +43,49 @@ class CreationTests(APISubdomainTestCase):
attributes = ('id', 'name', 'colour', 'permissions', 'position')
self.assertTrue(all(attribute in role_dict for attribute in attributes))
- def test_role_ordering(self):
+ def test_role_ordering_lt(self):
"""Tests the __lt__ comparisons based on role position in the hierarchy."""
self.assertTrue(self.everyone_role < self.developers_role)
self.assertFalse(self.developers_role > self.admins_role)
- top_role = max([self.developers_role, self.admins_role, self.everyone_role])
- self.assertIs(top_role, self.admins_role)
+ def test_role_ordering_le(self):
+ """Tests the __le__ comparisons based on role position in the hierarchy."""
+ self.assertTrue(self.everyone_role <= self.developers_role)
+ self.assertTrue(self.everyone_role <= self.lowest_position_duplicate)
+ self.assertTrue(self.everyone_role >= self.lowest_position_duplicate)
+ self.assertTrue(self.developers_role >= self.everyone_role)
+
+ self.assertFalse(self.developers_role >= self.admins_role)
+ self.assertFalse(self.developers_role <= self.everyone_role)
+
+ def test_role_min_max_ordering(self):
+ """Tests the `min` and `max` operations based on the role hierarchy."""
+ top_role_no_duplicates = max([self.developers_role, self.admins_role, self.everyone_role])
+ self.assertIs(top_role_no_duplicates, self.admins_role)
+
+ top_role_duplicates = max([self.developers_role, self.admins_role, self.admins_role])
+ self.assertIs(top_role_duplicates, self.admins_role)
+
+ bottom_role_no_duplicates = min(
+ [self.developers_role, self.admins_role, self.everyone_role]
+ )
+ self.assertIs(bottom_role_no_duplicates, self.everyone_role)
+
+ bottom_role_duplicates = min(
+ [self.lowest_position_duplicate, self.admins_role, self.everyone_role]
+ )
+ self.assertIs(bottom_role_duplicates, self.lowest_position_duplicate)
def test_role_list(self):
"""Tests the GET list-view and validates the contents."""
url = reverse('bot:role-list', host='api')
response = self.client.get(url)
- self.assertContains(response, text="id", count=3, status_code=200)
+ self.assertContains(response, text="id", count=4, status_code=200)
roles = response.json()
self.assertIsInstance(roles, list)
- self.assertEqual(len(roles), 3)
+ self.assertEqual(len(roles), 4)
for role in roles:
self._validate_roledict(role)