@@ -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+
242290def 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