コード例 #1
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
コード例 #2
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)]
コード例 #3
0
ファイル: test_cog.py プロジェクト: KoalaBotUK/KoalaBot
async def test_can_have_rfr_role(num_roles, num_required, rfr_cog):
    with session_manager() as session:
        config: dpytest.RunnerConfig = dpytest.get_config()
        guild: discord.Guild = config.guilds[0]
        r_list = []
        for i in range(num_roles):
            role = testutils.fake_guild_role(guild)
            r_list.append(role)
        required = random.sample(list(r_list), num_required)
        for r in required:
            DBManager.add_guild_rfr_required_role(guild.id, r.id)
            assert independent_get_guild_rfr_required_role(
                session, guild.id, r.id) is not None
        for i in range(num_roles):
            mem_roles = []
            member: discord.Member = await dpytest.member_join()
            for j in range(i):
                mem_roles.append(r_list[j])
                await member.add_roles(r_list[j])

            assert len(mem_roles) == i
            if len(required) == 0:
                assert rfr_cog.can_have_rfr_role(member)
            else:
                assert rfr_cog.can_have_rfr_role(member) == any(
                    x in required
                    for x in member.roles), f"\n\r{member.roles}\n\r{required}"
コード例 #4
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
コード例 #5
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)
コード例 #6
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)
コード例 #7
0
ファイル: test_db.py プロジェクト: KoalaBotUK/KoalaBot
async def test_rfr_db_functions_guild_rfr_required_roles():
    with session_manager() as session:
        guild: discord.Guild = dpytest.get_config().guilds[0]
        roles = []
        for i in range(50):
            role: discord.Role = testutils.fake_guild_role(guild)
            roles.append(role)
            DBManager.add_guild_rfr_required_role(guild.id, role.id)
            assert [
                x[1] for x in independent_get_guild_rfr_required_role(session)
            ] == [x.id for x in roles], i
            assert [
                x[1] for x in independent_get_guild_rfr_required_role(session)
            ] == DBManager.get_guild_rfr_required_roles(guild.id), i

        while len(roles) > 0:
            role: discord.Role = roles.pop()
            DBManager.remove_guild_rfr_required_role(guild.id, role.id)
            assert [
                x[1] for x in independent_get_guild_rfr_required_role(session)
            ] == [x.id for x in roles], len(roles)
            assert [
                x[1] for x in independent_get_guild_rfr_required_role(session)
            ] == DBManager.get_guild_rfr_required_roles(guild.id), len(roles)