@@ -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+
172205def 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+
212284def 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