Example #1
0
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
Example #2
0
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},)
Example #3
0
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
Example #4
0
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)
Example #5
0
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
Example #6
0
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
Example #7
0
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