コード例 #1
0
ファイル: test_cog.py プロジェクト: KoalaBotUK/KoalaBot
async def test_parse_emoji_and_role_input_str(num_rows, utils_cog, rfr_cog):
    config: dpytest.RunnerConfig = dpytest.get_config()
    guild: discord.Guild = config.guilds[0]
    await dpytest.message(koalabot.COMMAND_PREFIX + "store_ctx")
    ctx: commands.Context = utils_cog.get_last_ctx()
    for i in range(5):
        input_str = ""
        expected_emoji_list = []
        expected_role_list = []
        for j in range(num_rows):
            fake_emoji = random.choice([
                testutils.fake_guild_emoji(guild),
                testutils.fake_unicode_emoji()
            ])
            expected_emoji_list.append(str(fake_emoji))
            if isinstance(fake_emoji, discord.Emoji):
                fake_emoji_str = random.choice(
                    [fake_emoji.id, fake_emoji.name])
            else:
                fake_emoji_str = fake_emoji
            fake_role = testutils.fake_guild_role(guild)
            expected_role_list.append(fake_role)
            fake_role_str = random.choice(
                [fake_role.id, fake_role.name, fake_role.mention])
            input_str += f"{fake_emoji_str}, {fake_role_str}\n\r"
        emoji_roles_list = await rfr_cog.parse_emoji_and_role_input_str(
            ctx, input_str, 20)
        for emoji_role in emoji_roles_list:
            assert str(emoji_role[0]) == str(
                expected_emoji_list[emoji_roles_list.index(emoji_role)])
            assert emoji_role[1] == expected_role_list[emoji_roles_list.index(
                emoji_role)]
コード例 #2
0
ファイル: test_db.py プロジェクト: KoalaBotUK/KoalaBot
async def test_rfr_with_req_role(num_roles, num_required, rfr_cog):
    with session_manager() as session:
        config: dpytest.RunnerConfig = dpytest.get_config()
        test_guild: discord.Guild = config.guilds[0]

        # Create RFR message for test
        rfr_message = dpytest.back.make_message("FakeContent",
                                                config.client.user,
                                                test_guild.text_channels[0])
        DBManager.add_rfr_message(test_guild.id, rfr_message.channel.id,
                                  rfr_message.id)
        assert DBManager.get_rfr_message(test_guild.id, rfr_message.channel.id,
                                         rfr_message.id) is not None

        r_list = []
        for i in range(num_roles):
            role = testutils.fake_guild_role(test_guild)
            r_list.append(role)
        required = random.sample(r_list, num_required)
        role_to_add = testutils.fake_guild_role(test_guild)

        # Add emoji role combo to db
        _, _, _, er_id = DBManager.get_rfr_message(test_guild.id,
                                                   rfr_message.channel.id,
                                                   rfr_message.id)
        react_emoji: str = testutils.fake_unicode_emoji()
        DBManager.add_rfr_message_emoji_role(er_id,
                                             emoji.demojize(react_emoji),
                                             role_to_add.id)

        for r in required:
            DBManager.add_guild_rfr_required_role(test_guild.id, r.id)
            assert independent_get_guild_rfr_required_role(
                session, test_guild.id, r.id) is not None

        member: discord.Member = await dpytest.member_join()
        await member.add_roles(
            *(random.sample(r_list, random.randint(1, num_roles))))
        logger.debug(
            f"required = {[r.name for r in required]}, mem_roles pre-add are {[member.roles]}"
        )
        if not any([r in required for r in member.roles]):
            x = random.choice(required)
            await member.add_roles(x)
            logger.debug(f"added role {x.name} to {member.display_name}")
        mem_roles = member.roles
        with mock.patch("koala.cogs.ReactForRole.get_role_member_info",
                        mock.AsyncMock(return_value=(member, role_to_add))):
            await dpytest.add_reaction(member, rfr_message, react_emoji)
            assert all([m in member.roles for m in mem_roles])
            assert role_to_add in member.roles
