Skip to content

Commit c01071d

Browse files
Wrap unreadable extension value lookups
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent ce2e3ab commit c01071d

2 files changed

Lines changed: 32 additions & 3 deletions

File tree

hyperbrowser/client/managers/extension_utils.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,22 @@ def parse_extension_list_response_data(response_data: Any) -> List[ExtensionResp
5555
"Expected 'extensions' key in response but got "
5656
f"{_summarize_mapping_keys(response_data)} keys"
5757
)
58-
if not isinstance(response_data["extensions"], list):
58+
try:
59+
extensions_value = response_data["extensions"]
60+
except HyperbrowserError:
61+
raise
62+
except Exception as exc:
63+
raise HyperbrowserError(
64+
"Failed to read 'extensions' value from response",
65+
original_error=exc,
66+
) from exc
67+
if not isinstance(extensions_value, list):
5968
raise HyperbrowserError(
6069
"Expected list in 'extensions' key but got "
61-
f"{_get_type_name(response_data['extensions'])}"
70+
f"{_get_type_name(extensions_value)}"
6271
)
6372
parsed_extensions: List[ExtensionResponse] = []
64-
for index, extension in enumerate(response_data["extensions"]):
73+
for index, extension in enumerate(extensions_value):
6574
if not isinstance(extension, Mapping):
6675
raise HyperbrowserError(
6776
"Expected extension object at index "

tests/test_extension_utils.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,23 @@ def keys(self):
169169
match="Expected 'extensions' key in response but got \\[<unavailable keys>\\] keys",
170170
):
171171
parse_extension_list_response_data(_BrokenKeysMapping({"id": "ext_1"}))
172+
173+
174+
def test_parse_extension_list_response_data_wraps_unreadable_extensions_value():
175+
class _BrokenExtensionsLookupMapping(dict):
176+
def __contains__(self, key: object) -> bool:
177+
return key == "extensions"
178+
179+
def __getitem__(self, key: object):
180+
if key == "extensions":
181+
raise RuntimeError("cannot read extensions value")
182+
return super().__getitem__(key)
183+
184+
with pytest.raises(
185+
HyperbrowserError, match="Failed to read 'extensions' value from response"
186+
) as exc_info:
187+
parse_extension_list_response_data(
188+
_BrokenExtensionsLookupMapping({"extensions": []})
189+
)
190+
191+
assert exc_info.value.original_error is not None

0 commit comments

Comments
 (0)