aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/bot/exts/backend/sync/test_users.py95
1 files changed, 75 insertions, 20 deletions
diff --git a/tests/bot/exts/backend/sync/test_users.py b/tests/bot/exts/backend/sync/test_users.py
index c0a1da35c..c3a486743 100644
--- a/tests/bot/exts/backend/sync/test_users.py
+++ b/tests/bot/exts/backend/sync/test_users.py
@@ -1,5 +1,4 @@
import unittest
-from unittest import mock
from bot.exts.backend.sync._syncers import UserSyncer, _Diff, _User
from tests import helpers
@@ -16,6 +15,16 @@ def fake_user(**kwargs):
return kwargs
+def fake_none_user(**kwargs):
+ kwargs.setdefault("id", None)
+ kwargs.setdefault("name", None)
+ kwargs.setdefault("discriminator", None)
+ kwargs.setdefault("roles", None)
+ kwargs.setdefault("in_guild", None)
+
+ return kwargs
+
+
class UserSyncerDiffTests(unittest.IsolatedAsyncioTestCase):
"""Tests for determining differences between users in the DB and users in the Guild cache."""
@@ -42,6 +51,12 @@ class UserSyncerDiffTests(unittest.IsolatedAsyncioTestCase):
async def test_empty_diff_for_no_users(self):
"""When no users are given, an empty diff should be returned."""
+ self.bot.api_client.get.return_value = {
+ "count": 3,
+ "next": None,
+ "previous": None,
+ "results": []
+ }
guild = self.get_guild()
actual_diff = await self.syncer._get_diff(guild)
@@ -51,7 +66,12 @@ class UserSyncerDiffTests(unittest.IsolatedAsyncioTestCase):
async def test_empty_diff_for_identical_users(self):
"""No differences should be found if the users in the guild and DB are identical."""
- self.bot.api_client.get.return_value = [fake_user()]
+ self.bot.api_client.get.return_value = {
+ "count": 3,
+ "next": None,
+ "previous": None,
+ "results": [fake_user()]
+ }
guild = self.get_guild(fake_user())
actual_diff = await self.syncer._get_diff(guild)
@@ -62,12 +82,18 @@ class UserSyncerDiffTests(unittest.IsolatedAsyncioTestCase):
async def test_diff_for_updated_users(self):
"""Only updated users should be added to the 'updated' set of the diff."""
updated_user = fake_user(id=99, name="new")
-
- self.bot.api_client.get.return_value = [fake_user(id=99, name="old"), fake_user()]
+ updated_user_none = fake_none_user(id=99, name="new")
+
+ self.bot.api_client.get.return_value = {
+ "count": 3,
+ "next": None,
+ "previous": None,
+ "results": [fake_user(id=99, name="old"), fake_user()]
+ }
guild = self.get_guild(updated_user, fake_user())
actual_diff = await self.syncer._get_diff(guild)
- expected_diff = (set(), {_User(**updated_user)}, None)
+ expected_diff = (set(), {_User(**updated_user_none)}, None)
self.assertEqual(actual_diff, expected_diff)
@@ -75,7 +101,12 @@ class UserSyncerDiffTests(unittest.IsolatedAsyncioTestCase):
"""Only new users should be added to the 'created' set of the diff."""
new_user = fake_user(id=99, name="new")
- self.bot.api_client.get.return_value = [fake_user()]
+ self.bot.api_client.get.return_value = {
+ "count": 3,
+ "next": None,
+ "previous": None,
+ "results": [fake_user()]
+ }
guild = self.get_guild(fake_user(), new_user)
actual_diff = await self.syncer._get_diff(guild)
@@ -85,33 +116,58 @@ class UserSyncerDiffTests(unittest.IsolatedAsyncioTestCase):
async def test_diff_sets_in_guild_false_for_leaving_users(self):
"""When a user leaves the guild, the `in_guild` flag is updated to `False`."""
- leaving_user = fake_user(id=63, in_guild=False)
-
- self.bot.api_client.get.return_value = [fake_user(), fake_user(id=63)]
+ leaving_user_none = fake_none_user(id=63, in_guild=False)
+
+ self.bot.api_client.get.return_value = {
+ "count": 3,
+ "next": None,
+ "previous": None,
+ "results": [fake_user(), fake_user(id=63)]
+ }
guild = self.get_guild(fake_user())
actual_diff = await self.syncer._get_diff(guild)
- expected_diff = (set(), {_User(**leaving_user)}, None)
+ expected_diff = (set(), {_User(**leaving_user_none)}, None)
self.assertEqual(actual_diff, expected_diff)
async def test_diff_for_new_updated_and_leaving_users(self):
"""When users are added, updated, and removed, all of them are returned properly."""
new_user = fake_user(id=99, name="new")
+
updated_user = fake_user(id=55, name="updated")
- leaving_user = fake_user(id=63, in_guild=False)
+ updated_user_none = fake_none_user(id=55, name="updated")
+
+ leaving_user_none = fake_none_user(id=63, in_guild=False)
- self.bot.api_client.get.return_value = [fake_user(), fake_user(id=55), fake_user(id=63)]
+ self.bot.api_client.get.return_value = {
+ "count": 3,
+ "next": None,
+ "previous": None,
+ "results": [fake_user(), fake_user(id=55), fake_user(id=63)]
+ }
guild = self.get_guild(fake_user(), new_user, updated_user)
actual_diff = await self.syncer._get_diff(guild)
- expected_diff = ({_User(**new_user)}, {_User(**updated_user), _User(**leaving_user)}, None)
+ expected_diff = (
+ {_User(**new_user)},
+ {
+ _User(**updated_user_none),
+ _User(**leaving_user_none)
+ },
+ None
+ )
self.assertEqual(actual_diff, expected_diff)
async def test_empty_diff_for_db_users_not_in_guild(self):
"""When the DB knows a user the guild doesn't, no difference is found."""
- self.bot.api_client.get.return_value = [fake_user(), fake_user(id=63, in_guild=False)]
+ self.bot.api_client.get.return_value = {
+ "count": 3,
+ "next": None,
+ "previous": None,
+ "results": [fake_user(), fake_user(id=63, in_guild=False)]
+ }
guild = self.get_guild(fake_user())
actual_diff = await self.syncer._get_diff(guild)
@@ -135,9 +191,9 @@ class UserSyncerSyncTests(unittest.IsolatedAsyncioTestCase):
diff = _Diff(user_tuples, set(), None)
await self.syncer._sync(diff)
- calls = [mock.call("bot/users", json=user) for user in users]
- self.bot.api_client.post.assert_has_calls(calls, any_order=True)
- self.assertEqual(self.bot.api_client.post.call_count, len(users))
+ # Convert namedtuples to dicts as done in self.syncer._sync method.
+ created = [user._asdict() for user in diff.created]
+ self.bot.api_client.post.assert_called_once_with("bot/users", json=created)
self.bot.api_client.put.assert_not_called()
self.bot.api_client.delete.assert_not_called()
@@ -150,9 +206,8 @@ class UserSyncerSyncTests(unittest.IsolatedAsyncioTestCase):
diff = _Diff(set(), user_tuples, None)
await self.syncer._sync(diff)
- calls = [mock.call(f"bot/users/{user['id']}", json=user) for user in users]
- self.bot.api_client.put.assert_has_calls(calls, any_order=True)
- self.assertEqual(self.bot.api_client.put.call_count, len(users))
+ updated = [self.syncer.patch_dict(user) for user in diff.updated]
+ self.bot.api_client.patch.assert_called_once_with("bot/users/bulk_patch", json=updated)
self.bot.api_client.post.assert_not_called()
self.bot.api_client.delete.assert_not_called()