コード例 #3
0
ファイル: test_db.py プロジェクト: KoalaBotUK/KoalaBot
async def test_rfr_without_req_role(num_roles, num_required, rfr_cog):
    with session_manager() as session:
        config: dpytest.RunnerConfig = dpytest.get_config()
        test_guild: discord.Guild = config.guilds[0]

        r_list = []
        for i in range(num_roles):
            role = testutils.fake_guild_role(test_guild)
            r_list.append(role)
        required = random.sample(list(r_list), num_required)
        for r in required:
            DBManager.add_guild_rfr_required_role(test_guild.id, r.id)
            assert independent_get_guild_rfr_required_role(
                session, test_guild.id, r.id) is not None

        member: discord.Member = await dpytest.member_join()
        await member.add_roles(*[r for r in r_list if r not in required])
        mem_roles = member.roles
        role_to_add = testutils.fake_guild_role(test_guild)

        # Create RFR message for test
        rfr_message = dpytest.back.make_message("FakeContent",
                                                config.client.user,
                                                test_guild.text_channels[0])
        DBManager.add_rfr_message(test_guild.id, rfr_message.channel.id,
                                  rfr_message.id)
        assert DBManager.get_rfr_message(test_guild.id, rfr_message.channel.id,
                                         rfr_message.id) is not None

        # Add emoji role combo to db
        _, _, _, er_id = DBManager.get_rfr_message(test_guild.id,
                                                   rfr_message.channel.id,
                                                   rfr_message.id)
        react_emoji: str = testutils.fake_unicode_emoji()
        DBManager.add_rfr_message_emoji_role(er_id,
                                             emoji.demojize(react_emoji),
                                             role_to_add.id)

        with mock.patch("koala.cogs.ReactForRole.get_role_member_info",
                        mock.AsyncMock(return_value=(member, role_to_add))):
            with mock.patch("discord.Member.add_roles",
                            mock.AsyncMock()) as add_role_mock:
                await dpytest.add_reaction(member, rfr_message, react_emoji)
                assert all([m in member.roles for m in mem_roles])
                add_role_mock.assert_not_called()
                assert role_to_add not in member.roles
コード例 #4
0
ファイル: test_cog.py プロジェクト: KoalaBotUK/KoalaBot
async def test_rfr_remove_roles_from_msg():
    config: dpytest.RunnerConfig = dpytest.get_config()
    guild: discord.Guild = config.guilds[0]
    channel: discord.TextChannel = guild.text_channels[0]
    embed: discord.Embed = discord.Embed(title="title",
                                         description="description")
    author: discord.Member = config.members[0]
    message: discord.Message = await dpytest.message("rfr")
    msg_id: int = message.id
    DBManager.add_rfr_message(guild.id, channel.id, msg_id)
    input_em_ro_content = ""
    em_ro_list = []
    for i in range(5):
        em = testutils.fake_unicode_emoji()
        ro = testutils.fake_guild_role(guild)
        x = random.choice([str(em), str(ro.id)])
        input_em_ro_content += f"{x}\n\r"
        em_ro_list.append(x)
        embed.add_field(name=str(em), value=ro.mention, inline=False)
        DBManager.add_rfr_message_emoji_role(1, str(em), ro.id)

    input_em_ro_msg: discord.Message = dpytest.back.make_message(
        input_em_ro_content, author, channel)
    with mock.patch('koala.cogs.ReactForRole.get_rfr_message_from_prompts',
                    mock.AsyncMock(return_value=(message, channel))):
        with mock.patch('koala.cogs.ReactForRole.get_embed_from_message',
                        return_value=embed):
            with mock.patch('discord.client.Client.wait_for',
                            mock.AsyncMock(return_value=input_em_ro_msg)):
                with mock.patch('discord.Embed.add_field') as add_field:
                    with mock.patch(
                            'koala.cogs.react_for_role.db.ReactForRoleDBManager.remove_rfr_message_emoji_role'
                    ) as remove_emoji_role:
                        add_field.reset_mock()
                        await dpytest.message(koalabot.COMMAND_PREFIX +
                                              "rfr removeRoles")
                        add_field.assert_not_called()
                        calls = []
                        for i in range(5):
                            calls.append((1, em_ro_list[i]))
                        remove_emoji_role.has_calls(calls)
コード例 #5
0
ファイル: test_cog.py プロジェクト: KoalaBotUK/KoalaBot
async def test_rfr_add_roles_to_msg():
    config: dpytest.RunnerConfig = dpytest.get_config()
    guild: discord.Guild = config.guilds[0]
    channel: discord.TextChannel = guild.text_channels[0]
    embed: discord.Embed = discord.Embed(title="title",
                                         description="description")
    client: discord.Client = config.client
    author: discord.Member = config.members[0]
    message: discord.Message = await dpytest.message("rfr")
    msg_id: int = message.id
    DBManager.add_rfr_message(guild.id, channel.id, msg_id)
    input_em_ro_content = ""
    em_list = []
    ro_list = []
    for i in range(5):
        em = testutils.fake_unicode_emoji()
        ro = testutils.fake_guild_role(guild)
        input_em_ro_content += f"{str(em)}, {ro.id}\n\r"
        em_list.append(em)
        ro_list.append(ro.mention)
    input_em_ro_msg: discord.Message = dpytest.back.make_message(
        input_em_ro_content, author, channel)

    with mock.patch('koala.cogs.ReactForRole.get_rfr_message_from_prompts',
                    mock.AsyncMock(return_value=(message, channel))):
        with mock.patch('koala.cogs.ReactForRole.get_embed_from_message',
                        return_value=embed):
            with mock.patch('discord.client.Client.wait_for',
                            mock.AsyncMock(return_value=input_em_ro_msg)):
                with mock.patch('discord.Embed.add_field') as add_field:
                    await dpytest.message(koalabot.COMMAND_PREFIX +
                                          "rfr addRoles")
                    calls = []
                    for i in range(5):
                        calls.append(
                            mock.call(name=str(em_list[i]),
                                      value=ro_list[i],
                                      inline=False))
                    add_field.has_calls(calls)
