@@ -221,6 +221,48 @@ def test_sync_extension_create_rejects_invalid_params_type():
221221 manager .create ({"name" : "bad" , "filePath" : "/tmp/ext.zip" }) # type: ignore[arg-type]
222222
223223
224+ def test_sync_extension_create_wraps_invalid_params_file_path_state (tmp_path ):
225+ class _BrokenParams (CreateExtensionParams ):
226+ def __getattribute__ (self , item : str ):
227+ if item == "file_path" :
228+ raise RuntimeError ("broken file_path state" )
229+ return super ().__getattribute__ (item )
230+
231+ manager = SyncExtensionManager (_FakeClient (_SyncTransport ()))
232+ params = _BrokenParams (
233+ name = "bad-extension" ,
234+ file_path = _create_test_extension_zip (tmp_path ),
235+ )
236+
237+ with pytest .raises (
238+ HyperbrowserError , match = "params.file_path is invalid"
239+ ) as exc_info :
240+ manager .create (params )
241+
242+ assert isinstance (exc_info .value .original_error , RuntimeError )
243+
244+
245+ def test_sync_extension_create_preserves_hyperbrowser_file_path_state_errors (tmp_path ):
246+ class _BrokenParams (CreateExtensionParams ):
247+ def __getattribute__ (self , item : str ):
248+ if item == "file_path" :
249+ raise HyperbrowserError ("custom file_path state failure" )
250+ return super ().__getattribute__ (item )
251+
252+ manager = SyncExtensionManager (_FakeClient (_SyncTransport ()))
253+ params = _BrokenParams (
254+ name = "bad-extension" ,
255+ file_path = _create_test_extension_zip (tmp_path ),
256+ )
257+
258+ with pytest .raises (
259+ HyperbrowserError , match = "custom file_path state failure"
260+ ) as exc_info :
261+ manager .create (params )
262+
263+ assert exc_info .value .original_error is None
264+
265+
224266def test_async_extension_list_raises_for_invalid_payload_shape ():
225267 class _InvalidAsyncTransport :
226268 async def get (self , url , params = None , follow_redirects = False ):
@@ -249,3 +291,49 @@ async def run():
249291 )
250292
251293 asyncio .run (run ())
294+
295+
296+ def test_async_extension_create_wraps_invalid_params_file_path_state (tmp_path ):
297+ class _BrokenParams (CreateExtensionParams ):
298+ def __getattribute__ (self , item : str ):
299+ if item == "file_path" :
300+ raise RuntimeError ("broken file_path state" )
301+ return super ().__getattribute__ (item )
302+
303+ manager = AsyncExtensionManager (_FakeClient (_AsyncTransport ()))
304+ params = _BrokenParams (
305+ name = "bad-extension" ,
306+ file_path = _create_test_extension_zip (tmp_path ),
307+ )
308+
309+ async def run ():
310+ with pytest .raises (
311+ HyperbrowserError , match = "params.file_path is invalid"
312+ ) as exc_info :
313+ await manager .create (params )
314+ assert isinstance (exc_info .value .original_error , RuntimeError )
315+
316+ asyncio .run (run ())
317+
318+
319+ def test_async_extension_create_preserves_hyperbrowser_file_path_state_errors (tmp_path ):
320+ class _BrokenParams (CreateExtensionParams ):
321+ def __getattribute__ (self , item : str ):
322+ if item == "file_path" :
323+ raise HyperbrowserError ("custom file_path state failure" )
324+ return super ().__getattribute__ (item )
325+
326+ manager = AsyncExtensionManager (_FakeClient (_AsyncTransport ()))
327+ params = _BrokenParams (
328+ name = "bad-extension" ,
329+ file_path = _create_test_extension_zip (tmp_path ),
330+ )
331+
332+ async def run ():
333+ with pytest .raises (
334+ HyperbrowserError , match = "custom file_path state failure"
335+ ) as exc_info :
336+ await manager .create (params )
337+ assert exc_info .value .original_error is None
338+
339+ asyncio .run (run ())
0 commit comments