aboutsummaryrefslogtreecommitdiffstats
path: root/tests/cogs/sync/test_roles.py
blob: 27ae27639d16ba1ab7cb53c63c1f1b45ec930f31 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import unittest

from bot.cogs.sync.syncers import Role, get_roles_for_sync


class GetRolesForSyncTests(unittest.TestCase):
    """Tests constructing the roles to synchronize with the site."""

    def test_get_roles_for_sync_empty_return_for_equal_roles(self):
        """No roles should be synced when no diff is found."""
        api_roles = {Role(id=41, name='name', colour=33, permissions=0x8, position=1)}
        guild_roles = {Role(id=41, name='name', colour=33, permissions=0x8, position=1)}

        self.assertEqual(
            get_roles_for_sync(guild_roles, api_roles),
            (set(), set(), set())
        )

    def test_get_roles_for_sync_returns_roles_to_update_with_non_id_diff(self):
        """Roles to be synced are returned when non-ID attributes differ."""
        api_roles = {Role(id=41, name='old name', colour=35, permissions=0x8, position=1)}
        guild_roles = {Role(id=41, name='new name', colour=33, permissions=0x8, position=2)}

        self.assertEqual(
            get_roles_for_sync(guild_roles, api_roles),
            (set(), guild_roles, set())
        )

    def test_get_roles_only_returns_roles_that_require_update(self):
        """Roles that require an update should be returned as the second tuple element."""
        api_roles = {
            Role(id=41, name='old name', colour=33, permissions=0x8, position=1),
            Role(id=53, name='other role', colour=55, permissions=0, position=3)
        }
        guild_roles = {
            Role(id=41, name='new name', colour=35, permissions=0x8, position=2),
            Role(id=53, name='other role', colour=55, permissions=0, position=3)
        }

        self.assertEqual(
            get_roles_for_sync(guild_roles, api_roles),
            (
                set(),
                {Role(id=41, name='new name', colour=35, permissions=0x8, position=2)},
                set(),
            )
        )

    def test_get_roles_returns_new_roles_in_first_tuple_element(self):
        """Newly created roles are returned as the first tuple element."""
        api_roles = {
            Role(id=41, name='name', colour=35, permissions=0x8, position=1),
        }
        guild_roles = {
            Role(id=41, name='name', colour=35, permissions=0x8, position=1),
            Role(id=53, name='other role', colour=55, permissions=0, position=2)
        }

        self.assertEqual(
            get_roles_for_sync(guild_roles, api_roles),
            (
                {Role(id=53, name='other role', colour=55, permissions=0, position=2)},
                set(),
                set(),
            )
        )

    def test_get_roles_returns_roles_to_update_and_new_roles(self):
        """Newly created and updated roles should be returned together."""
        api_roles = {
            Role(id=41, name='old name', colour=35, permissions=0x8, position=1),
        }
        guild_roles = {
            Role(id=41, name='new name', colour=40, permissions=0x16, position=2),
            Role(id=53, name='other role', colour=55, permissions=0, position=3)
        }

        self.assertEqual(
            get_roles_for_sync(guild_roles, api_roles),
            (
                {Role(id=53, name='other role', colour=55, permissions=0, position=3)},
                {Role(id=41, name='new name', colour=40, permissions=0x16, position=2)},
                set(),
            )
        )

    def test_get_roles_returns_roles_to_delete(self):
        """Roles to be deleted should be returned as the third tuple element."""
        api_roles = {
            Role(id=41, name='name', colour=35, permissions=0x8, position=1),
            Role(id=61, name='to delete', colour=99, permissions=0x9, position=2),
        }
        guild_roles = {
            Role(id=41, name='name', colour=35, permissions=0x8, position=1),
        }

        self.assertEqual(
            get_roles_for_sync(guild_roles, api_roles),
            (
                set(),
                set(),
                {Role(id=61, name='to delete', colour=99, permissions=0x9, position=2)},
            )
        )

    def test_get_roles_returns_roles_to_delete_update_and_new_roles(self):
        """When roles were added, updated, and removed, all of them are returned properly."""
        api_roles = {
            Role(id=41, name='not changed', colour=35, permissions=0x8, position=1),
            Role(id=61, name='to delete', colour=99, permissions=0x9, position=2),
            Role(id=71, name='to update', colour=99, permissions=0x9, position=3),
        }
        guild_roles = {
            Role(id=41, name='not changed', colour=35, permissions=0x8, position=1),
            Role(id=81, name='to create', colour=99, permissions=0x9, position=4),
            Role(id=71, name='updated', colour=101, permissions=0x5, position=3),
        }

        self.assertEqual(
            get_roles_for_sync(guild_roles, api_roles),
            (
                {Role(id=81, name='to create', colour=99, permissions=0x9, position=4)},
                {Role(id=71, name='updated', colour=101, permissions=0x5, position=3)},
                {Role(id=61, name='to delete', colour=99, permissions=0x9, position=2)},
            )
        )