Exemplo n.º 1
0
class TestAsh(unittest.IsolatedAsyncioTestCase):
    """
    Used to test the ASH object (AntiSpamHandler)
    """
    async def asyncSetUp(self):
        """
        Simply setup our Ash obj before usage
        """
        self.ash = AntiSpamHandler(get_mocked_bot(name="bot", id=98987))
        self.ash.guilds = Guild(None, 12, Static.DEFAULTS)
        self.ash.guilds = Guild(None, 15, Static.DEFAULTS)

    async def test_defaults(self):
        self.assertEqual(self.ash.options, Static.DEFAULTS)

    async def test_properties(self):
        with self.assertRaises(ValueError):
            self.ash.guilds = "1"

        with self.assertRaises(DuplicateObject):
            self.ash.guilds = Guild(None, 15, Static.DEFAULTS)

    @unittest.skip
    async def test_verboseType(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            verbose_level="x")

        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              verbose_level=logging.INFO)
        self.assertIsNotNone(ash)

    @unittest.skip
    async def test_verboseLevelRange(self):
        with self.assertRaises(ValueError,
                               msg="Invalid verbose level (To low)"):
            AntiSpamHandler(commands.Bot(command_prefix="!"), verbose_level=-1)

        with self.assertRaises(ValueError,
                               msg="Invalid verbose level (To high)"):
            AntiSpamHandler(commands.Bot(command_prefix="!"), verbose_level=6)

    @unittest.skip
    async def test_verboseAssignment(self):
        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              verbose_level=logging.NOTSET)
        self.assertEqual(ash.logger.level, 0)

        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              verbose_level=logging.DEBUG)
        self.assertEqual(ash.logger.level, 10)

        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              verbose_level=logging.INFO)
        self.assertEqual(ash.logger.level, 20)

        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              verbose_level=logging.WARNING)
        self.assertEqual(ash.logger.level, 30)

        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              verbose_level=logging.ERROR)
        self.assertEqual(ash.logger.level, 40)

        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              verbose_level=logging.CRITICAL)
        self.assertEqual(ash.logger.level, 50)

    async def test_messageAccuracyType(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy="x")

    async def test_messageAccuracyRange(self):
        with self.assertRaises(
                ValueError, msg="Invalid message_duplicate_accuracy (To low)"):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy=0)

        with self.assertRaises(
                ValueError,
                msg="Invalid message_duplicate_accuracy (To high)"):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy=101)

    async def test_messageAccuracyAssignment(self):
        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              message_duplicate_accuracy=50)
        self.assertEqual(ash.options["message_duplicate_accuracy"], 50)

    async def test_botAssignment(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(None)

        with self.assertRaises(ValueError):
            AntiSpamHandler(1)

        with self.assertRaises(ValueError):
            AntiSpamHandler("1")

        with self.assertRaises(ValueError):
            AntiSpamHandler({1: 2})

        with self.assertRaises(ValueError):
            AntiSpamHandler([1, None])

        with self.assertRaises(ValueError):
            AntiSpamHandler(True)

        with self.assertRaises(ValueError):
            AntiSpamHandler(False)

        AntiSpamHandler(commands.Bot(command_prefix="!"))

    async def test_warnThreshold(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            warn_threshold="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            warn_threshold=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            warn_threshold=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            warn_threshold=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"), warn_threshold=1)
        AntiSpamHandler(commands.Bot(command_prefix="!"), warn_threshold=None)

    async def test_kickThreshold(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            kick_threshold="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            kick_threshold=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            kick_threshold=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            kick_threshold=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"), kick_threshold=1)
        AntiSpamHandler(commands.Bot(command_prefix="!"), kick_threshold=None)

    async def test_banThreshold(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ban_threshold="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ban_threshold=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ban_threshold=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ban_threshold=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"), ban_threshold=1)
        AntiSpamHandler(commands.Bot(command_prefix="!"), ban_threshold=None)

    async def test_messageInterval(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_interval="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_interval=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_interval=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_interval=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_interval=1000)
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_interval=None)

        with self.assertRaises(BaseASHException):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_interval=999)

    async def test_guildKickMessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_kick_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_kick_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_kick_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_kick_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_kick_message=dict())

    async def test_guildBanMessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_ban_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_ban_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_ban_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_ban_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_ban_message=dict())

    async def test_userKickMessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_kick_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_kick_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_kick_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_kick_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_kick_message=dict())

    async def test_userBanMessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_ban_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_ban_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_ban_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_ban_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_ban_message=dict())

    async def test_userFailedKickmessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_kick_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_kick_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_kick_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_failed_kick_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_failed_kick_message=dict())

    async def test_userFailedBanmessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_ban_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_ban_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_ban_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_failed_ban_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_failed_ban_message=dict())

    async def test_messageDuplicateCount(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_count="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_count=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_count=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_count=[1])

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_count=2.0)

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_duplicate_count=2)
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_duplicate_count=None)

    async def test_messageDuplicateAccuracy(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy=[1])

        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              message_duplicate_accuracy=2)
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_duplicate_accuracy=None)

        self.assertIsInstance(ash.options.get("message_duplicate_accuracy"),
                              float)

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_duplicate_accuracy=2.0)

    async def test_ignorePerms(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_perms="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_perms=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_perms=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_perms=1)

        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_perms=[1])
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_perms=None)

    async def test_ignoreUsers(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_users="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_users=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_users=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_users=1)

        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_users=[1])
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_users=None)

    async def test_ignoreChannels(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_channels="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_channels=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_channels=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_channels=1)

        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_channels=[1])
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_channels=None)

    async def test_ignoreRoles(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_roles="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_roles=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_roles=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_roles=1)

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        ignore_roles=[1, "test role"])
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_roles=None)

    async def test_ignoreGuilds(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_guilds="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_guilds=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_guilds=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_guilds=1)

        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_guilds=[1])
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_guilds=None)

    async def test_ignoreBots(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_bots="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_bots=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_bots=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_bots=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_bots=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_bots=True)
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_bots=None)

    # TODO Add a ensureRaises test for each setable option...
    # TODO Capture standard out and ensure the logger is working,
    #      but only at the correct levels

    async def test_guildWarnMessageType(self):
        with self.assertRaises(
                ValueError, msg="guild_warn_message should raise, given int"):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_warn_message=1)

        with self.assertRaises(
                ValueError, msg="guild_warn_message should raise, given bool"):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_warn_message=True)

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_warn_message="Test")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_warn_message={"title": "Hello!"})

    async def test_guildWarnMessageString(self):
        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              guild_warn_message="This is a message")
        self.assertEqual(ash.options["guild_warn_message"],
                         "This is a message")

    async def test_guildWarnMessageEmbed(self):
        # Just tests this runs
        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              guild_warn_message={})

    async def test_deleteSpam(self):
        with self.assertRaises(ValueError):
            ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                                  delete_spam={})

        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              delete_spam=True)

    async def test_propagateRoleIgnoring(self):
        """
        Tests if the propagate method ignores the correct roles
        """
        ash = AntiSpamHandler(get_mocked_member(name="bot", id="87678"),
                              ignore_roles=[151515])

        result = await ash.propagate(get_mocked_message())

        self.assertEqual(result["status"], "Ignoring this role: 151515")

    async def test_propagateTypes(self):
        with self.assertRaises(ValueError):
            await self.ash.propagate(1)

        with self.assertRaises(ValueError):
            await self.ash.propagate(None)

        with self.assertRaises(ValueError):
            await self.ash.propagate("Hi!")

        with self.assertRaises(ValueError):
            await self.ash.propagate(True)

    async def test_propagateDmIgnore(self):
        result = await self.ash.propagate(get_mocked_message(is_in_guild=False)
                                          )
        self.assertEqual(result["status"], "Ignoring messages from dm's")

    async def test_propagateBotIgnore(self):
        result = await self.ash.propagate(
            get_mocked_message(member_kwargs={
                "bot": True,
                "id": 98987
            }))
        self.assertEqual(result["status"],
                         "Ignoring messages from myself (the bot)")

        result_two = await self.ash.propagate(
            get_mocked_message(member_kwargs={
                "bot": True,
                "id": 98798
            }))
        self.assertEqual(result_two["status"], "Ignoring messages from bots")

    async def test_propagateUserIgnore(self):
        self.ash.add_ignored_item(12345, "member")

        result = await self.ash.propagate(get_mocked_message())
        self.assertEqual(result["status"], "Ignoring this user: 12345")

        result_two = await self.ash.propagate(
            get_mocked_message(member_kwargs={"id": 5433221}))
        self.assertNotEqual(result_two["status"], "Ignoring this user: 12345")

    async def test_propagateIgnoreGuild(self):
        self.ash.add_ignored_item(123456789, "guild")
        self.assertEqual(self.ash.options["ignore_guilds"], [123456789])

        result = await self.ash.propagate(get_mocked_message())
        self.assertEqual(result["status"], "Ignoring this guild: 123456789")

        self.ash.remove_ignored_item(123456789, "guild")
        self.assertEqual(self.ash.options["ignore_guilds"], [])

    async def test_propagateIgnoredChannel(self):
        self.ash.add_ignored_item(98987, "channel")
        self.assertEqual(self.ash.options["ignore_channels"], [98987])

        result = await self.ash.propagate(get_mocked_message())
        self.assertEqual(result["status"], "Ignoring this channel: 98987")

        self.ash.remove_ignored_item(98987, "channel")
        self.assertEqual(self.ash.options["ignore_channels"], [])

    async def test_propagateGuildCreation(self):
        self.assertEqual(len(self.ash.guilds), 2)
        await self.ash.propagate(get_mocked_message(guild_kwargs={"id": 15}))
        self.assertEqual(len(self.ash.guilds), 2)

        await self.ash.propagate(get_mocked_message())
        self.assertEqual(len(self.ash.guilds), 3)

    async def test_propagateGuildPerms(self):
        ash = AntiSpamHandler(get_mocked_bot())
        message = get_mocked_message()
        message.guild.me.guild_permissions.kick_members = False
        message.guild.me.guild_permissions.ban_members = True
        with self.assertRaises(MissingGuildPermissions,
                               msg="Invalid kick_members perms"):
            await ash.propagate(message)

        message.guild.me.guild_permissions.kick_members = True
        message.guild.me.guild_permissions.ban_members = False
        with self.assertRaises(MissingGuildPermissions,
                               msg="Invalid ban_members perms"):
            await ash.propagate(message)

        message.guild.me.guild_permissions.ban_members = True
        await ash.propagate(message)

    async def test_ignoreMethods(self):
        self.assertEqual(self.ash.options["ignore_users"], [])
        self.assertEqual(self.ash.options["ignore_channels"], [])
        self.assertEqual(self.ash.options["ignore_perms"], [8])
        self.assertEqual(self.ash.options["ignore_guilds"], [])
        self.assertEqual(self.ash.options["ignore_roles"], [])

        self.ash.add_ignored_item(1, "member")
        self.ash.add_ignored_item(2, "channel")
        self.ash.add_ignored_item(3, "perm")
        self.ash.add_ignored_item(4, "guild")
        self.ash.add_ignored_item(5, "role")

        self.assertEqual(self.ash.options["ignore_users"], [1])
        self.assertEqual(self.ash.options["ignore_channels"], [2])
        self.assertEqual(self.ash.options["ignore_perms"], [8, 3])
        self.assertEqual(self.ash.options["ignore_guilds"], [4])
        self.assertEqual(self.ash.options["ignore_roles"], [5])

        self.ash.remove_ignored_item(1, "member")
        self.ash.remove_ignored_item(2, "channel")
        self.ash.remove_ignored_item(3, "perm")
        self.ash.remove_ignored_item(4, "guild")
        self.ash.remove_ignored_item(5, "role")

        self.assertEqual(self.ash.options["ignore_users"], [])
        self.assertEqual(self.ash.options["ignore_channels"], [])
        self.assertEqual(self.ash.options["ignore_perms"], [8])
        self.assertEqual(self.ash.options["ignore_guilds"], [])
        self.assertEqual(self.ash.options["ignore_roles"], [])

    async def test_ignoreMethodExceptions(self):
        with self.assertRaises(ValueError):
            self.ash.add_ignored_item("LOL", "test")

        with self.assertRaises(ValueError):
            self.ash.remove_ignored_item("LOL", "test")

        with self.assertRaises(BaseASHException):
            self.ash.add_ignored_item(1, "testing")

        with self.assertRaises(BaseASHException):
            self.ash.remove_ignored_item(1, "testing")

        with self.assertRaises(ValueError):
            self.ash.add_ignored_item(1, [])

        with self.assertRaises(ValueError):
            self.ash.remove_ignored_item(1, [])

    async def test_customGuildOptions(self):
        self.assertEqual(self.ash.guilds[0].options, Static.DEFAULTS)
        self.ash.add_custom_guild_options(self.ash.guilds[0].id,
                                          warn_threshold=15)
        self.assertNotEqual(self.ash.guilds[0].options, Static.DEFAULTS)
        self.assertEqual(self.ash.guilds[0].has_custom_options, True)

        self.ash.remove_custom_guild_options(self.ash.guilds[0].id)
        self.assertEqual(self.ash.guilds[0].options, Static.DEFAULTS)

        options = self.ash.get_guild_options(self.ash.guilds[0].id)[0]
        self.assertEqual(options, self.ash.guilds[0].options)
        self.assertEqual(options, self.ash.options)

    async def test_ASHRandomVar(self):
        with self.assertRaises(TypeError):
            AntiSpamHandler(get_mocked_bot(), logging.NOTSET, lol=1)

        with self.assertRaises(TypeError):
            self.ash.add_custom_guild_options(1234, testing=1)

    async def test_warnOnly(self):
        ash = AntiSpamHandler(get_mocked_bot(), warn_only=True)
        self.assertEqual(ash.options["warn_only"], True)
        self.assertEqual(self.ash.options["warn_only"], False)

        ash = AntiSpamHandler(get_mocked_bot(), warn_only=None)
        self.assertEqual(ash.options["warn_only"], False)

        with self.assertRaises(ValueError):
            AntiSpamHandler(get_mocked_bot(), warn_only=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(get_mocked_bot(), warn_only="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(get_mocked_bot(), warn_only=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(get_mocked_bot(), warn_only=[])

    async def test_resetWarnCounter(self):
        # GIVEN / SETUP
        user = User(get_mocked_bot(), 123454321, 12, Static.DEFAULTS)
        self.ash.guilds[0].users = user
        self.assertEqual(1, len(self.ash.guilds[0].users))
        self.assertEqual(0, self.ash.guilds[0].users[0].warn_count)
        self.ash.guilds[0].users[0].warn_count += 1
        self.assertEqual(1, self.ash.guilds[0].users[0].warn_count)

        # WHEN / TESTING
        self.ash.reset_user_count(123454321, 12, Static.WARNCOUNTER)

        # THEN / ASSERTIONS
        self.assertEqual(0, self.ash.guilds[0].users[0].warn_count)

    async def test_resetKickCounter(self):
        # GIVEN / SETUP
        user = User(get_mocked_bot(), 123454321, 12, Static.DEFAULTS)
        self.ash.guilds[0].users = user
        self.assertEqual(1, len(self.ash.guilds[0].users))
        self.assertEqual(0, self.ash.guilds[0].users[0].kick_count)
        self.ash.guilds[0].users[0].kick_count += 1
        self.assertEqual(1, self.ash.guilds[0].users[0].kick_count)

        # WHEN / TESTING
        self.ash.reset_user_count(123454321, 12, Static.KICKCOUNTER)

        # THEN / ASSERTIONS
        self.assertEqual(0, self.ash.guilds[0].users[0].kick_count)

    async def test_resetCountersRaises(self):
        # SETUP
        user = User(get_mocked_bot(), 123454321, 12, Static.DEFAULTS)
        self.ash.guilds[0].users = user

        # ASSERTIONS / TESTING
        with self.assertRaises(LogicError):
            self.ash.reset_user_count(123454321, 12, "Who knows")

        # Invalid guild, should work silently
        self.ash.reset_user_count(123454321, 15, "Who knows")

        # Invalid user, should work silently
        self.ash.reset_user_count(1234, 12, "Who knows")

        # Invalid both, should work silently
        self.ash.reset_user_count(1234, 15, "Who knows")
Exemplo n.º 2
0
class TestAsh(unittest.IsolatedAsyncioTestCase):
    """
    Used to test the ASH object (AntiSpamHandler)
    """
    async def asyncSetUp(self):
        """
        Simply setup our Ash obj before usage
        """
        self.ash = AntiSpamHandler(
            MockedMember(name="bot", member_id=98987,
                         mock_type="bot").to_mock())
        self.ash.guilds = Guild(None, 12, Static.DEFAULTS)
        self.ash.guilds = Guild(None, 15, Static.DEFAULTS)

    async def test_defaults(self):
        self.assertEqual(self.ash.options, Static.DEFAULTS)

    async def test_properties(self):
        with self.assertRaises(ValueError):
            self.ash.guilds = "1"

        with self.assertRaises(DuplicateObject):
            self.ash.guilds = Guild(None, 15, Static.DEFAULTS)

    async def test_messageAccuracyType(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy="x")

    async def test_messageAccuracyRange(self):
        with self.assertRaises(
                ValueError, msg="Invalid message_duplicate_accuracy (To low)"):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy=0)

        with self.assertRaises(
                ValueError,
                msg="Invalid message_duplicate_accuracy (To high)"):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy=101)

    async def test_messageAccuracyAssignment(self):
        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              message_duplicate_accuracy=50)
        self.assertEqual(ash.options["message_duplicate_accuracy"], 50)

    async def test_botAssignment(self):
        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            AntiSpamHandler(None)

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            AntiSpamHandler(1)

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            AntiSpamHandler("1")

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            AntiSpamHandler({1: 2})

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            AntiSpamHandler([1, None])

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            AntiSpamHandler(True)

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            AntiSpamHandler(False)

        AntiSpamHandler(commands.Bot(command_prefix="!"))
        AntiSpamHandler(commands.AutoShardedBot(command_prefix="!"))
        AntiSpamHandler(discord.Client())
        AntiSpamHandler(discord.AutoShardedClient())

    async def test_warnThreshold(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            warn_threshold="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            warn_threshold=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            warn_threshold=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            warn_threshold=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"), warn_threshold=1)
        AntiSpamHandler(commands.Bot(command_prefix="!"), warn_threshold=None)

    async def test_kickThreshold(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            kick_threshold="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            kick_threshold=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            kick_threshold=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            kick_threshold=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"), kick_threshold=1)
        AntiSpamHandler(commands.Bot(command_prefix="!"), kick_threshold=None)

    async def test_banThreshold(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ban_threshold="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ban_threshold=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ban_threshold=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ban_threshold=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"), ban_threshold=1)
        AntiSpamHandler(commands.Bot(command_prefix="!"), ban_threshold=None)

    async def test_messageInterval(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_interval="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_interval=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_interval=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_interval=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_interval=1000)
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_interval=None)

        with self.assertRaises(BaseASHException):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_interval=999)

    async def test_guildKickMessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_kick_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_kick_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_kick_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_kick_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_kick_message=dict())

    async def test_guildBanMessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_ban_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_ban_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_ban_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_ban_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_ban_message=dict())

    async def test_userKickMessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_kick_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_kick_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_kick_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_kick_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_kick_message=dict())

    async def test_userBanMessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_ban_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_ban_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_ban_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_ban_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_ban_message=dict())

    async def test_userFailedKickMessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_kick_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_kick_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_kick_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_failed_kick_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_failed_kick_message=dict())

    async def test_userFailedBanMessage(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_ban_message=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_ban_message=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            user_failed_ban_message=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_failed_ban_message="hi")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        user_failed_ban_message=dict())

    async def test_messageDuplicateCount(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_count="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_count=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_count=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_count=[1])

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_count=2.0)

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_duplicate_count=2)
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_duplicate_count=None)

    async def test_messageDuplicateAccuracy(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            message_duplicate_accuracy=[1])

        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              message_duplicate_accuracy=2)
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_duplicate_accuracy=None)

        self.assertIsInstance(ash.options.get("message_duplicate_accuracy"),
                              float)

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        message_duplicate_accuracy=2.0)

    async def test_ignorePerms(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_perms="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_perms=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_perms=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_perms=1)

        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_perms=[1])
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_perms=None)

    async def test_ignoreUsers(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_users="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_users=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_users=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_users=1)

        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_users=[1])
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_users=None)

    async def test_ignoreChannels(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_channels="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_channels=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_channels=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_channels=1)

        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_channels=[1])
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_channels=None)

    async def test_ignoreRoles(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_roles="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_roles=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_roles=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_roles=1)

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        ignore_roles=[1, "test role"])
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_roles=None)

    async def test_ignoreGuilds(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_guilds="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_guilds=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_guilds=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_guilds=1)

        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_guilds=[1])
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_guilds=None)

    async def test_ignoreBots(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_bots="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_bots=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            ignore_bots=tuple())

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_bots=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_bots=[1])

        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_bots=True)
        AntiSpamHandler(commands.Bot(command_prefix="!"), ignore_bots=None)

    # TODO Add a ensureRaises test for each set-able option...
    # TODO Capture standard out and ensure the logger is working,
    #      but only at the correct levels

    async def test_guildWarnMessageType(self):
        with self.assertRaises(
                ValueError, msg="guild_warn_message should raise, given int"):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_warn_message=1)

        with self.assertRaises(
                ValueError, msg="guild_warn_message should raise, given bool"):
            AntiSpamHandler(commands.Bot(command_prefix="!"),
                            guild_warn_message=True)

        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_warn_message="Test")
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_warn_message={"title": "Hello!"})

    async def test_guildWarnMessageString(self):
        ash = AntiSpamHandler(commands.Bot(command_prefix="!"),
                              guild_warn_message="This is a message")
        self.assertEqual(ash.options["guild_warn_message"],
                         "This is a message")

    async def test_guildWarnMessageEmbed(self):
        # Just tests this runs
        AntiSpamHandler(commands.Bot(command_prefix="!"),
                        guild_warn_message={})

    async def test_deleteSpam(self):
        with self.assertRaises(ValueError):
            AntiSpamHandler(commands.Bot(command_prefix="!"), delete_spam={})

        AntiSpamHandler(commands.Bot(command_prefix="!"), delete_spam=True)

    async def test_propagateRoleIgnoring(self):
        """
        Tests if the propagate method ignores the correct roles
        """
        ash = AntiSpamHandler(MockedMember(name="bot",
                                           member_id=87678).to_mock(),
                              ignore_roles=[151515])
        print(MockedMember(mock_type="bot").to_mock().user.id)
        result = await ash.propagate(MockedMessage().to_mock())

        self.assertEqual(result["status"], "Ignoring this role: 151515")

    async def test_propagateTypes(self):
        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            await self.ash.propagate(1)

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            await self.ash.propagate(None)

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            await self.ash.propagate("Hi!")

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            await self.ash.propagate(True)

    async def test_propagateDmIgnore(self):
        result = await self.ash.propagate(
            MockedMessage(is_in_guild=False).to_mock())
        self.assertEqual(result["status"], "Ignoring messages from dm's")

    async def test_propagateBotIgnore(self):
        result = await self.ash.propagate(
            MockedMessage(author_is_bot=True, author_id=98987).to_mock())
        self.assertEqual(result["status"],
                         "Ignoring messages from myself (the bot)")

        result_two = await self.ash.propagate(
            MockedMessage(author_is_bot=True, author_id=98798).to_mock())
        self.assertEqual(result_two["status"], "Ignoring messages from bots")

    async def test_propagateUserIgnore(self):
        self.ash.add_ignored_item(12345, "member")

        result = await self.ash.propagate(MockedMessage().to_mock())
        self.assertEqual(result["status"], "Ignoring this user: 12345")

        result_two = await self.ash.propagate(
            MockedMessage(author_id=5433221).to_mock())
        self.assertNotEqual(result_two["status"], "Ignoring this user: 12345")

    async def test_propagateIgnoreGuild(self):
        self.ash.add_ignored_item(123456789, "guild")
        self.assertEqual(self.ash.options["ignore_guilds"], [123456789])

        result = await self.ash.propagate(MockedMessage().to_mock())
        self.assertEqual(result["status"], "Ignoring this guild: 123456789")

        self.ash.remove_ignored_item(123456789, "guild")
        self.assertEqual(self.ash.options["ignore_guilds"], [])

    async def test_propagateIgnoredChannel(self):
        self.ash.add_ignored_item(98987, "channel")
        self.assertEqual(self.ash.options["ignore_channels"], [98987])

        result = await self.ash.propagate(MockedMessage().to_mock())
        self.assertEqual(result["status"], "Ignoring this channel: 98987")

        self.ash.remove_ignored_item(98987, "channel")
        self.assertEqual(self.ash.options["ignore_channels"], [])

    async def test_propagateGuildCreation(self):
        self.assertEqual(len(self.ash.guilds), 2)
        await self.ash.propagate(MockedMessage(guild_id=15).to_mock())
        self.assertEqual(len(self.ash.guilds), 2)

        await self.ash.propagate(MockedMessage().to_mock())
        self.assertEqual(len(self.ash.guilds), 3)

    async def test_propagateGuildPerms(self):
        ash = AntiSpamHandler(MockedMember(mock_type="bot").to_mock())
        message = MockedMessage().to_mock()
        message.guild.me.guild_permissions.kick_members = False
        message.guild.me.guild_permissions.ban_members = True
        with self.assertRaises(MissingGuildPermissions,
                               msg="Invalid kick_members perms"):
            await ash.propagate(message)

        message.guild.me.guild_permissions.kick_members = True
        message.guild.me.guild_permissions.ban_members = False
        with self.assertRaises(MissingGuildPermissions,
                               msg="Invalid ban_members perms"):
            await ash.propagate(message)

        message.guild.me.guild_permissions.ban_members = True
        await ash.propagate(message)

    async def test_ignoreMethods(self):
        self.assertEqual(self.ash.options["ignore_users"], [])
        self.assertEqual(self.ash.options["ignore_channels"], [])
        self.assertEqual(self.ash.options["ignore_perms"], [8])
        self.assertEqual(self.ash.options["ignore_guilds"], [])
        self.assertEqual(self.ash.options["ignore_roles"], [])

        self.ash.add_ignored_item(1, "member")
        self.ash.add_ignored_item(2, "channel")
        self.ash.add_ignored_item(3, "perm")
        self.ash.add_ignored_item(4, "guild")
        self.ash.add_ignored_item(5, "role")

        self.assertEqual(self.ash.options["ignore_users"], [1])
        self.assertEqual(self.ash.options["ignore_channels"], [2])
        self.assertEqual(self.ash.options["ignore_perms"], [8, 3])
        self.assertEqual(self.ash.options["ignore_guilds"], [4])
        self.assertEqual(self.ash.options["ignore_roles"], [5])

        self.ash.remove_ignored_item(1, "member")
        self.ash.remove_ignored_item(2, "channel")
        self.ash.remove_ignored_item(3, "perm")
        self.ash.remove_ignored_item(4, "guild")
        self.ash.remove_ignored_item(5, "role")

        self.assertEqual(self.ash.options["ignore_users"], [])
        self.assertEqual(self.ash.options["ignore_channels"], [])
        self.assertEqual(self.ash.options["ignore_perms"], [8])
        self.assertEqual(self.ash.options["ignore_guilds"], [])
        self.assertEqual(self.ash.options["ignore_roles"], [])

    async def test_ignoreMethodExceptions(self):
        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            self.ash.add_ignored_item("LOL", "test")

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            self.ash.remove_ignored_item("LOL", "test")

        with self.assertRaises(BaseASHException):
            self.ash.add_ignored_item(1, "testing")

        with self.assertRaises(BaseASHException):
            self.ash.remove_ignored_item(1, "testing")

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            self.ash.add_ignored_item(1, [])

        with self.assertRaises(ValueError):
            # noinspection PyTypeChecker
            self.ash.remove_ignored_item(1, [])

    async def test_customGuildOptions(self):
        self.assertEqual(self.ash.guilds[0].options, Static.DEFAULTS)
        self.ash.add_custom_guild_options(self.ash.guilds[0].id,
                                          warn_threshold=15)
        self.assertNotEqual(self.ash.guilds[0].options, Static.DEFAULTS)
        self.assertEqual(self.ash.guilds[0].has_custom_options, True)

        self.ash.remove_custom_guild_options(self.ash.guilds[0].id)
        self.assertEqual(self.ash.guilds[0].options, Static.DEFAULTS)

        options = self.ash.get_guild_options(self.ash.guilds[0].id)[0]
        self.assertEqual(options, self.ash.guilds[0].options)
        self.assertEqual(options, self.ash.options)

    async def test_ASHRandomVar(self):
        with self.assertRaises(TypeError):
            AntiSpamHandler(MockedMember(mock_type="bot").to_mock(), lol=1)

        with self.assertRaises(TypeError):
            self.ash.add_custom_guild_options(1234, testing=1)

    async def test_warnOnly(self):
        ash = AntiSpamHandler(MockedMember(mock_type="bot").to_mock(),
                              warn_only=True)
        self.assertEqual(ash.options["warn_only"], True)
        self.assertEqual(self.ash.options["warn_only"], False)

        ash = AntiSpamHandler(MockedMember(mock_type="bot").to_mock(),
                              warn_only=None)
        self.assertEqual(ash.options["warn_only"], False)

        with self.assertRaises(ValueError):
            AntiSpamHandler(MockedMember(mock_type="bot").to_mock(),
                            warn_only=1)

        with self.assertRaises(ValueError):
            AntiSpamHandler(MockedMember(mock_type="bot").to_mock(),
                            warn_only="1")

        with self.assertRaises(ValueError):
            AntiSpamHandler(MockedMember(mock_type="bot").to_mock(),
                            warn_only=dict())

        with self.assertRaises(ValueError):
            AntiSpamHandler(MockedMember(mock_type="bot").to_mock(),
                            warn_only=[])

    async def test_resetWarnCounter(self):
        # GIVEN / SETUP
        user = User(
            MockedMember(mock_type="bot").to_mock(), 123454321, 12,
            Static.DEFAULTS)
        self.ash.guilds[0].users = user
        self.assertEqual(1, len(self.ash.guilds[0].users))
        self.assertEqual(0, self.ash.guilds[0].users[0].warn_count)
        self.ash.guilds[0].users[0].warn_count += 1
        self.assertEqual(1, self.ash.guilds[0].users[0].warn_count)

        # WHEN / TESTING
        self.ash.reset_user_count(123454321, 12, Static.WARNCOUNTER)

        # THEN / ASSERTIONS
        self.assertEqual(0, self.ash.guilds[0].users[0].warn_count)

    async def test_resetKickCounter(self):
        # GIVEN / SETUP
        user = User(
            MockedMember(mock_type="bot").to_mock(), 123454321, 12,
            Static.DEFAULTS)
        self.ash.guilds[0].users = user
        self.assertEqual(1, len(self.ash.guilds[0].users))
        self.assertEqual(0, self.ash.guilds[0].users[0].kick_count)
        self.ash.guilds[0].users[0].kick_count += 1
        self.assertEqual(1, self.ash.guilds[0].users[0].kick_count)

        # WHEN / TESTING
        self.ash.reset_user_count(123454321, 12, Static.KICKCOUNTER)

        # THEN / ASSERTIONS
        self.assertEqual(0, self.ash.guilds[0].users[0].kick_count)

    async def test_resetCountersRaises(self):
        # SETUP
        user = User(
            MockedMember(mock_type="bot").to_mock(), 123454321, 12,
            Static.DEFAULTS)
        self.ash.guilds[0].users = user

        # ASSERTIONS / TESTING
        with self.assertRaises(LogicError):
            self.ash.reset_user_count(123454321, 12, "Who knows")

        # Invalid guild, should work silently
        self.ash.reset_user_count(123454321, 15, "Who knows")

        # Invalid user, should work silently
        self.ash.reset_user_count(1234, 12, "Who knows")

        # Invalid both, should work silently
        self.ash.reset_user_count(1234, 15, "Who knows")

    async def test_ensureOptionsRaisingModes(self):
        with self.assertRaises(BaseASHException):
            self.ash._ensure_options(warn_only=True, no_punish=True)

        self.ash._ensure_options(warn_only=False, no_punish=True)
        self.ash._ensure_options(warn_only=True, no_punish=False)

    async def test_noPunishMode(self):
        # SETUP
        ash = AntiSpamHandler(MockedMember(mock_type="bot").to_mock(),
                              no_punish=True)

        # WHEN / TESTING
        data = []
        for num in range(6):
            return_value = await ash.propagate(
                MockedMessage(message_id=num).to_mock())
            data.append(return_value)

        # THEN / ASSERTIONS
        self.assertEqual(len(data), 6)

        # TODO Fix this while fixing #39
        self.assertEqual(data[0]["should_be_punished_this_message"], False)
        self.assertEqual(data[2]["should_be_punished_this_message"], False)
        self.assertEqual(data[3]["should_be_punished_this_message"], True)
        self.assertEqual(data[5]["should_be_punished_this_message"], True)

    @unittest.skip
    async def test_statefulLoading(self):
        data = read_json("unittests")
        test_ash = await AntiSpamHandler.load_from_dict(
            MockedMember(name="bot", member_id=98987,
                         mock_type="bot").to_mock(), data)
        result = await test_ash.save_to_dict()
        self.assertEqual(data, result)

    async def test_registerPreInvoke(self):
        class PreInvoke:
            pass

        with self.assertRaises(ExtensionError):
            self.ash.register_extension(PreInvoke())

        class PreInvoke(BaseExtension):
            pass

        self.assertEqual(len(self.ash.pre_invoke_extensions), 0)
        self.ash.register_extension(PreInvoke())
        self.assertEqual(len(self.ash.pre_invoke_extensions), 1)

        with self.assertRaises(ExtensionError):
            self.ash.register_extension(PreInvoke)

        class AfterInvokeProp(BaseExtension):
            def __init__(self):
                super().__init__()
                self.is_pre_invoke = False

            async def propagate(self, message) -> dict:
                pass

        # with self.assertRaises(ExtensionError):
        #    self.ash.register_extension(AfterInvokeProp())

        # Cleanup
        self.ash.unregister_extension("PreInvoke")

        self.ash.register_extension(PreInvoke())
        with self.assertRaises(ExtensionError):
            self.ash.register_extension(PreInvoke())
        self.ash.register_extension(PreInvoke(), force_overwrite=True)

    async def test_unregisterExtension(self):
        class PreInvoke(BaseExtension):
            pass

        with self.assertRaises(ExtensionError):
            self.ash.unregister_extension("PreInvoke")

        self.ash.register_extension(PreInvoke())

        self.assertEqual(len(self.ash.pre_invoke_extensions), 1)
        self.ash.unregister_extension("PreInvoke")
        self.assertEqual(len(self.ash.pre_invoke_extensions), 0)