fix: keep rapid telegram follow-ups from getting cut off
This commit is contained in:
committed by
Teknium
parent
12b109b664
commit
9a9b8cd1e4
@@ -14,7 +14,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
|
||||
import pytest
|
||||
|
||||
from gateway.config import GatewayConfig, Platform, PlatformConfig
|
||||
from gateway.platforms.base import MessageEvent, MessageType
|
||||
from gateway.platforms.base import MessageEvent, MessageType, merge_pending_message_event
|
||||
from gateway.run import GatewayRunner, _AGENT_PENDING_SENTINEL
|
||||
from gateway.session import SessionSource, build_session_key
|
||||
|
||||
@@ -184,6 +184,80 @@ async def test_second_message_during_sentinel_queued_not_duplicate():
|
||||
await task1
|
||||
|
||||
|
||||
def test_merge_pending_message_event_merges_text_and_photo_followups():
|
||||
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="first follow-up",
|
||||
message_type=MessageType.TEXT,
|
||||
source=source,
|
||||
)
|
||||
photo_event = MessageEvent(
|
||||
text="see screenshot",
|
||||
message_type=MessageType.PHOTO,
|
||||
source=source,
|
||||
media_urls=["/tmp/test.png"],
|
||||
media_types=["image/png"],
|
||||
)
|
||||
|
||||
merge_pending_message_event(pending, session_key, text_event, merge_text=True)
|
||||
merge_pending_message_event(pending, session_key, photo_event, merge_text=True)
|
||||
|
||||
merged = pending[session_key]
|
||||
assert merged.message_type == MessageType.PHOTO
|
||||
assert merged.text == "first follow-up\n\nsee screenshot"
|
||||
assert merged.media_urls == ["/tmp/test.png"]
|
||||
assert merged.media_types == ["image/png"]
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_recent_telegram_text_followup_is_queued_without_interrupt():
|
||||
runner = _make_runner()
|
||||
event = _make_event(text="follow-up")
|
||||
session_key = build_session_key(event.source)
|
||||
|
||||
fake_agent = MagicMock()
|
||||
fake_agent.get_activity_summary.return_value = {"seconds_since_activity": 0}
|
||||
runner._running_agents[session_key] = fake_agent
|
||||
import time as _time
|
||||
runner._running_agents_ts[session_key] = _time.time()
|
||||
|
||||
result = await runner._handle_message(event)
|
||||
|
||||
assert result is None
|
||||
fake_agent.interrupt.assert_not_called()
|
||||
adapter = runner.adapters[Platform.TELEGRAM]
|
||||
assert adapter._pending_messages[session_key].text == "follow-up"
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_recent_telegram_followups_append_in_pending_queue():
|
||||
runner = _make_runner()
|
||||
first = _make_event(text="part one")
|
||||
second = _make_event(text="part two")
|
||||
session_key = build_session_key(first.source)
|
||||
|
||||
fake_agent = MagicMock()
|
||||
fake_agent.get_activity_summary.return_value = {"seconds_since_activity": 0}
|
||||
runner._running_agents[session_key] = fake_agent
|
||||
import time as _time
|
||||
runner._running_agents_ts[session_key] = _time.time()
|
||||
|
||||
await runner._handle_message(first)
|
||||
await runner._handle_message(second)
|
||||
|
||||
fake_agent.interrupt.assert_not_called()
|
||||
adapter = runner.adapters[Platform.TELEGRAM]
|
||||
assert adapter._pending_messages[session_key].text == "part one\npart two"
|
||||
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Test 5: Sentinel not placed for command messages
|
||||
# ------------------------------------------------------------------
|
||||
@@ -273,6 +347,7 @@ async def test_stop_hard_kills_running_agent():
|
||||
|
||||
# Simulate a running (possibly hung) agent
|
||||
fake_agent = MagicMock()
|
||||
fake_agent.get_activity_summary.return_value = {"seconds_since_activity": 0}
|
||||
runner._running_agents[session_key] = fake_agent
|
||||
|
||||
# Send /stop
|
||||
@@ -305,6 +380,7 @@ async def test_stop_clears_pending_messages():
|
||||
)
|
||||
|
||||
fake_agent = MagicMock()
|
||||
fake_agent.get_activity_summary.return_value = {"seconds_since_activity": 0}
|
||||
runner._running_agents[session_key] = fake_agent
|
||||
runner._pending_messages[session_key] = "some queued text"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user