コード例 #6
0
ファイル: test_db.py プロジェクト: KoalaBotUK/KoalaBot
async def test_rfr_db_functions_rfr_message_emoji_roles():
    with session_manager() as session:
        guild: discord.Guild = dpytest.get_config().guilds[0]
        channel: discord.TextChannel = dpytest.get_config().channels[0]
        msg_id = dpyfactory.make_id()
        DBManager.add_rfr_message(guild.id, channel.id, msg_id)
        guild_rfr_message = independent_get_guild_rfr_message(session)[0]
        expected_full_list: List[Tuple[int, str, int]] = []
        assert independent_get_rfr_message_emoji_role(
            session) == expected_full_list
        # 1 unicode, 1 role
        fake_emoji_1 = testutils.fake_unicode_emoji()
        fake_role_id_1 = dpyfactory.make_id()
        expected_full_list.append((1, fake_emoji_1, fake_role_id_1))
        DBManager.add_rfr_message_emoji_role(guild_rfr_message[3],
                                             fake_emoji_1, fake_role_id_1)
        assert independent_get_rfr_message_emoji_role(
            session
        ) == expected_full_list, DBManager.get_rfr_message_emoji_roles(1)
        assert independent_get_rfr_message_emoji_role(session,
                                                      1) == expected_full_list
        assert independent_get_rfr_message_emoji_role(
            session, guild_rfr_message[3], fake_emoji_1, fake_role_id_1) == [
                DBManager.get_rfr_reaction_role(guild_rfr_message[3],
                                                fake_emoji_1, fake_role_id_1)
            ]
        # 1 unicode, 1 custom, trying to get same role
        fake_emoji_2 = testutils.fake_custom_emoji_str_rep()
        DBManager.add_rfr_message_emoji_role(guild_rfr_message[3],
                                             fake_emoji_2, fake_role_id_1)
        assert independent_get_rfr_message_emoji_role(
            session) == expected_full_list
        assert independent_get_rfr_message_emoji_role(
            session,
            guild_rfr_message[3]) == DBManager.get_rfr_message_emoji_roles(
                guild_rfr_message[3])
        assert [
            DBManager.get_rfr_reaction_role(guild_rfr_message[3], fake_emoji_2,
                                            fake_role_id_1)
        ] == [None]
        # 2 roles, with 1 emoji trying to give both roles
        fake_role_id_2 = dpyfactory.make_id()
        DBManager.add_rfr_message_emoji_role(guild_rfr_message[3],
                                             fake_emoji_1, fake_role_id_2)
        assert independent_get_rfr_message_emoji_role(
            session) == expected_full_list
        assert independent_get_rfr_message_emoji_role(
            session,
            guild_rfr_message[3]) == DBManager.get_rfr_message_emoji_roles(
                guild_rfr_message[3])
        assert [
            DBManager.get_rfr_reaction_role(guild_rfr_message[3], fake_emoji_1,
                                            fake_role_id_2)
        ] == [None]

        # 2 roles, 2 emojis, 1 message. split between them
        fake_emoji_2 = testutils.fake_custom_emoji_str_rep()
        fake_role_id_2 = dpyfactory.make_id()
        expected_full_list.append((1, fake_emoji_2, fake_role_id_2))
        DBManager.add_rfr_message_emoji_role(*expected_full_list[1])
        assert independent_get_rfr_message_emoji_role(
            session) == expected_full_list
        assert independent_get_rfr_message_emoji_role(session, 1,
                                                      fake_emoji_1) == [
                                                          (1, fake_emoji_1,
                                                           fake_role_id_1)
                                                      ]
        assert independent_get_rfr_message_emoji_role(session, 1,
                                                      fake_emoji_2) == [
                                                          (1, fake_emoji_2,
                                                           fake_role_id_2)
                                                      ]
        assert independent_get_rfr_message_emoji_role(
            session, 1, fake_emoji_1
        )[0][2] == DBManager.get_rfr_reaction_role_by_emoji_str(
            1, fake_emoji_1)
        assert independent_get_rfr_message_emoji_role(
            session, 1) == DBManager.get_rfr_message_emoji_roles(1)
        assert independent_get_rfr_message_emoji_role(
            session, 1,
            role_id=fake_role_id_2)[0][2] == get_rfr_reaction_role_by_role_id(
                session, emoji_role_id=1, role_id=fake_role_id_2)

        # 2 roles 2 emojis, 2 messages. duplicated messages
        msg2_id = dpyfactory.make_id()
        DBManager.add_rfr_message(guild.id, channel.id, msg2_id)
        assert independent_get_guild_rfr_message(session) == [
            guild_rfr_message, (guild.id, channel.id, msg2_id, 2)
        ]
        guild_rfr_message_2 = independent_get_guild_rfr_message(session)[1]
        DBManager.add_rfr_message_emoji_role(guild_rfr_message_2[3],
                                             fake_emoji_1, fake_role_id_1)
        DBManager.add_rfr_message_emoji_role(guild_rfr_message_2[3],
                                             fake_emoji_2, fake_role_id_2)
        expected_full_list.extend([
            (guild_rfr_message_2[3], fake_emoji_1, fake_role_id_1),
            (guild_rfr_message_2[3], fake_emoji_2, fake_role_id_2)
        ])
        assert independent_get_rfr_message_emoji_role(
            session) == expected_full_list
        assert independent_get_rfr_message_emoji_role(
            session, 2) == DBManager.get_rfr_message_emoji_roles(2)
        assert independent_get_rfr_message_emoji_role(
            session, 1) == DBManager.get_rfr_message_emoji_roles(1)

        # 2 roles 2 emojis 2 messages. Swapped
        msg3_id = dpyfactory.make_id()
        DBManager.add_rfr_message(guild.id, channel.id, msg3_id)
        assert independent_get_guild_rfr_message(session) == [
            guild_rfr_message, (guild.id, channel.id, msg2_id, 2),
            (guild.id, channel.id, msg3_id, 3)
        ]
        guild_rfr_message_3 = independent_get_guild_rfr_message(session)[2]
        DBManager.add_rfr_message_emoji_role(guild_rfr_message_3[3],
                                             fake_emoji_1, fake_role_id_2)
        DBManager.add_rfr_message_emoji_role(guild_rfr_message_3[3],
                                             fake_emoji_2, fake_role_id_1)
        expected_full_list.extend([
            (guild_rfr_message_3[3], fake_emoji_1, fake_role_id_2),
            (guild_rfr_message_3[3], fake_emoji_2, fake_role_id_1)
        ])
        assert independent_get_rfr_message_emoji_role(
            session) == expected_full_list
        assert independent_get_rfr_message_emoji_role(
            session, 3) == DBManager.get_rfr_message_emoji_roles(3)
        assert [
            x[2] for x in independent_get_rfr_message_emoji_role(
                session, emoji_raw=fake_emoji_1)
        ] == [
            DBManager.get_rfr_reaction_role_by_emoji_str(1, fake_emoji_1),
            DBManager.get_rfr_reaction_role_by_emoji_str(2, fake_emoji_1),
            DBManager.get_rfr_reaction_role_by_emoji_str(3, fake_emoji_1)
        ]
        assert [
            x[2] for x in independent_get_rfr_message_emoji_role(
                session, emoji_raw=fake_emoji_2)
        ] == [
            DBManager.get_rfr_reaction_role_by_emoji_str(1, fake_emoji_2),
            DBManager.get_rfr_reaction_role_by_emoji_str(2, fake_emoji_2),
            DBManager.get_rfr_reaction_role_by_emoji_str(3, fake_emoji_2)
        ]
        # test deletion works from rfr message
        rfr_message_emoji_roles = independent_get_rfr_message_emoji_role(
            session, 3)
        DBManager.remove_rfr_message(guild.id, channel.id, msg3_id)
        for row in rfr_message_emoji_roles:
            assert row not in independent_get_rfr_message_emoji_role(
                session), independent_get_guild_rfr_message(session)
        # test deleting just emoji role combos
        rfr_message_emoji_roles = independent_get_rfr_message_emoji_role(
            session, 2)
        DBManager.remove_rfr_message_emoji_roles(2)
        for row in rfr_message_emoji_roles:
            assert row not in independent_get_rfr_message_emoji_role(
                session), independent_get_guild_rfr_message(session)
        # test deleteing specific
        rfr_message_emoji_roles = independent_get_rfr_message_emoji_role(
            session, 1)
        DBManager.remove_rfr_message_emoji_role(
            1, emoji_raw=rfr_message_emoji_roles[0][1])
        assert (rfr_message_emoji_roles[0][0], rfr_message_emoji_roles[0][1],
                rfr_message_emoji_roles[0][2]
                ) not in independent_get_rfr_message_emoji_role(session)
        DBManager.remove_rfr_message_emoji_role(
            1, role_id=rfr_message_emoji_roles[1][2])
        assert (rfr_message_emoji_roles[1][0], rfr_message_emoji_roles[1][1],
                rfr_message_emoji_roles[1][2]
                ) not in independent_get_rfr_message_emoji_role(session)