Skip to content

Commit 0990760

Browse files
Wrap extension param serialization failures
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 4384cae commit 0990760

3 files changed

Lines changed: 122 additions & 2 deletions

File tree

hyperbrowser/client/managers/async_manager/extension.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,17 @@ async def create(self, params: CreateExtensionParams) -> ExtensionResponse:
2323
"params.file_path is invalid",
2424
original_error=exc,
2525
) from exc
26-
payload = params.model_dump(exclude_none=True, by_alias=True)
26+
try:
27+
payload = params.model_dump(exclude_none=True, by_alias=True)
28+
except HyperbrowserError:
29+
raise
30+
except Exception as exc:
31+
raise HyperbrowserError(
32+
"Failed to serialize extension create params",
33+
original_error=exc,
34+
) from exc
35+
if type(payload) is not dict:
36+
raise HyperbrowserError("Failed to serialize extension create params")
2737
payload.pop("filePath", None)
2838

2939
file_path = ensure_existing_file_path(

hyperbrowser/client/managers/sync_manager/extension.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,17 @@ def create(self, params: CreateExtensionParams) -> ExtensionResponse:
2323
"params.file_path is invalid",
2424
original_error=exc,
2525
) from exc
26-
payload = params.model_dump(exclude_none=True, by_alias=True)
26+
try:
27+
payload = params.model_dump(exclude_none=True, by_alias=True)
28+
except HyperbrowserError:
29+
raise
30+
except Exception as exc:
31+
raise HyperbrowserError(
32+
"Failed to serialize extension create params",
33+
original_error=exc,
34+
) from exc
35+
if type(payload) is not dict:
36+
raise HyperbrowserError("Failed to serialize extension create params")
2737
payload.pop("filePath", None)
2838

2939
file_path = ensure_existing_file_path(

tests/test_extension_manager.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,54 @@ class _BrokenParams(CreateExtensionParams):
239239
assert exc_info.value.original_error is None
240240

241241

242+
def test_sync_extension_create_wraps_param_serialization_errors(
243+
tmp_path, monkeypatch: pytest.MonkeyPatch
244+
):
245+
manager = SyncExtensionManager(_FakeClient(_SyncTransport()))
246+
params = CreateExtensionParams(
247+
name="serialize-extension",
248+
file_path=_create_test_extension_zip(tmp_path),
249+
)
250+
251+
def _raise_model_dump_error(*args, **kwargs):
252+
_ = args
253+
_ = kwargs
254+
raise RuntimeError("broken model_dump")
255+
256+
monkeypatch.setattr(CreateExtensionParams, "model_dump", _raise_model_dump_error)
257+
258+
with pytest.raises(
259+
HyperbrowserError, match="Failed to serialize extension create params"
260+
) as exc_info:
261+
manager.create(params)
262+
263+
assert isinstance(exc_info.value.original_error, RuntimeError)
264+
265+
266+
def test_sync_extension_create_preserves_hyperbrowser_param_serialization_errors(
267+
tmp_path, monkeypatch: pytest.MonkeyPatch
268+
):
269+
manager = SyncExtensionManager(_FakeClient(_SyncTransport()))
270+
params = CreateExtensionParams(
271+
name="serialize-extension",
272+
file_path=_create_test_extension_zip(tmp_path),
273+
)
274+
275+
def _raise_model_dump_error(*args, **kwargs):
276+
_ = args
277+
_ = kwargs
278+
raise HyperbrowserError("custom model_dump failure")
279+
280+
monkeypatch.setattr(CreateExtensionParams, "model_dump", _raise_model_dump_error)
281+
282+
with pytest.raises(
283+
HyperbrowserError, match="custom model_dump failure"
284+
) as exc_info:
285+
manager.create(params)
286+
287+
assert exc_info.value.original_error is None
288+
289+
242290
def test_async_extension_list_raises_for_invalid_payload_shape():
243291
class _InvalidAsyncTransport:
244292
async def get(self, url, params=None, follow_redirects=False):
@@ -287,3 +335,55 @@ async def run():
287335
assert exc_info.value.original_error is None
288336

289337
asyncio.run(run())
338+
339+
340+
def test_async_extension_create_wraps_param_serialization_errors(
341+
tmp_path, monkeypatch: pytest.MonkeyPatch
342+
):
343+
manager = AsyncExtensionManager(_FakeClient(_AsyncTransport()))
344+
params = CreateExtensionParams(
345+
name="serialize-extension",
346+
file_path=_create_test_extension_zip(tmp_path),
347+
)
348+
349+
def _raise_model_dump_error(*args, **kwargs):
350+
_ = args
351+
_ = kwargs
352+
raise RuntimeError("broken model_dump")
353+
354+
monkeypatch.setattr(CreateExtensionParams, "model_dump", _raise_model_dump_error)
355+
356+
async def run():
357+
with pytest.raises(
358+
HyperbrowserError, match="Failed to serialize extension create params"
359+
) as exc_info:
360+
await manager.create(params)
361+
assert isinstance(exc_info.value.original_error, RuntimeError)
362+
363+
asyncio.run(run())
364+
365+
366+
def test_async_extension_create_preserves_hyperbrowser_param_serialization_errors(
367+
tmp_path, monkeypatch: pytest.MonkeyPatch
368+
):
369+
manager = AsyncExtensionManager(_FakeClient(_AsyncTransport()))
370+
params = CreateExtensionParams(
371+
name="serialize-extension",
372+
file_path=_create_test_extension_zip(tmp_path),
373+
)
374+
375+
def _raise_model_dump_error(*args, **kwargs):
376+
_ = args
377+
_ = kwargs
378+
raise HyperbrowserError("custom model_dump failure")
379+
380+
monkeypatch.setattr(CreateExtensionParams, "model_dump", _raise_model_dump_error)
381+
382+
async def run():
383+
with pytest.raises(
384+
HyperbrowserError, match="custom model_dump failure"
385+
) as exc_info:
386+
await manager.create(params)
387+
assert exc_info.value.original_error is None
388+
389+
asyncio.run(run())

0 commit comments

Comments
 (0)