Skip to content

Commit 32fbe0d

Browse files
Require concrete response parser normalization outputs
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 56b1a60 commit 32fbe0d

File tree

2 files changed

+10
-22
lines changed

2 files changed

+10
-22
lines changed

hyperbrowser/client/managers/response_utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def _normalize_operation_name_for_error(operation_name: str) -> str:
1616
"?" if ord(character) < 32 or ord(character) == 127 else character
1717
for character in operation_name
1818
).strip()
19-
if not isinstance(normalized_name, str):
19+
if type(normalized_name) is not str:
2020
raise TypeError("normalized operation name must be a string")
2121
except Exception:
2222
return "operation"
@@ -38,7 +38,7 @@ def _normalize_response_key_for_error(key: str) -> str:
3838
"?" if ord(character) < 32 or ord(character) == 127 else character
3939
for character in key
4040
).strip()
41-
if not isinstance(normalized_key, str):
41+
if type(normalized_key) is not str:
4242
raise TypeError("normalized response key must be a string")
4343
except Exception:
4444
return "<unreadable key>"
@@ -62,7 +62,7 @@ def parse_response_model(
6262
raise HyperbrowserError("operation_name must be a non-empty string")
6363
try:
6464
normalized_operation_name_input = operation_name.strip()
65-
if not isinstance(normalized_operation_name_input, str):
65+
if type(normalized_operation_name_input) is not str:
6666
raise TypeError("normalized operation_name must be a string")
6767
is_empty_operation_name = len(normalized_operation_name_input) == 0
6868
except HyperbrowserError:

tests/test_response_utils.py

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -256,11 +256,10 @@ def strip(self, chars=None): # type: ignore[override]
256256
assert isinstance(exc_info.value.original_error, TypeError)
257257

258258

259-
def test_parse_response_model_wraps_operation_name_empty_check_length_failures():
259+
def test_parse_response_model_wraps_operation_name_string_subclass_strip_results():
260260
class _BrokenOperationName(str):
261261
class _NormalizedName(str):
262-
def __len__(self):
263-
raise RuntimeError("operation name length exploded")
262+
pass
264263

265264
def strip(self, chars=None): # type: ignore[override]
266265
_ = chars
@@ -273,30 +272,19 @@ def strip(self, chars=None): # type: ignore[override]
273272
operation_name=_BrokenOperationName("basic operation"),
274273
)
275274

276-
assert isinstance(exc_info.value.original_error, RuntimeError)
277-
278-
279-
def test_parse_response_model_preserves_hyperbrowser_operation_name_empty_check_length_failures():
280-
class _BrokenOperationName(str):
281-
class _NormalizedName(str):
282-
def __len__(self):
283-
raise HyperbrowserError("custom operation name length failure")
275+
assert isinstance(exc_info.value.original_error, TypeError)
284276

285-
def strip(self, chars=None): # type: ignore[override]
286-
_ = chars
287-
return self._NormalizedName("basic operation")
288277

278+
def test_parse_response_model_rejects_blank_operation_names():
289279
with pytest.raises(
290-
HyperbrowserError, match="custom operation name length failure"
291-
) as exc_info:
280+
HyperbrowserError, match="operation_name must be a non-empty string"
281+
):
292282
parse_response_model(
293283
{"success": True},
294284
model=BasicResponse,
295-
operation_name=_BrokenOperationName("basic operation"),
285+
operation_name=" ",
296286
)
297287

298-
assert exc_info.value.original_error is None
299-
300288

301289
def test_parse_response_model_truncates_operation_name_in_errors():
302290
long_operation_name = "basic operation " + ("x" * 200)

0 commit comments

Comments
 (0)