Skip to content

Commit 66763e8

Browse files
Wrap invalid extension file_path state access
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent b5ae02a commit 66763e8

3 files changed

Lines changed: 106 additions & 2 deletions

File tree

hyperbrowser/client/managers/async_manager/extension.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,15 @@ def __init__(self, client):
1414
async def create(self, params: CreateExtensionParams) -> ExtensionResponse:
1515
if not isinstance(params, CreateExtensionParams):
1616
raise HyperbrowserError("params must be CreateExtensionParams")
17-
raw_file_path = params.file_path
17+
try:
18+
raw_file_path = params.file_path
19+
except HyperbrowserError:
20+
raise
21+
except Exception as exc:
22+
raise HyperbrowserError(
23+
"params.file_path is invalid",
24+
original_error=exc,
25+
) from exc
1826
payload = params.model_dump(exclude_none=True, by_alias=True)
1927
payload.pop("filePath", None)
2028

hyperbrowser/client/managers/sync_manager/extension.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,15 @@ def __init__(self, client):
1414
def create(self, params: CreateExtensionParams) -> ExtensionResponse:
1515
if not isinstance(params, CreateExtensionParams):
1616
raise HyperbrowserError("params must be CreateExtensionParams")
17-
raw_file_path = params.file_path
17+
try:
18+
raw_file_path = params.file_path
19+
except HyperbrowserError:
20+
raise
21+
except Exception as exc:
22+
raise HyperbrowserError(
23+
"params.file_path is invalid",
24+
original_error=exc,
25+
) from exc
1826
payload = params.model_dump(exclude_none=True, by_alias=True)
1927
payload.pop("filePath", None)
2028

tests/test_extension_manager.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
224266
def 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

Comments
 (0)