def test_mock_guild_alternative_arguments(self):
        core_developer = helpers.MockRole(name="Core Developer", position=2)
        guild = helpers.MockGuild(
            roles=[core_developer],
            members=[helpers.MockMember(id=54321)],
        )

        self.assertListEqual(
            guild.roles,
            [helpers.MockRole(name="@everyone", position=1, id=0), core_developer],
        )
        self.assertListEqual(guild.members, [helpers.MockMember(id=54321)])
    def test_mock_member_accepts_dynamic_arguments(self):
        member = helpers.MockMember(
            nick="Dino Man",
            colour=discord.Colour.default(),
        )

        self.assertEqual(member.nick, "Dino Man")
        self.assertEqual(member.colour, discord.Colour.default())
    def test_mock_member_alternative_arguments(self):
        core_developer = helpers.MockRole(name="Core Developer", position=2)
        member = helpers.MockMember(name="Mark", id=12345, roles=[core_developer])

        self.assertEqual(member.name, "Mark")
        self.assertEqual(member.id, 12345)
        self.assertListEqual(
            member.roles,
            [helpers.MockRole(name="@everyone", position=1, id=0), core_developer],
        )
        self.assertEqual(member.mention, "@Mark")
    def test_mock_member_default_initialization(self):
        member = helpers.MockMember()

        # 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)]
        )
        self.assertEqual(member.mention, "@member")
    def test_mocks_rejects_access_to_attributes_not_part_of_spec(self):
        mocks = (
            helpers.MockGuild(),
            helpers.MockRole(),
            helpers.MockMember(),
            helpers.MockBot(),
            helpers.MockContext(),
            helpers.MockTextChannel(),
            helpers.MockMessage(),
        )

        for mock in mocks:
            with self.subTest(mock=mock), self.assertRaises(AttributeError):
                mock.the_cake_is_a_lie
    def test_mocks_allows_access_to_attributes_part_of_spec(self):
        mocks = (
            (helpers.MockGuild(), "name"),
            (helpers.MockRole(), "hoist"),
            (helpers.MockMember(), "display_name"),
            (helpers.MockBot(), "user"),
            (helpers.MockContext(), "invoked_with"),
            (helpers.MockTextChannel(), "last_message"),
            (helpers.MockMessage(), "mention_everyone"),
        )

        for mock, valid_attribute in mocks:
            with self.subTest(mock=mock):
                try:
                    getattr(mock, valid_attribute)
                except AttributeError:
                    msg = f"accessing valid attribute `{valid_attribute}` raised an AttributeError"
                    self.fail(msg)