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
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)]
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}"
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
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)
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)
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)