@@ -170,9 +170,36 @@ def test_session_ids_must_be_canonical_random_uuids():
170170 assert not is_valid_session_id ('00000000-0000-0000-0000-000000000000' )
171171
172172
173+ def test_history_read_does_not_allocate_unknown_session ():
174+ adapter = WebSocketAdapter .model_construct (ap = Mock (), logger = AsyncMock ())
175+ adapter .websocket_person_session = WebSocketSession (id = 'person' )
176+ adapter .websocket_group_session = WebSocketSession (id = 'group' )
177+
178+ assert adapter .get_websocket_messages ('pipeline-1' , 'person' , 'missing-session' ) == []
179+ assert adapter .websocket_person_session .message_lists == {}
180+
181+
173182def test_history_and_reset_are_scoped_to_browser_session ():
183+ matching_provider_session = Mock (
184+ launcher_type = Mock (value = 'person' ),
185+ launcher_id = 'websocket_pipeline-1:session-a' ,
186+ )
187+ matching_group_provider_session = Mock (
188+ launcher_type = Mock (value = 'group' ),
189+ launcher_id = 'websocketgroup_pipeline-1:session-a' ,
190+ )
191+ other_session = Mock (
192+ launcher_type = Mock (value = 'person' ),
193+ launcher_id = 'websocket_pipeline-1:session-b' ,
194+ )
195+ ap = Mock ()
196+ ap .sess_mgr .session_list = [
197+ matching_provider_session ,
198+ matching_group_provider_session ,
199+ other_session ,
200+ ]
174201 adapter = WebSocketAdapter .model_construct (
175- ap = Mock () ,
202+ ap = ap ,
176203 logger = AsyncMock (),
177204 )
178205 adapter .websocket_person_session = Mock ()
@@ -207,6 +234,8 @@ def test_history_and_reset_are_scoped_to_browser_session():
207234 adapter .websocket_person_session .get_message_list .side_effect = histories .__getitem__
208235 adapter .websocket_person_session .message_lists = histories
209236 adapter .websocket_person_session .stream_message_indexes = stream_indexes
237+ adapter .websocket_group_session .message_lists = {}
238+ adapter .websocket_group_session .stream_message_indexes = {}
210239
211240 assert adapter .get_websocket_messages ('pipeline-1' , 'person' , 'session-a' )[0 ]['content' ] == 'private-a'
212241 assert adapter .get_websocket_messages ('pipeline-1' , 'person' , 'session-b' )[0 ]['content' ] == 'private-b'
@@ -217,6 +246,11 @@ def test_history_and_reset_are_scoped_to_browser_session():
217246 assert stream_indexes ['pipeline-1:session-a' ] == {}
218247 assert histories ['pipeline-1:session-b' ] == session_b
219248 assert stream_indexes ['pipeline-1:session-b' ] == {'response-b' : 0 }
249+ assert ap .sess_mgr .session_list == [matching_group_provider_session , other_session ]
250+
251+ adapter .reset_session ('pipeline-1' , 'group' , 'session-a' )
252+
253+ assert ap .sess_mgr .session_list == [other_session ]
220254
221255
222256def test_widget_sends_stable_session_id_to_all_conversation_endpoints ():
@@ -228,3 +262,6 @@ def test_widget_sends_stable_session_id_to_all_conversation_endpoints():
228262 assert 'window.localStorage' not in widget
229263 assert 'session_id=' in widget
230264 assert widget .count ('encodeURIComponent(state.sessionId)' ) >= 3
265+ assert 'loadHistory(true)' in widget
266+ assert 'messageVersion !== state.messageVersion' in widget
267+ assert 'scheduleHistoryReload();' in widget
0 commit comments