async def test_prompt_for_input_attachment(rfr_cog, utils_cog): config: dpytest.RunnerConfig = dpytest.get_config() author: discord.Member = config.members[0] guild: discord.Guild = config.guilds[0] channel: discord.TextChannel = guild.text_channels[0] await dpytest.message(koalabot.COMMAND_PREFIX + "store_ctx") ctx: commands.Context = utils_cog.get_last_ctx() await dpytest.empty_queue() attach: discord.Attachment = discord.Attachment( state=dpytest.back.get_state(), data=dpytest.back.facts.make_attachment_dict( "test.jpg", 15112122, "https://media.discordapp.net/attachments/some_number/random_number/test.jpg", "https://media.discordapp.net/attachments/some_number/random_number/test.jpg", height=1000, width=1000)) message_dict = dpytest.back.facts.make_message_dict(channel, author, attachments=[attach]) message: discord.Message = discord.Message(state=dpytest.back.get_state(), channel=channel, data=message_dict) with mock.patch('discord.client.Client.wait_for', mock.AsyncMock(return_value=message)): result = await rfr_cog.prompt_for_input(ctx, "test") assert dpytest.verify().message().content( "Please enter test so I can progress further. I'll wait 60 seconds, don't worry." ) assert isinstance(result, discord.Attachment) assert result.url == attach.url
async def _test_deepfry(self, ctx: commands.Context) -> None: # Get !deepfry command deepfry_cmd = self.bot.get_command("deepfry") url = "https://cdn.discordapp.com/attachments/560503336013529091/566615384808095754/Gfw036Q.png" # Test command with URL argument print(f"Testing {self.pfix}deepfry with URL.") await self.do_test_command(ctx, deepfry_cmd, "-url", url) # Sleep between image uploads to be nice to Discord await asyncio.sleep(5) attachment = discord.Attachment(data={ "filename": "Gfw036Q.png", "height": 715, "id": 666, "proxy_url": "https://media.discordapp.net/attachments/560503336013529091/566615384808095754/Gfw036Q.png", "size": 216770, "url": url, "width": 720 }, state=Mock(http=None)) # Attach attachment to ctx.message ctx.message.attachments.append(attachment) # Test with message attachment print(f"Testing {self.pfix}deepfry with attachment.") await self.do_test_command(ctx, deepfry_cmd)
def make_attachment(filename, name=None, id_num=-1): if name is None: name = str(filename.name) if not filename.is_file(): raise ValueError("Attachment must be a real file") size = filename.stat().st_size file_uri = filename.absolute().as_uri() return discord.Attachment(state=get_state(), data=facts.make_attachment_dict( name, size, file_uri, file_uri, id_num))
def make_attachment(filename: pathlib.Path, name: typing.Optional[str] = None, id_num: int = -1) -> discord.Attachment: if name is None: name = str(filename.name) if not filename.is_file(): raise ValueError("Attachment must be a real file") size = filename.stat().st_size file_uri = filename.absolute().as_uri() return discord.Attachment( state=get_state(), data=facts.make_attachment_dict(name, size, file_uri, file_uri, id_num) )
async def message( content: str, channel: typing.Union[_types.AnyChannel, int] = 0, member: typing.Union[discord.Member, int] = 0, attachments: typing.List[typing.Union[pathlib.Path, str]] = None ) -> discord.Message: """ Fake a message being sent by some user to a channel. :param content: Content of the message :param channel: Channel to send to, or index into the config list :param member: Member sending the message, or index into the config list :param attachments: Message attachments to include, as file paths. :return: New message that was sent """ if isinstance(channel, int): channel = _cur_config.channels[channel] if isinstance(member, int): member = _cur_config.members[member] import os if attachments is None: attachments = [] attachments = [ discord.Attachment( data={ 'id': counter.__next__(), 'filename': os.path.basename(attachment), 'size': 0, 'url': attachment, 'proxy_url': "", 'height': 0, 'width': 0 }, state=back.get_state() ) for attachment in attachments ] mes = back.make_message(content, member, channel, attachments=attachments) await run_all_events() if not error_queue.empty(): err = await error_queue.get() raise err[1] return mes
async def test_rfr_edit_thumbnail_attach(): 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") embed.set_thumbnail( url= "https://media.discordapp.net/attachments/611574654502699010/756152703801098280/IMG_20200917_150032.jpg" ) message: discord.Message = await dpytest.message("rfr") attach: discord.Attachment = discord.Attachment( state=dpytest.back.get_state(), data=dpytest.back.facts.make_attachment_dict( "test.jpg", -1, "https://media.discordapp.net/attachments/some_number/random_number/test.jpg", "https://media.discordapp.net/attachments/some_number/random_number/test.jpg", height=1000, width=1000, content_type="image/jpeg")) msg_id = message.id bad_attach = "something that's not an attachment" DBManager.add_rfr_message(guild.id, channel.id, msg_id) assert embed.thumbnail.url == "https://media.discordapp.net/attachments/611574654502699010/756152703801098280/IMG_20200917_150032.jpg" 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('koala.cogs.ReactForRole.prompt_for_input', return_value=attach): await dpytest.message("k!rfr edit image") assert embed.thumbnail.url == "https://media.discordapp.net/attachments/some_number/random_number/test.jpg" embed.set_thumbnail( url= "https://media.discordapp.net/attachments/611574654502699010/756152703801098280/IMG_20200917_150032.jpg" )
async def test_member_join(bot): """Dont use this in your code, it's just dummy test. Use verify_message() instead of 'get_message' and 'message.content' """ guild = bot.guilds[0] author: discord.Member = guild.members[0] channel = guild.channels[0] attach: discord.Attachment = discord.Attachment( state=dpytest.back.get_state(), data=dpytest.back.facts.make_attachment_dict( "test.jpg", 15112122, "https://media.discordapp.net/attachments/some_number/random_number/test.jpg", "https://media.discordapp.net/attachments/some_number/random_number/test.jpg", height=1000, width=1000, content_type="image/jpeg" ) ) message_dict = dpytest.back.facts.make_message_dict(channel, author, attachments=[attach]) try: message: discord.Message = discord.Message(state=dpytest.back.get_state(), channel=channel, data=message_dict) except Exception as err: pytest.fail(str(err))
A MagicMock subclass to mock Context objects. Instances of this class will follow the specifications of `discord.ext.commands.Context` instances. For more information, see the `MockGuild` docstring. """ spec_set = context_instance def __init__(self, **kwargs) -> None: super().__init__(**kwargs) self.bot = kwargs.get('bot', MockBot()) self.guild = kwargs.get('guild', MockGuild()) self.author = kwargs.get('author', MockMember()) self.channel = kwargs.get('channel', MockTextChannel()) attachment_instance = discord.Attachment(data=unittest.mock.MagicMock(id=1), state=unittest.mock.MagicMock()) class MockAttachment(CustomMockMixin, unittest.mock.MagicMock): """ A MagicMock subclass to mock Attachment objects. Instances of this class will follow the specifications of `discord.Attachment` instances. For more information, see the `MockGuild` docstring. """ spec_set = attachment_instance class MockMessage(CustomMockMixin, unittest.mock.MagicMock): """ A MagicMock subclass to mock Message objects.