Skip to content

Commit bf65173

Browse files
Wrap extension membership inspection failures
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent a851c9d commit bf65173

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

hyperbrowser/client/managers/extension_utils.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ def _format_key_display(value: object) -> str:
3232
def _summarize_mapping_keys(mapping: Mapping[object, object]) -> str:
3333
try:
3434
mapping_keys = list(mapping.keys())
35+
except HyperbrowserError:
36+
raise
3537
except Exception:
3638
return "[<unavailable keys>]"
3739
key_names = sorted(_format_key_display(key) for key in mapping_keys)
@@ -50,7 +52,16 @@ def parse_extension_list_response_data(response_data: Any) -> List[ExtensionResp
5052
raise HyperbrowserError(
5153
f"Expected mapping response but got {_get_type_name(response_data)}"
5254
)
53-
if "extensions" not in response_data:
55+
try:
56+
has_extensions_key = "extensions" in response_data
57+
except HyperbrowserError:
58+
raise
59+
except Exception as exc:
60+
raise HyperbrowserError(
61+
"Failed to inspect response for 'extensions' key",
62+
original_error=exc,
63+
) from exc
64+
if not has_extensions_key:
5465
raise HyperbrowserError(
5566
"Expected 'extensions' key in response but got "
5667
f"{_summarize_mapping_keys(response_data)} keys"

tests/test_extension_utils.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,32 @@ def keys(self):
171171
parse_extension_list_response_data(_BrokenKeysMapping({"id": "ext_1"}))
172172

173173

174+
def test_parse_extension_list_response_data_wraps_unreadable_extensions_membership():
175+
class _BrokenContainsMapping(dict):
176+
def __contains__(self, key: object) -> bool:
177+
_ = key
178+
raise RuntimeError("cannot inspect contains")
179+
180+
with pytest.raises(
181+
HyperbrowserError, match="Failed to inspect response for 'extensions' key"
182+
) as exc_info:
183+
parse_extension_list_response_data(_BrokenContainsMapping({"id": "ext_1"}))
184+
185+
assert exc_info.value.original_error is not None
186+
187+
188+
def test_parse_extension_list_response_data_preserves_hyperbrowser_contains_errors():
189+
class _BrokenContainsMapping(dict):
190+
def __contains__(self, key: object) -> bool:
191+
_ = key
192+
raise HyperbrowserError("custom contains failure")
193+
194+
with pytest.raises(HyperbrowserError, match="custom contains failure") as exc_info:
195+
parse_extension_list_response_data(_BrokenContainsMapping({"id": "ext_1"}))
196+
197+
assert exc_info.value.original_error is None
198+
199+
174200
def test_parse_extension_list_response_data_wraps_unreadable_extensions_value():
175201
class _BrokenExtensionsLookupMapping(dict):
176202
def __contains__(self, key: object) -> bool:

0 commit comments

Comments
 (0)