@@ -237,6 +237,71 @@ def test_parse_session_recordings_response_data_rejects_non_string_recording_key
237237 )
238238
239239
240+ def test_parse_session_recordings_response_data_wraps_recording_value_read_failures ():
241+ class _BrokenValueLookupMapping (Mapping [str , object ]):
242+ def __iter__ (self ) -> Iterator [str ]:
243+ yield "type"
244+
245+ def __len__ (self ) -> int :
246+ return 1
247+
248+ def __getitem__ (self , key : str ) -> object :
249+ _ = key
250+ raise RuntimeError ("cannot read recording value" )
251+
252+ with pytest .raises (
253+ HyperbrowserError ,
254+ match = "Failed to read session recording object value for key 'type' at index 0" ,
255+ ) as exc_info :
256+ parse_session_recordings_response_data ([_BrokenValueLookupMapping ()])
257+
258+ assert exc_info .value .original_error is not None
259+
260+
261+ def test_parse_session_recordings_response_data_sanitizes_recording_value_keys ():
262+ class _BrokenValueLookupMapping (Mapping [str , object ]):
263+ def __iter__ (self ) -> Iterator [str ]:
264+ yield "bad\t key"
265+
266+ def __len__ (self ) -> int :
267+ return 1
268+
269+ def __getitem__ (self , key : str ) -> object :
270+ _ = key
271+ raise RuntimeError ("cannot read recording value" )
272+
273+ with pytest .raises (
274+ HyperbrowserError ,
275+ match = (
276+ "Failed to read session recording object value "
277+ "for key 'bad\\ ?key' at index 0"
278+ ),
279+ ) as exc_info :
280+ parse_session_recordings_response_data ([_BrokenValueLookupMapping ()])
281+
282+ assert exc_info .value .original_error is not None
283+
284+
285+ def test_parse_session_recordings_response_data_preserves_hyperbrowser_value_read_errors ():
286+ class _BrokenValueLookupMapping (Mapping [str , object ]):
287+ def __iter__ (self ) -> Iterator [str ]:
288+ yield "type"
289+
290+ def __len__ (self ) -> int :
291+ return 1
292+
293+ def __getitem__ (self , key : str ) -> object :
294+ _ = key
295+ raise HyperbrowserError ("custom recording value read failure" )
296+
297+ with pytest .raises (
298+ HyperbrowserError , match = "custom recording value read failure"
299+ ) as exc_info :
300+ parse_session_recordings_response_data ([_BrokenValueLookupMapping ()])
301+
302+ assert exc_info .value .original_error is None
303+
304+
240305def test_parse_session_recordings_response_data_wraps_unreadable_list_iteration ():
241306 class _BrokenRecordingList (list ):
242307 def __iter__ (self ):
0 commit comments