예제 #1
0
    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)
예제 #2
0
    async def test_updateCache(self):
        ast = AntiSpamTracker(AntiSpamHandler(get_mocked_bot()), 3)

        self.assertEqual(False, bool(ast.user_tracking))
        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": True})
        self.assertEqual(True, bool(ast.user_tracking))

        ast.user_tracking = {}  # overwrite so we can test more

        self.assertEqual(False, bool(ast.user_tracking))
        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": False})
        self.assertEqual(False, bool(ast.user_tracking))

        with self.assertRaises(TypeError):
            # noinspection PyTypeChecker
            ast.update_cache(1, dict())

        with self.assertRaises(TypeError):
            # noinspection PyTypeChecker
            ast.update_cache(get_mocked_message(), 1)

        ast.user_tracking = {}
        self.assertEqual(0, len(ast.user_tracking))

        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": True})
        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": True})
        self.assertEqual(1, len(ast.user_tracking))
        self.assertEqual(1, len(ast.user_tracking[123456789]))
        self.assertEqual(2, len(ast.user_tracking[123456789][12345]))
예제 #3
0
    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")
예제 #4
0
    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")
예제 #5
0
 async def test_propagate(self):
     m = get_mocked_message(
         message_id=0, member_kwargs={"id": 0}, guild_kwargs={"id": 3}
     )
     # TODO Use AsyncMock or Monkeypatch __await__
     for i in range(5):
         await self.user.propagate(
             get_mocked_message(
                 message_id=i, member_kwargs={"id": 0}, guild_kwargs={"id": 3}
             )
         )
예제 #6
0
    async def test_removeOutdatedTimestamps(self):
        ast = AntiSpamTracker(AntiSpamHandler(get_mocked_bot()), 3, 50)
        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": True})
        self.assertEqual(ast.get_user_count(get_mocked_message()), 1)

        ast.remove_outdated_timestamps(123456789, 12345)
        self.assertEqual(ast.get_user_count(get_mocked_message()), 1)

        await asyncio.sleep(0.06)
        ast.remove_outdated_timestamps(123456789, 12345)
        self.assertEqual(ast.get_user_count(get_mocked_message()), 0)
예제 #7
0
    async def test_removePunishment(self):
        ast = AntiSpamTracker(AntiSpamHandler(get_mocked_bot()), 5)

        ast.remove_punishments(get_mocked_message())

        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": True})
        self.assertEqual(1, ast.get_user_count(get_mocked_message()))

        ast.remove_punishments(get_mocked_message())
        with self.assertRaises(UserNotFound):
            ast.get_user_count(get_mocked_message())
예제 #8
0
    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"], [])
예제 #9
0
    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"], [])
예제 #10
0
    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")
예제 #11
0
    async def test_getGuildValidInterval(self):
        ast = AntiSpamTracker(AntiSpamHandler(get_mocked_bot()), 3)
        self.assertEqual(ast._get_guild_valid_interval(123456789), 30000)
        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": True})

        self.assertEqual(ast._get_guild_valid_interval(123456789), 30000)

        ast.user_tracking[123456789]["valid_interval"] = 15000
        self.assertEqual(ast._get_guild_valid_interval(123456789), 15000)
예제 #12
0
    async def test_cleanCache(self):
        ast = AntiSpamTracker(AntiSpamHandler(get_mocked_bot()), 3, 50)
        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": True})
        self.assertEqual(1, len(ast.user_tracking[123456789][12345]))

        ast.clean_cache()
        self.assertEqual(len(ast.user_tracking), 1)
        self.assertEqual(1, len(ast.user_tracking[123456789][12345]))

        await asyncio.sleep(0.06)
        # This should now fully clean the cache
        ast.clean_cache()

        self.assertEqual(ast.user_tracking, dict())
