Skip to content

Commit 2b47630

Browse files
test: cover turn complete fallback in ADK agent
1 parent 603e294 commit 2b47630

File tree

1 file changed

+65
-1
lines changed

1 file changed

+65
-1
lines changed

typescript-sdk/integrations/adk-middleware/python/tests/test_adk_agent.py

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from unittest.mock import Mock, MagicMock, AsyncMock, patch
88

99

10-
from ag_ui_adk import ADKAgent, SessionManager
10+
from ag_ui_adk import ADKAgent, SessionManager, EventTranslator
1111
from ag_ui.core import (
1212
RunAgentInput, EventType, UserMessage, Context,
1313
RunStartedEvent, RunFinishedEvent, TextMessageChunkEvent, SystemMessage
@@ -137,6 +137,70 @@ async def mock_run_async(*args, **kwargs):
137137
assert events[0].type == EventType.RUN_STARTED
138138
assert events[-1].type == EventType.RUN_FINISHED
139139

140+
@pytest.mark.asyncio
141+
async def test_turn_complete_falls_back_to_streaming_translator(
142+
self,
143+
adk_agent,
144+
sample_input,
145+
):
146+
"""Ensure turn_complete=False triggers streaming translation path."""
147+
148+
streaming_calls = []
149+
lro_calls = []
150+
151+
async def fake_translate(self, adk_event, thread_id, run_id):
152+
streaming_calls.append((adk_event, thread_id, run_id))
153+
yield TextMessageChunkEvent(
154+
message_id=adk_event.id,
155+
role="assistant",
156+
delta="streamed chunk",
157+
)
158+
159+
async def fake_translate_lro(self, adk_event):
160+
lro_calls.append(adk_event)
161+
if False: # pragma: no cover - required to keep async generator signature
162+
yield None
163+
164+
mock_event = Mock()
165+
mock_event.id = "event_stream"
166+
mock_event.author = "assistant"
167+
mock_event.partial = False
168+
mock_event.turn_complete = False
169+
mock_event.finish_reason = "STOP"
170+
mock_event.usage_metadata = {"tokens": 5}
171+
mock_event.is_final_response = Mock(return_value=True)
172+
mock_event.content = Mock()
173+
mock_event.content.parts = [Mock(text="Final response chunk")]
174+
mock_event.actions = None
175+
mock_event.get_function_calls = Mock(return_value=[])
176+
mock_event.get_function_responses = Mock(return_value=[])
177+
mock_event.custom_data = None
178+
179+
class DummyRunner:
180+
async def run_async(self, *args, **kwargs):
181+
yield mock_event
182+
183+
with patch.object(adk_agent, '_create_runner', return_value=DummyRunner()), \
184+
patch.object(EventTranslator, 'translate', new=fake_translate), \
185+
patch.object(EventTranslator, 'translate_lro_function_calls', new=fake_translate_lro):
186+
187+
events = []
188+
async for event in adk_agent.run(sample_input):
189+
events.append(event)
190+
191+
# Verify run lifecycle events emitted
192+
assert events[0].type == EventType.RUN_STARTED
193+
assert events[-1].type == EventType.RUN_FINISHED
194+
195+
# Ensure streaming translator branch handled the event
196+
chunk_events = [event for event in events if isinstance(event, TextMessageChunkEvent)]
197+
assert chunk_events, "Expected translated chunk event"
198+
assert chunk_events[0].delta == "streamed chunk"
199+
200+
# Confirm branch selection
201+
assert len(streaming_calls) == 1
202+
assert lro_calls == []
203+
140204
@pytest.mark.asyncio
141205
async def test_session_management(self, adk_agent):
142206
"""Test session lifecycle management."""

0 commit comments

Comments
 (0)