From 158eb32686cdaebae6737d6874060b14b2d6eda4 Mon Sep 17 00:00:00 2001 From: hharry11 Date: Mon, 27 Apr 2026 17:15:38 +0300 Subject: [PATCH] fix(gateway): preserve document type when merging queued events --- gateway/platforms/base.py | 5 ++++ tests/gateway/test_session_race_guard.py | 33 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/gateway/platforms/base.py b/gateway/platforms/base.py index 417893fea2..3575220575 100644 --- a/gateway/platforms/base.py +++ b/gateway/platforms/base.py @@ -1034,6 +1034,11 @@ def merge_pending_message_event( existing.text = event.text if existing_is_photo or incoming_is_photo: existing.message_type = MessageType.PHOTO + elif ( + getattr(existing, "message_type", None) == MessageType.TEXT + and event.message_type != MessageType.TEXT + ): + existing.message_type = event.message_type return if ( diff --git a/tests/gateway/test_session_race_guard.py b/tests/gateway/test_session_race_guard.py index fe1ef011a3..152a170476 100644 --- a/tests/gateway/test_session_race_guard.py +++ b/tests/gateway/test_session_race_guard.py @@ -226,6 +226,39 @@ def test_merge_pending_message_event_merges_text_and_photo_followups(): assert merged.media_types == ["image/png"] +def test_merge_pending_message_event_promotes_document_followups_over_text(): + pending = {} + source = SessionSource( + platform=Platform.TELEGRAM, + chat_id="12345", + chat_type="dm", + user_id="u1", + ) + session_key = build_session_key(source) + + text_event = MessageEvent( + text="please review this", + message_type=MessageType.TEXT, + source=source, + ) + document_event = MessageEvent( + text="", + message_type=MessageType.DOCUMENT, + source=source, + media_urls=["/tmp/report.pdf"], + media_types=["application/pdf"], + ) + + merge_pending_message_event(pending, session_key, text_event, merge_text=True) + merge_pending_message_event(pending, session_key, document_event, merge_text=True) + + merged = pending[session_key] + assert merged.message_type == MessageType.DOCUMENT + assert merged.text == "please review this" + assert merged.media_urls == ["/tmp/report.pdf"] + assert merged.media_types == ["application/pdf"] + + @pytest.mark.asyncio async def test_recent_telegram_text_followup_is_queued_without_interrupt(): runner = _make_runner()