예제 #13
0
    def test_transformMessage(self):
        warn_embed_dict = {
            "title":
            "**Dear $USERNAME**",
            "description":
            "You are being warned for spam, please stop!",
            "color":
            0xFF0000,
            "footer": {
                "text": "$BOTNAME"
            },
            "author": {
                "name": "$GUILDNAME"
            },
            "fields": [
                {
                    "name": "Current warns:",
                    "value": "$WARNCOUNT"
                },
                {
                    "name": "Current kicks:",
                    "value": "$KICKCOUNT",
                    "inline": False
                },
            ],
        }

        mock_message = get_mocked_message()
        warn_dict = {"warn_count": 1, "kick_count": 2}

        test_embed = transform_message(warn_embed_dict, mock_message,
                                       warn_dict)

        embed = discord.Embed(
            title="**Dear Skelmis**",
            description="You are being warned for spam, please stop!",
            color=0xFF0000,
        )
        embed.set_footer(text="Bot")
        embed.set_author(name="Guild")
        embed.add_field(name="Current warns:", value="1")
        embed.add_field(name="Current kicks:", value="2", inline=False)

        self.assertEqual(embed.to_dict(), test_embed.to_dict())

        message = transform_message("Hello $MENTIONUSER", mock_message,
                                    warn_dict)
        self.assertEqual("Hello <@12345>", message)
예제 #14
0
    async def test_isSpamming(self):
        ast = AntiSpamTracker(AntiSpamHandler(get_mocked_bot()), 5)
        self.assertEqual(ast.is_spamming(get_mocked_message()), False)

        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": True})
        self.assertEqual(ast.is_spamming(get_mocked_message()), False)

        for i in range(3):
            ast.update_cache(get_mocked_message(),
                             {"should_be_punished_this_message": True})
        # Cap is 5, should have 4 messages rn
        self.assertEqual(ast.is_spamming(get_mocked_message()), False)
        self.assertEqual(4, len(ast.user_tracking[123456789][12345]))

        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": True})
        self.assertEqual(ast.is_spamming(get_mocked_message()), True)

        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": True})
        self.assertEqual(ast.is_spamming(get_mocked_message()), True)
예제 #15
0
    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)
예제 #16
0
    def test_dictToEmbed(self):
        warn_embed_dict = {
            "title":
            "**Dear Dave**",
            "description":
            "You are being warned for spam, please stop!",
            "color":
            0xFF0000,
            "footer": {
                "text": "BOT"
            },
            "author": {
                "name": "Guild"
            },
            "fields": [
                {
                    "name": "Current warns:",
                    "value": "1"
                },
                {
                    "name": "Current kicks:",
                    "value": "2",
                    "inline": False
                },
            ],
        }

        mock_message = get_mocked_message()

        test_embed = dict_to_embed(warn_embed_dict, mock_message, {
            "warn_count": 1,
            "kick_count": 2
        })

        embed = discord.Embed(
            title="**Dear Dave**",
            description="You are being warned for spam, please stop!",
            color=0xFF0000,
        )
        embed.set_footer(text="BOT")
        embed.set_author(name="Guild")
        embed.add_field(name="Current warns:", value="1")
        embed.add_field(name="Current kicks:", value="2", inline=False)

        self.assertEqual(embed.to_dict(), test_embed.to_dict())
예제 #17
0
    async def test_noPunishMode(self):
        # SETUP
        ash = AntiSpamHandler(get_mocked_bot(), no_punish=True)

        # WHEN / TESTING
        data = []
        for num in range(6):
            return_value = await ash.propagate(
                get_mocked_message(message_id=num))
            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)
예제 #18
0
    async def test_getUserCount(self):
        ast = AntiSpamTracker(AntiSpamHandler(get_mocked_bot()), 3)
        ast.update_cache(get_mocked_message(),
                         {"should_be_punished_this_message": True})

        user_count = ast.get_user_count(get_mocked_message())

        self.assertEqual(user_count, 1)

        for i in range(3):
            ast.update_cache(get_mocked_message(),
                             {"should_be_punished_this_message": True})
        user_count = ast.get_user_count(get_mocked_message())
        self.assertEqual(user_count, 4)

        with self.assertRaises(UserNotFound):
            message = get_mocked_message(guild_kwargs={"id": 15})
            ast.get_user_count(message)

        with self.assertRaises(UserNotFound):
            message = get_mocked_message(member_kwargs={"id": 25})
            ast.get_user_count(message)
예제 #19
0
 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")