Skip to content

Commit da04ea1

Browse files
Wrap session upload file-open errors with HyperbrowserError
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent a98b4b0 commit da04ea1

File tree

3 files changed

+48
-12
lines changed

3 files changed

+48
-12
lines changed

hyperbrowser/client/managers/async_manager/session.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from os import PathLike
33
from typing import IO, List, Optional, Union, overload
44
import warnings
5+
from hyperbrowser.exceptions import HyperbrowserError
56
from ....models.session import (
67
BasicResponse,
78
CreateSessionParams,
@@ -113,12 +114,19 @@ async def upload_file(
113114
self, id: str, file_input: Union[str, PathLike[str], IO]
114115
) -> UploadFileResponse:
115116
if isinstance(file_input, (str, PathLike)):
116-
with open(os.fspath(file_input), "rb") as file_obj:
117-
files = {"file": file_obj}
118-
response = await self._client.transport.post(
119-
self._client._build_url(f"/session/{id}/uploads"),
120-
files=files,
121-
)
117+
file_path = os.fspath(file_input)
118+
try:
119+
with open(file_path, "rb") as file_obj:
120+
files = {"file": file_obj}
121+
response = await self._client.transport.post(
122+
self._client._build_url(f"/session/{id}/uploads"),
123+
files=files,
124+
)
125+
except OSError as exc:
126+
raise HyperbrowserError(
127+
f"Failed to open upload file at path: {file_path}",
128+
original_error=exc,
129+
) from exc
122130
elif callable(getattr(file_input, "read", None)):
123131
files = {"file": file_input}
124132
response = await self._client.transport.post(

hyperbrowser/client/managers/sync_manager/session.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from os import PathLike
33
from typing import IO, List, Optional, Union, overload
44
import warnings
5+
from hyperbrowser.exceptions import HyperbrowserError
56
from ....models.session import (
67
BasicResponse,
78
CreateSessionParams,
@@ -105,12 +106,19 @@ def upload_file(
105106
self, id: str, file_input: Union[str, PathLike[str], IO]
106107
) -> UploadFileResponse:
107108
if isinstance(file_input, (str, PathLike)):
108-
with open(os.fspath(file_input), "rb") as file_obj:
109-
files = {"file": file_obj}
110-
response = self._client.transport.post(
111-
self._client._build_url(f"/session/{id}/uploads"),
112-
files=files,
113-
)
109+
file_path = os.fspath(file_input)
110+
try:
111+
with open(file_path, "rb") as file_obj:
112+
files = {"file": file_obj}
113+
response = self._client.transport.post(
114+
self._client._build_url(f"/session/{id}/uploads"),
115+
files=files,
116+
)
117+
except OSError as exc:
118+
raise HyperbrowserError(
119+
f"Failed to open upload file at path: {file_path}",
120+
original_error=exc,
121+
) from exc
114122
elif callable(getattr(file_input, "read", None)):
115123
files = {"file": file_input}
116124
response = self._client.transport.post(

tests/test_session_upload_file.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from hyperbrowser.client.managers.sync_manager.session import (
1010
SessionManager as SyncSessionManager,
1111
)
12+
from hyperbrowser.exceptions import HyperbrowserError
1213

1314

1415
class _FakeResponse:
@@ -156,3 +157,22 @@ async def run():
156157
await manager.upload_file("session_123", fake_file)
157158

158159
asyncio.run(run())
160+
161+
162+
def test_sync_session_upload_file_raises_hyperbrowser_error_for_missing_path(tmp_path):
163+
manager = SyncSessionManager(_FakeClient(_SyncTransport()))
164+
missing_path = tmp_path / "missing-file.txt"
165+
166+
with pytest.raises(HyperbrowserError, match="Failed to open upload file"):
167+
manager.upload_file("session_123", missing_path)
168+
169+
170+
def test_async_session_upload_file_raises_hyperbrowser_error_for_missing_path(tmp_path):
171+
manager = AsyncSessionManager(_FakeClient(_AsyncTransport()))
172+
missing_path = tmp_path / "missing-file.txt"
173+
174+
async def run():
175+
with pytest.raises(HyperbrowserError, match="Failed to open upload file"):
176+
await manager.upload_file("session_123", missing_path)
177+
178+
asyncio.run(run())

0 commit comments

Comments
 (0)