Skip to content

Commit 3eb29a6

Browse files
Broaden request-error fallback typing and invalid URL coverage
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 7390f33 commit 3eb29a6

3 files changed

Lines changed: 48 additions & 1 deletion

File tree

hyperbrowser/transport/error_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ def extract_request_error_context(error: httpx.RequestError) -> tuple[str, str]:
135135

136136

137137
def format_request_failure_message(
138-
error: httpx.RequestError, *, fallback_method: str, fallback_url: str
138+
error: httpx.RequestError, *, fallback_method: object, fallback_url: object
139139
) -> str:
140140
request_method, request_url = extract_request_error_context(error)
141141
effective_method = (

tests/test_transport_error_utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,16 @@ def test_format_request_failure_message_rejects_overlong_fallback_methods():
235235
assert message == "Request UNKNOWN https://example.com/fallback failed"
236236

237237

238+
def test_format_request_failure_message_normalizes_non_string_fallback_values():
239+
message = format_request_failure_message(
240+
httpx.RequestError("network down"),
241+
fallback_method=123,
242+
fallback_url=object(),
243+
)
244+
245+
assert message == "Request UNKNOWN unknown URL failed"
246+
247+
238248
def test_format_generic_request_failure_message_normalizes_invalid_url_objects():
239249
message = format_generic_request_failure_message(
240250
method="GET",

tests/test_transport_response_handling.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,22 @@ def failing_get(*args, **kwargs):
408408
transport.close()
409409

410410

411+
def test_sync_transport_request_error_without_request_uses_unknown_url_for_invalid_input():
412+
transport = SyncTransport(api_key="test-key")
413+
original_get = transport.client.get
414+
415+
def failing_get(*args, **kwargs):
416+
raise httpx.RequestError("network down")
417+
418+
transport.client.get = failing_get # type: ignore[assignment]
419+
try:
420+
with pytest.raises(HyperbrowserError, match="Request GET unknown URL failed"):
421+
transport.get(None) # type: ignore[arg-type]
422+
finally:
423+
transport.client.get = original_get # type: ignore[assignment]
424+
transport.close()
425+
426+
411427
def test_async_transport_request_error_without_request_uses_fallback_url():
412428
async def run() -> None:
413429
transport = AsyncTransport(api_key="test-key")
@@ -428,3 +444,24 @@ async def failing_delete(*args, **kwargs):
428444
await transport.close()
429445

430446
asyncio.run(run())
447+
448+
449+
def test_async_transport_request_error_without_request_uses_unknown_url_for_invalid_input():
450+
async def run() -> None:
451+
transport = AsyncTransport(api_key="test-key")
452+
original_delete = transport.client.delete
453+
454+
async def failing_delete(*args, **kwargs):
455+
raise httpx.RequestError("network down")
456+
457+
transport.client.delete = failing_delete # type: ignore[assignment]
458+
try:
459+
with pytest.raises(
460+
HyperbrowserError, match="Request DELETE unknown URL failed"
461+
):
462+
await transport.delete(None) # type: ignore[arg-type]
463+
finally:
464+
transport.client.delete = original_delete # type: ignore[assignment]
465+
await transport.close()
466+
467+
asyncio.run(run())

0 commit comments

Comments
 (0)