@@ -319,6 +319,15 @@ def test_seek_past_end(self):
319319 seek = fin .seek (60 )
320320 self .assertEqual (seek , len (self .body ))
321321
322+ def test_seek_past_end_from_end (self ):
323+ """Test seeking from end with offset larger than file size."""
324+ body_len = len (self .body )
325+ with self .assertApiCalls (GetObject = 1 ), patch_invalid_range_response (str (body_len )):
326+ fin = smart_open .s3 .Reader (BUCKET_NAME , KEY_NAME , defer_seek = True )
327+ seek = fin .seek (- (body_len + 10 ), whence = smart_open .constants .WHENCE_END )
328+ self .assertEqual (seek , 0 ) # Should clamp to start of file
329+
330+
322331 def test_detect_eof (self ):
323332 with self .assertApiCalls (GetObject = 1 ):
324333 fin = smart_open .s3 .Reader (BUCKET_NAME , KEY_NAME )
@@ -470,6 +479,14 @@ def test_read_empty_file_no_actual_size(self):
470479 # a subsequent read does not call _open_body
471480 self .assertEqual (fin .read (), b'' )
472481
482+ def test_seek_empty_file_from_end (self ):
483+ """Test seeking from end on an empty file."""
484+ _resource ('s3' ).Object (BUCKET_NAME , KEY_NAME ).put (Body = b'' )
485+ with self .assertApiCalls (GetObject = 1 ), patch_invalid_range_response ('0' ):
486+ with smart_open .s3 .Reader (BUCKET_NAME , KEY_NAME , defer_seek = True ) as fin :
487+ seek = fin .seek (- 10 , whence = smart_open .constants .WHENCE_END )
488+ self .assertEqual (seek , 0 ) # Should be at position 0 for empty file
489+
473490
474491@mock_s3
475492class MultipartWriterTest (unittest .TestCase ):
0 commit comments