Skip to content

Commit 4dde1b0

Browse files
tests: align EventTranslator streaming expectations
1 parent eb79c97 commit 4dde1b0

File tree

1 file changed

+33
-23
lines changed

1 file changed

+33
-23
lines changed

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

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -195,17 +195,18 @@ async def test_translate_text_content_basic(self, translator, mock_adk_event_wit
195195
async for event in translator.translate(mock_adk_event_with_content, "thread_1", "run_1"):
196196
events.append(event)
197197

198-
assert len(events) == 3 # START, CONTENT , END
198+
assert len(events) == 2 # START, CONTENT
199199
assert isinstance(events[0], TextMessageStartEvent)
200200
assert isinstance(events[1], TextMessageContentEvent)
201-
assert isinstance(events[2], TextMessageEndEvent)
202201

203202
# Check content
204203
assert events[1].delta == "Test content"
205204

206205
# Check message IDs are consistent
207206
message_id = events[0].message_id
208207
assert events[1].message_id == message_id
208+
# No END event emitted for non-final, non-turn-complete content
209+
assert all(not isinstance(event, TextMessageEndEvent) for event in events)
209210

210211
@pytest.mark.asyncio
211212
async def test_translate_text_content_multiple_parts(self, translator, mock_adk_event):
@@ -222,9 +223,10 @@ async def test_translate_text_content_multiple_parts(self, translator, mock_adk_
222223
async for event in translator.translate(mock_adk_event, "thread_1", "run_1"):
223224
events.append(event)
224225

225-
assert len(events) == 3 # START, CONTENT , END
226+
assert len(events) == 2 # START, CONTENT
226227
assert isinstance(events[1], TextMessageContentEvent)
227228
assert events[1].delta == "First partSecond part" # Joined without newlines
229+
assert all(not isinstance(event, TextMessageEndEvent) for event in events)
228230

229231
@pytest.mark.asyncio
230232
async def test_translate_text_content_partial_streaming(self, translator, mock_adk_event_with_content):
@@ -236,9 +238,10 @@ async def test_translate_text_content_partial_streaming(self, translator, mock_a
236238
async for event in translator.translate(mock_adk_event_with_content, "thread_1", "run_1"):
237239
events.append(event)
238240

239-
assert len(events) == 3 # START, CONTENT , END
241+
assert len(events) == 2 # START, CONTENT
240242
assert isinstance(events[0], TextMessageStartEvent)
241243
assert isinstance(events[1], TextMessageContentEvent)
244+
assert all(not isinstance(event, TextMessageEndEvent) for event in events)
242245

243246
@pytest.mark.asyncio
244247
async def test_translate_text_content_final_response_callable(self, translator, mock_adk_event_with_content):
@@ -304,7 +307,7 @@ async def test_translate_text_content_final_response_from_agent_callback(self, t
304307
async for event in translator.translate(mock_adk_event_with_content, "thread_1", "run_1"):
305308
events.append(event)
306309

307-
assert len(events) == 3 # START, CONTENT , END
310+
assert len(events) == 3 # START, CONTENT, END (non-streaming final response)
308311
assert isinstance(events[0], TextMessageStartEvent)
309312
assert isinstance(events[1], TextMessageContentEvent)
310313
assert events[1].delta == mock_adk_event_with_content.content.parts[0].text
@@ -360,8 +363,9 @@ async def test_translate_text_content_mixed_text_parts(self, translator, mock_ad
360363
async for event in translator.translate(mock_adk_event, "thread_1", "run_1"):
361364
events.append(event)
362365

363-
assert len(events) == 3 # START, CONTENT , END
366+
assert len(events) == 2 # START, CONTENT
364367
assert events[1].delta == "Valid textMore text"
368+
assert all(not isinstance(event, TextMessageEndEvent) for event in events)
365369

366370
@pytest.mark.asyncio
367371
async def test_translate_function_calls_basic(self, translator, mock_adk_event):
@@ -647,21 +651,23 @@ async def test_streaming_state_management(self, translator, mock_adk_event_with_
647651
async for event in translator.translate(mock_adk_event_with_content, "thread_1", "run_1"):
648652
events1.append(event)
649653

650-
assert len(events1) == 3 # START, CONTENT, END
654+
assert len(events1) == 2 # START, CONTENT (stream stays open)
651655
message_id = events1[0].message_id
652656

653-
# streaming is stoped after TextMessageEndEvent
654-
assert translator._is_streaming is False
655-
# since the streaming is stopped
656-
assert translator._streaming_message_id == None
657+
# Stream remains active until completion signal
658+
assert translator._is_streaming is True
659+
assert translator._streaming_message_id == message_id
657660

658-
# Second event should continue streaming (same message ID)
661+
# Second event should append to the same stream (content only)
659662
events2 = []
660663
async for event in translator.translate(mock_adk_event_with_content, "thread_1", "run_1"):
661664
events2.append(event)
662665

663-
assert len(events2) == 3 # New Streaming (START , CONTENT ,END)
664-
assert events2[0].message_id != message_id # Same message ID
666+
assert len(events2) == 1 # CONTENT only
667+
assert isinstance(events2[0], TextMessageContentEvent)
668+
assert events2[0].message_id == message_id
669+
assert translator._is_streaming is True
670+
assert translator._streaming_message_id == message_id
665671

666672
@pytest.mark.asyncio
667673
async def test_complex_event_with_multiple_features(self, translator, mock_adk_event):
@@ -685,16 +691,16 @@ async def test_complex_event_with_multiple_features(self, translator, mock_adk_e
685691
async for event in translator.translate(mock_adk_event, "thread_1", "run_1"):
686692
events.append(event)
687693

688-
# Should have text events, state delta, and custom event
689-
assert len(events) == 5 # START, CONTENT, STATE_DELTA, CUSTOM , END
694+
# Should have text events, state delta, and custom event (stream remains open)
695+
assert len(events) == 4 # START, CONTENT, STATE_DELTA, CUSTOM
690696

691697
# Check event types
692698
event_types = [type(event) for event in events]
693699
assert TextMessageStartEvent in event_types
694700
assert TextMessageContentEvent in event_types
695701
assert StateDeltaEvent in event_types
696702
assert CustomEvent in event_types
697-
assert TextMessageEndEvent in event_types
703+
assert TextMessageEndEvent not in event_types
698704

699705
@pytest.mark.asyncio
700706
async def test_event_logging_coverage(self, translator, mock_adk_event_with_content):
@@ -765,8 +771,8 @@ async def test_partial_streaming_continuation(self, translator, mock_adk_event_w
765771
async for event in translator.translate(mock_adk_event_with_content, "thread_1", "run_1"):
766772
events1.append(event)
767773

768-
assert len(events1) == 3 # START, CONTENT , END
769-
assert translator._is_streaming is False
774+
assert len(events1) == 2 # START, CONTENT
775+
assert translator._is_streaming is True
770776
message_id = events1[0].message_id
771777

772778
# Second partial event (should continue streaming)
@@ -777,9 +783,11 @@ async def test_partial_streaming_continuation(self, translator, mock_adk_event_w
777783
async for event in translator.translate(mock_adk_event_with_content, "thread_1", "run_1"):
778784
events2.append(event)
779785

780-
assert len(events2) == 3 # Will start from begining (START , CONTENT , END)
781-
assert isinstance(events2[1], TextMessageContentEvent)
782-
assert events2[0].message_id != message_id # Not the same message ID Because its a new streaming
786+
assert len(events2) == 1 # Additional CONTENT chunk
787+
assert isinstance(events2[0], TextMessageContentEvent)
788+
assert events2[0].message_id == message_id # Same stream continues
789+
assert translator._is_streaming is True
790+
assert translator._streaming_message_id == message_id
783791

784792
# Final event (should end streaming - requires is_final_response=True)
785793
mock_adk_event_with_content.partial = False
@@ -790,7 +798,9 @@ async def test_partial_streaming_continuation(self, translator, mock_adk_event_w
790798
async for event in translator.translate(mock_adk_event_with_content, "thread_1", "run_1"):
791799
events3.append(event)
792800

793-
assert len(events3) == 0 # No more message (turn Complete)
801+
assert len(events3) == 1 # Final END to close the stream
802+
assert isinstance(events3[0], TextMessageEndEvent)
803+
assert events3[0].message_id == message_id
794804

795805
# Should reset streaming state
796806
assert translator._is_streaming is False

0 commit comments

Comments
 (0)