From a77835a7d966c0dd4dd1c00f74ede252a80e8c36 Mon Sep 17 00:00:00 2001 From: Greg Eremeev Date: Fri, 25 Oct 2024 18:27:58 -0300 Subject: [PATCH] Fix reuse of captions during send msg with file (#4500) --- telethon/client/messages.py | 3 ++ tests/telethon/client/test_messages.py | 43 ++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/telethon/client/messages.py b/telethon/client/messages.py index 0c61a908..5dcd2ee6 100644 --- a/telethon/client/messages.py +++ b/telethon/client/messages.py @@ -826,6 +826,9 @@ class MessageMethods: await client.send_message(chat, 'Hi, future!', schedule=timedelta(minutes=5)) """ if file is not None: + if isinstance(message, types.Message): + formatting_entities = formatting_entities or message.entities + message = message.message return await self.send_file( entity, file, caption=message, reply_to=reply_to, attributes=attributes, parse_mode=parse_mode, diff --git a/tests/telethon/client/test_messages.py b/tests/telethon/client/test_messages.py index d47fcf45..2bdbb9e7 100644 --- a/tests/telethon/client/test_messages.py +++ b/tests/telethon/client/test_messages.py @@ -1,8 +1,12 @@ import inspect +from unittest import mock +from unittest.mock import MagicMock import pytest from telethon import TelegramClient +from telethon.client import MessageMethods +from telethon.tl.types import PeerChat, MessageMediaDocument, Message, MessageEntityBold @pytest.mark.asyncio @@ -38,3 +42,42 @@ async def test_send_message_with_file_forwards_args(): client = MockedClient() assert (await client.send_message('a', file='b', **arguments)) == sentinel + + +class TestMessageMethods: + @pytest.mark.asyncio + @pytest.mark.parametrize( + 'formatting_entities', + ([MessageEntityBold(offset=0, length=0)], None) + ) + async def test_send_msg_and_file(self, formatting_entities): + async def async_func(result): # AsyncMock was added only in 3.8 + return result + msg_methods = MessageMethods() + expected_result = Message( + id=0, peer_id=PeerChat(chat_id=0), message='', date=None, + ) + entity = 'test_entity' + message = Message( + id=1, peer_id=PeerChat(chat_id=0), message='expected_caption', date=None, + entities=[MessageEntityBold(offset=9, length=9)], + ) + media_file = MessageMediaDocument() + + with mock.patch.object( + target=MessageMethods, attribute='send_file', + new=MagicMock(return_value=async_func(expected_result)), create=True, + ) as mock_obj: + result = await msg_methods.send_message( + entity=entity, message=message, file=media_file, + formatting_entities=formatting_entities, + ) + mock_obj.assert_called_once_with( + entity, media_file, caption=message.message, + formatting_entities=formatting_entities or message.entities, + reply_to=None, silent=None, attributes=None, parse_mode=(), + force_document=False, thumb=None, buttons=None, + clear_draft=False, schedule=None, supports_streaming=False, + comment_to=None, background=None, nosound_video=None, + ) + assert result == expected_result