def test_var_dict(scope): with mock_ctx() as ctx: scope.update_globals(get_var_dict_from_ctx(ctx)) assert scope.globals['_ctx'] is ctx assert scope.globals['_bot'] is ctx.bot assert scope.globals['_message'] is ctx.message
async def test_context_copy(): with utils.mock_ctx() as ctx: await copy_context_with(ctx, author=1, channel=2, content=3) ctx.bot.get_context.assert_called_once() alt_message = ctx.bot.get_context.call_args[0][0] alt_message._update.assert_called_once() assert alt_message._update.call_args[0] == ({"content": 3},)
async def test_commands(bot): cog = bot.get_cog(bot.test_cog) assert cog is not None # test 'jsk' with utils.mock_ctx() as ctx: await bot.get_command('jsk').callback(cog, ctx) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert bot.test_predicate in text
async def test_cog_check(bot): cog = bot.get_cog("Jishaku") with utils.mock_ctx() as ctx: with utils.mock_coro(ctx.bot, 'is_owner'): ctx.bot.is_owner.coro.return_value = True assert await cog.cog_check(ctx) ctx.bot.is_owner.coro.return_value = False with pytest.raises(commands.NotOwner): await cog.cog_check(ctx)
async def test_paginator_interface(): bot = commands.Bot('?') with open(__file__, 'rb') as file: paginator = FilePaginator(file, max_size=200) interface = PaginatorInterface(bot, paginator) assert interface.pages == paginator.pages assert interface.page_count == len(paginator.pages) assert interface.page_size > 200 assert interface.page_size < interface.max_page_size send_kwargs = interface.send_kwargs assert isinstance(send_kwargs, dict) assert 'content' in send_kwargs content = send_kwargs['content'] assert isinstance(content, str) assert len(content) <= interface.page_size assert interface.display_page == 0 # pages have been closed, so adding a line should make a new page old_page_count = interface.page_count await interface.add_line('a' * 150) assert interface.page_count > old_page_count # push the page to the end (rounded into bounds) interface.display_page = 999 old_display_page = interface.display_page assert interface.pages == paginator.pages # page closed, so create new page await interface.add_line('b' * 150) # ensure page has followed tail assert interface.display_page > old_display_page # testing with embed interface embed_interface = PaginatorEmbedInterface(bot, paginator) assert embed_interface.pages[0] == interface.pages[0] send_kwargs = embed_interface.send_kwargs assert isinstance(send_kwargs, dict) assert 'embed' in send_kwargs embed = send_kwargs['embed'] assert isinstance(embed, discord.Embed) description = embed.description assert content.startswith(description) # check for raise on too large page size with pytest.raises(ValueError): PaginatorInterface(None, commands.Paginator(max_size=2000)) # check for raise on not-paginator with pytest.raises(TypeError): PaginatorInterface(None, 4) paginator = commands.Paginator(max_size=100) for _ in range(100): paginator.add_line("test text") # test interfacing with utils.mock_ctx(bot) as ctx: interface = PaginatorInterface(bot, paginator) assert not interface.closed await interface.send_to(ctx) await asyncio.sleep(0.1) await interface.add_line("test text") assert interface.page_count > 1 assert not interface.closed interface.message.id = utils.sentinel() current_page = interface.display_page payload = { 'message_id': interface.message.id, 'user_id': ctx.author.id, 'channel_id': ctx.channel.id, 'guild_id': ctx.guild.id } # push right button emoji = discord.PartialEmoji( animated=False, name="\N{BLACK RIGHT-POINTING TRIANGLE}", id=None ) bot.dispatch( 'raw_reaction_add', discord.RawReactionActionEvent(payload, emoji, 'REACTION_ADD') if discord.version_info >= (1, 3) else discord.RawReactionActionEvent(payload, emoji) ) await asyncio.sleep(0.1) assert interface.display_page > current_page assert not interface.closed current_page = interface.display_page # push left button emoji = discord.PartialEmoji( animated=False, name="\N{BLACK LEFT-POINTING TRIANGLE}", id=None ) bot.dispatch( 'raw_reaction_add', discord.RawReactionActionEvent(payload, emoji, 'REACTION_ADD') if discord.version_info >= (1, 3) else discord.RawReactionActionEvent(payload, emoji) ) await asyncio.sleep(0.1) assert interface.display_page < current_page assert not interface.closed # push last page button emoji = discord.PartialEmoji( animated=False, name="\N{BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR}", id=None ) bot.dispatch( 'raw_reaction_add', discord.RawReactionActionEvent(payload, emoji, 'REACTION_ADD') if discord.version_info >= (1, 3) else discord.RawReactionActionEvent(payload, emoji) ) await asyncio.sleep(0.1) assert interface.display_page == interface.page_count - 1 assert not interface.closed # push first page button emoji = discord.PartialEmoji( animated=False, name="\N{BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR}", id=None ) bot.dispatch( 'raw_reaction_add', discord.RawReactionActionEvent(payload, emoji, 'REACTION_ADD') if discord.version_info >= (1, 3) else discord.RawReactionActionEvent(payload, emoji) ) await asyncio.sleep(0.1) assert interface.display_page == 0 assert not interface.closed # push close button emoji = discord.PartialEmoji( animated=False, name="\N{BLACK SQUARE FOR STOP}", id=None ) bot.dispatch( 'raw_reaction_add', discord.RawReactionActionEvent(payload, emoji, 'REACTION_ADD') if discord.version_info >= (1, 3) else discord.RawReactionActionEvent(payload, emoji) ) await asyncio.sleep(0.1) assert interface.closed ctx.send.coro.return_value.delete.assert_called_once() # test resend, no delete with utils.mock_ctx(bot) as ctx: interface = PaginatorInterface(bot, paginator) assert not interface.closed await interface.send_to(ctx) await asyncio.sleep(0.1) await interface.add_line("test text") assert interface.page_count > 1 assert not interface.closed # resend await interface.send_to(ctx) await asyncio.sleep(0.1) await interface.add_line("test text") ctx.send.coro.return_value.delete.assert_not_called() interface.task.cancel() await asyncio.sleep(0.1) assert interface.closed # test resend, delete with utils.mock_ctx(bot) as ctx: interface = PaginatorInterface(bot, paginator, delete_message=True) assert not interface.closed await interface.send_to(ctx) await asyncio.sleep(0.1) await interface.add_line("test text") assert interface.page_count > 1 assert not interface.closed # resend await interface.send_to(ctx) await asyncio.sleep(0.1) await interface.add_line("test text") ctx.send.coro.return_value.delete.assert_called_once() interface.task.cancel() await asyncio.sleep(0.1) assert interface.closed
async def test_commands(bot): cog = bot.get_cog("Jishaku") # test 'jsk' with utils.mock_ctx() as ctx: await bot.get_command('jsk').callback(cog, ctx) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "Module was loaded" in text # test 'jsk hide' and 'jsk show' cog.jsk.hidden = False with utils.mock_ctx() as ctx: await bot.get_command('jsk hide').callback(cog, ctx) assert cog.jsk.hidden ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "now hidden" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk hide').callback(cog, ctx) assert cog.jsk.hidden ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "already hidden" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk show').callback(cog, ctx) assert not cog.jsk.hidden ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "now visible" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk show').callback(cog, ctx) assert not cog.jsk.hidden ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "already visible" in text # test 'jsk tasks' with utils.mock_ctx() as ctx: await bot.get_command('jsk tasks').callback(cog, ctx) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "No currently running tasks" in text with utils.mock_ctx() as ctx: with cog.submit(ctx): interface = await bot.get_command('jsk tasks').callback(cog, ctx) ctx.send.assert_called_once() interface.task.cancel() # test 'jsk cancel' with utils.mock_ctx() as ctx: # test explicit with cog.submit(ctx) as command_task: with pytest.raises(asyncio.CancelledError): await bot.get_command('jsk cancel').callback( cog, ctx, index=command_task.index) await asyncio.sleep(0.1) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert f"Cancelled task {command_task.index}" in text with utils.mock_ctx() as ctx: # test implicit with cog.submit(ctx) as command_task: with pytest.raises(asyncio.CancelledError): await bot.get_command('jsk cancel').callback(cog, ctx, index=-1) await asyncio.sleep(0.1) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert f"Cancelled task {command_task.index}" in text with utils.mock_ctx() as ctx: # test unknown task with cog.submit(ctx) as command_task: await bot.get_command('jsk cancel').callback( cog, ctx, index=123456789012345678) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "Unknown task" in text with utils.mock_ctx() as ctx: # test no tasks await bot.get_command('jsk cancel').callback(cog, ctx, index=123456789012345678) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "No tasks" in text # test 'jsk retain' cog.retain = False with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=True) assert cog.retain ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "is ON" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=True) assert cog.retain ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "already set to ON" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=None) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "is set to ON" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=False) assert not cog.retain ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "is OFF" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=False) assert not cog.retain ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "already set to OFF" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=None) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "is set to OFF" in text
async def test_commands(bot): cog = bot.get_cog("Jishaku") # test 'jsk' with utils.mock_ctx() as ctx: await bot.get_command('jsk').callback(cog, ctx) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "Module was loaded" in text # test 'jsk hide' and 'jsk show' cog.jsk.hidden = False with utils.mock_ctx() as ctx: await bot.get_command('jsk hide').callback(cog, ctx) assert cog.jsk.hidden ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "now hidden" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk hide').callback(cog, ctx) assert cog.jsk.hidden ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "already hidden" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk show').callback(cog, ctx) assert not cog.jsk.hidden ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "now visible" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk show').callback(cog, ctx) assert not cog.jsk.hidden ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "already visible" in text # test 'jsk retain' cog.retain = False with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=True) assert cog.retain ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "is ON" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=True) assert cog.retain ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "already set to ON" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=None) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "is set to ON" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=False) assert not cog.retain ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "is OFF" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=False) assert not cog.retain ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "already set to OFF" in text with utils.mock_ctx() as ctx: await bot.get_command('jsk retain').callback(cog, ctx, toggle=None) ctx.send.assert_called_once() text = ctx.send.call_args[0][0] assert "is set to OFF" in text