Skip to content

Commit 6fbfbfc

Browse files
Wrap session recording iteration failures
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 4c23cef commit 6fbfbfc

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

hyperbrowser/client/managers/session_utils.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,17 @@ def parse_session_recordings_response_data(response_data: Any) -> List[SessionRe
1010
raise HyperbrowserError(
1111
"Expected session recording response to be a list of objects"
1212
)
13+
try:
14+
recording_items = list(response_data)
15+
except HyperbrowserError:
16+
raise
17+
except Exception as exc:
18+
raise HyperbrowserError(
19+
"Failed to iterate session recording response list",
20+
original_error=exc,
21+
) from exc
1322
parsed_recordings: List[SessionRecording] = []
14-
for index, recording in enumerate(response_data):
23+
for index, recording in enumerate(recording_items):
1524
if not isinstance(recording, Mapping):
1625
raise HyperbrowserError(
1726
"Expected session recording object at index "

tests/test_session_recording_utils.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,32 @@ def test_parse_session_recordings_response_data_wraps_invalid_items():
115115
assert exc_info.value.original_error is not None
116116

117117

118+
def test_parse_session_recordings_response_data_wraps_unreadable_list_iteration():
119+
class _BrokenRecordingList(list):
120+
def __iter__(self):
121+
raise RuntimeError("cannot iterate recordings")
122+
123+
with pytest.raises(
124+
HyperbrowserError, match="Failed to iterate session recording response list"
125+
) as exc_info:
126+
parse_session_recordings_response_data(_BrokenRecordingList([{}]))
127+
128+
assert exc_info.value.original_error is not None
129+
130+
131+
def test_parse_session_recordings_response_data_preserves_hyperbrowser_iteration_errors():
132+
class _BrokenRecordingList(list):
133+
def __iter__(self):
134+
raise HyperbrowserError("custom recording iteration failure")
135+
136+
with pytest.raises(
137+
HyperbrowserError, match="custom recording iteration failure"
138+
) as exc_info:
139+
parse_session_recordings_response_data(_BrokenRecordingList([{}]))
140+
141+
assert exc_info.value.original_error is None
142+
143+
118144
def test_sync_session_manager_get_recording_uses_recording_parser():
119145
manager = SyncSessionManager(
120146
_FakeClient(

0 commit comments

Comments
 (0)