Skip to content

Commit 06730da

Browse files
Preserve explicit session upload state errors
Co-authored-by: Shri Sukhani <shrisukhani@users.noreply.github.com>
1 parent 1dd3c65 commit 06730da

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

hyperbrowser/client/managers/async_manager/session.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ async def upload_file(
136136
else:
137137
try:
138138
read_method = getattr(file_input, "read", None)
139+
except HyperbrowserError:
140+
raise
139141
except Exception as exc:
140142
raise HyperbrowserError(
141143
"file_input file-like object state is invalid",
@@ -144,6 +146,8 @@ async def upload_file(
144146
if callable(read_method):
145147
try:
146148
is_closed = bool(getattr(file_input, "closed", False))
149+
except HyperbrowserError:
150+
raise
147151
except Exception as exc:
148152
raise HyperbrowserError(
149153
"file_input file-like object state is invalid",

hyperbrowser/client/managers/sync_manager/session.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ def upload_file(
128128
else:
129129
try:
130130
read_method = getattr(file_input, "read", None)
131+
except HyperbrowserError:
132+
raise
131133
except Exception as exc:
132134
raise HyperbrowserError(
133135
"file_input file-like object state is invalid",
@@ -136,6 +138,8 @@ def upload_file(
136138
if callable(read_method):
137139
try:
138140
is_closed = bool(getattr(file_input, "closed", False))
141+
except HyperbrowserError:
142+
raise
139143
except Exception as exc:
140144
raise HyperbrowserError(
141145
"file_input file-like object state is invalid",

tests/test_session_upload_file.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,39 @@ def read(self):
169169
manager.upload_file("session_123", _BrokenFileLike())
170170

171171

172+
def test_sync_session_upload_file_preserves_hyperbrowser_read_state_errors():
173+
manager = SyncSessionManager(_FakeClient(_SyncTransport()))
174+
175+
class _BrokenFileLike:
176+
@property
177+
def read(self):
178+
raise HyperbrowserError("custom read state error")
179+
180+
with pytest.raises(HyperbrowserError, match="custom read state error") as exc_info:
181+
manager.upload_file("session_123", _BrokenFileLike())
182+
183+
assert exc_info.value.original_error is None
184+
185+
186+
def test_sync_session_upload_file_preserves_hyperbrowser_closed_state_errors():
187+
manager = SyncSessionManager(_FakeClient(_SyncTransport()))
188+
189+
class _BrokenFileLike:
190+
def read(self):
191+
return b"content"
192+
193+
@property
194+
def closed(self):
195+
raise HyperbrowserError("custom closed-state error")
196+
197+
with pytest.raises(
198+
HyperbrowserError, match="custom closed-state error"
199+
) as exc_info:
200+
manager.upload_file("session_123", _BrokenFileLike())
201+
202+
assert exc_info.value.original_error is None
203+
204+
172205
def test_async_session_upload_file_rejects_non_callable_read_attribute():
173206
manager = AsyncSessionManager(_FakeClient(_AsyncTransport()))
174207
fake_file = type("FakeFile", (), {"read": "not-callable"})()
@@ -209,6 +242,45 @@ async def run():
209242
asyncio.run(run())
210243

211244

245+
def test_async_session_upload_file_preserves_hyperbrowser_read_state_errors():
246+
manager = AsyncSessionManager(_FakeClient(_AsyncTransport()))
247+
248+
class _BrokenFileLike:
249+
@property
250+
def read(self):
251+
raise HyperbrowserError("custom read state error")
252+
253+
async def run():
254+
with pytest.raises(
255+
HyperbrowserError, match="custom read state error"
256+
) as exc_info:
257+
await manager.upload_file("session_123", _BrokenFileLike())
258+
assert exc_info.value.original_error is None
259+
260+
asyncio.run(run())
261+
262+
263+
def test_async_session_upload_file_preserves_hyperbrowser_closed_state_errors():
264+
manager = AsyncSessionManager(_FakeClient(_AsyncTransport()))
265+
266+
class _BrokenFileLike:
267+
def read(self):
268+
return b"content"
269+
270+
@property
271+
def closed(self):
272+
raise HyperbrowserError("custom closed-state error")
273+
274+
async def run():
275+
with pytest.raises(
276+
HyperbrowserError, match="custom closed-state error"
277+
) as exc_info:
278+
await manager.upload_file("session_123", _BrokenFileLike())
279+
assert exc_info.value.original_error is None
280+
281+
asyncio.run(run())
282+
283+
212284
def test_sync_session_upload_file_raises_hyperbrowser_error_for_missing_path(tmp_path):
213285
manager = SyncSessionManager(_FakeClient(_SyncTransport()))
214286
missing_path = tmp_path / "missing-file.txt"

0 commit comments

Comments
 (0)