Skip to content

Commit 17f1725

Browse files
Validate APIResponse JSON payload key types
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 30e6790 commit 17f1725

2 files changed

Lines changed: 22 additions & 0 deletions

File tree

hyperbrowser/transport/base.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ def from_json(
2828
f"Failed to parse response data for {model_name}: "
2929
f"expected a mapping but received {actual_type_name}"
3030
)
31+
for key in json_data.keys():
32+
if isinstance(key, str):
33+
continue
34+
key_type_name = type(key).__name__
35+
raise HyperbrowserError(
36+
f"Failed to parse response data for {model_name}: "
37+
f"expected string keys but received {key_type_name}"
38+
)
3139
try:
3240
return cls(data=model(**json_data))
3341
except HyperbrowserError:

tests/test_transport_base.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,20 @@ def test_api_response_from_json_rejects_non_mapping_inputs() -> None:
4343
)
4444

4545

46+
def test_api_response_from_json_rejects_non_string_mapping_keys() -> None:
47+
with pytest.raises(
48+
HyperbrowserError,
49+
match=(
50+
"Failed to parse response data for _SampleResponseModel: "
51+
"expected string keys but received int"
52+
),
53+
):
54+
APIResponse.from_json(
55+
cast("dict[str, object]", {1: "job-1"}),
56+
_SampleResponseModel,
57+
)
58+
59+
4660
def test_api_response_from_json_wraps_non_hyperbrowser_errors() -> None:
4761
with pytest.raises(
4862
HyperbrowserError,

0 commit comments

Comments
 (0)