@@ -195,18 +195,17 @@ async def test_translate_text_content_basic(self, translator, mock_adk_event_wit
195
195
async for event in translator .translate (mock_adk_event_with_content , "thread_1" , "run_1" ):
196
196
events .append (event )
197
197
198
- assert len (events ) == 2 # START, CONTENT
198
+ assert len (events ) == 3 # START, CONTENT, END
199
199
assert isinstance (events [0 ], TextMessageStartEvent )
200
200
assert isinstance (events [1 ], TextMessageContentEvent )
201
+ assert isinstance (events [2 ], TextMessageEndEvent )
201
202
202
203
# Check content
203
204
assert events [1 ].delta == "Test content"
204
205
205
206
# Check message IDs are consistent
206
207
message_id = events [0 ].message_id
207
208
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 )
210
209
211
210
@pytest .mark .asyncio
212
211
async def test_translate_text_content_multiple_parts (self , translator , mock_adk_event ):
@@ -223,10 +222,10 @@ async def test_translate_text_content_multiple_parts(self, translator, mock_adk_
223
222
async for event in translator .translate (mock_adk_event , "thread_1" , "run_1" ):
224
223
events .append (event )
225
224
226
- assert len (events ) == 2 # START, CONTENT
225
+ assert len (events ) == 3 # START, CONTENT, END
227
226
assert isinstance (events [1 ], TextMessageContentEvent )
228
227
assert events [1 ].delta == "First partSecond part" # Joined without newlines
229
- assert all ( not isinstance (event , TextMessageEndEvent ) for event in events )
228
+ assert isinstance (events [ 2 ] , TextMessageEndEvent )
230
229
231
230
@pytest .mark .asyncio
232
231
async def test_translate_text_content_partial_streaming (self , translator , mock_adk_event_with_content ):
@@ -238,10 +237,10 @@ async def test_translate_text_content_partial_streaming(self, translator, mock_a
238
237
async for event in translator .translate (mock_adk_event_with_content , "thread_1" , "run_1" ):
239
238
events .append (event )
240
239
241
- assert len (events ) == 2 # START, CONTENT
240
+ assert len (events ) == 3 # START, CONTENT, END (forced close)
242
241
assert isinstance (events [0 ], TextMessageStartEvent )
243
242
assert isinstance (events [1 ], TextMessageContentEvent )
244
- assert all ( not isinstance (event , TextMessageEndEvent ) for event in events )
243
+ assert isinstance (events [ 2 ] , TextMessageEndEvent )
245
244
246
245
@pytest .mark .asyncio
247
246
async def test_translate_text_content_final_response_callable (self , translator , mock_adk_event_with_content ):
@@ -363,9 +362,9 @@ async def test_translate_text_content_mixed_text_parts(self, translator, mock_ad
363
362
async for event in translator .translate (mock_adk_event , "thread_1" , "run_1" ):
364
363
events .append (event )
365
364
366
- assert len (events ) == 2 # START, CONTENT
365
+ assert len (events ) == 3 # START, CONTENT, END
367
366
assert events [1 ].delta == "Valid textMore text"
368
- assert all ( not isinstance (event , TextMessageEndEvent ) for event in events )
367
+ assert isinstance (events [ 2 ] , TextMessageEndEvent )
369
368
370
369
@pytest .mark .asyncio
371
370
async def test_translate_function_calls_basic (self , translator , mock_adk_event ):
@@ -651,23 +650,24 @@ async def test_streaming_state_management(self, translator, mock_adk_event_with_
651
650
async for event in translator .translate (mock_adk_event_with_content , "thread_1" , "run_1" ):
652
651
events1 .append (event )
653
652
654
- assert len (events1 ) == 2 # START, CONTENT (stream stays open )
653
+ assert len (events1 ) == 3 # START, CONTENT, END (forced close at translate completion )
655
654
message_id = events1 [0 ].message_id
656
655
657
- # Stream remains active until completion signal
658
- assert translator ._is_streaming is True
659
- assert translator ._streaming_message_id == message_id
656
+ # Stream is closed after forced END
657
+ assert translator ._is_streaming is False
658
+ assert translator ._streaming_message_id is None
660
659
661
- # Second event should append to the same stream (content only)
660
+ # Second event should start a new stream with a new message ID
662
661
events2 = []
663
662
async for event in translator .translate (mock_adk_event_with_content , "thread_1" , "run_1" ):
664
663
events2 .append (event )
665
664
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
665
+ assert len (events2 ) == 3 # START, CONTENT, END
666
+ assert isinstance (events2 [0 ], TextMessageStartEvent )
667
+ assert events2 [0 ].message_id != message_id
668
+ assert isinstance (events2 [2 ], TextMessageEndEvent )
669
+ assert translator ._is_streaming is False
670
+ assert translator ._streaming_message_id is None
671
671
672
672
@pytest .mark .asyncio
673
673
async def test_complex_event_with_multiple_features (self , translator , mock_adk_event ):
@@ -691,16 +691,16 @@ async def test_complex_event_with_multiple_features(self, translator, mock_adk_e
691
691
async for event in translator .translate (mock_adk_event , "thread_1" , "run_1" ):
692
692
events .append (event )
693
693
694
- # Should have text events, state delta, and custom event (stream remains open)
695
- assert len (events ) == 4 # START, CONTENT, STATE_DELTA, CUSTOM
694
+ # Should have text events, state delta, custom event, and END
695
+ assert len (events ) == 5 # START, CONTENT, STATE_DELTA, CUSTOM, END
696
696
697
697
# Check event types
698
698
event_types = [type (event ) for event in events ]
699
699
assert TextMessageStartEvent in event_types
700
700
assert TextMessageContentEvent in event_types
701
701
assert StateDeltaEvent in event_types
702
702
assert CustomEvent in event_types
703
- assert TextMessageEndEvent not in event_types
703
+ assert TextMessageEndEvent in event_types
704
704
705
705
@pytest .mark .asyncio
706
706
async def test_event_logging_coverage (self , translator , mock_adk_event_with_content ):
@@ -771,8 +771,8 @@ async def test_partial_streaming_continuation(self, translator, mock_adk_event_w
771
771
async for event in translator .translate (mock_adk_event_with_content , "thread_1" , "run_1" ):
772
772
events1 .append (event )
773
773
774
- assert len (events1 ) == 2 # START, CONTENT
775
- assert translator ._is_streaming is True
774
+ assert len (events1 ) == 3 # START, CONTENT, END (forced close)
775
+ assert translator ._is_streaming is False
776
776
message_id = events1 [0 ].message_id
777
777
778
778
# Second partial event (should continue streaming)
@@ -783,11 +783,13 @@ async def test_partial_streaming_continuation(self, translator, mock_adk_event_w
783
783
async for event in translator .translate (mock_adk_event_with_content , "thread_1" , "run_1" ):
784
784
events2 .append (event )
785
785
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
786
+ assert len (events2 ) == 3 # New START, CONTENT, END for continuation
787
+ assert isinstance (events2 [0 ], TextMessageStartEvent )
788
+ assert isinstance (events2 [1 ], TextMessageContentEvent )
789
+ assert isinstance (events2 [2 ], TextMessageEndEvent )
790
+ assert translator ._is_streaming is False
791
+ new_message_id = events2 [0 ].message_id
792
+ assert new_message_id != message_id
791
793
792
794
# Final event (should end streaming - requires is_final_response=True)
793
795
mock_adk_event_with_content .partial = False
@@ -798,9 +800,7 @@ async def test_partial_streaming_continuation(self, translator, mock_adk_event_w
798
800
async for event in translator .translate (mock_adk_event_with_content , "thread_1" , "run_1" ):
799
801
events3 .append (event )
800
802
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
803
+ assert len (events3 ) == 0 # Already emitted END in previous translate
804
804
805
805
# Should reset streaming state
806
806
assert translator ._is_streaming is False
0 commit comments