1212 ImageUploadError ,
1313 InvalidMimeTypeError ,
1414 MissingEnvironmentVariableError ,
15- MIME_TO_FORMAT ,
1615)
1716
1817
@@ -98,49 +97,74 @@ def test_get_s3_bucket_uri_empty_string(self):
9897class TestUploadImage :
9998 """Test suite for upload_image function"""
10099
101- @patch ('lf_toolkit.evaluation.image_upload.requests.put' )
100+ @patch ('lf_toolkit.evaluation.image_upload.requests.request' )
101+ @patch ('lf_toolkit.evaluation.image_upload.get_aws_signed_request' )
102102 @patch ('lf_toolkit.evaluation.image_upload.os.getenv' )
103103 @patch ('lf_toolkit.evaluation.image_upload.uuid.uuid4' )
104- def test_successful_upload (self , mock_uuid , mock_getenv , mock_put ):
104+ def test_successful_upload (self , mock_uuid , mock_getenv , mock_get_aws_signed_request , mock_request ):
105105 """Test successful image upload with UUID-based filename"""
106106 # Setup mocks
107107 mock_uuid .return_value = uuid .UUID ('12345678-1234-5678-1234-567812345678' )
108- mock_getenv .return_value = 'https://s3.amazonaws.com/my-bucket/'
108+ mock_getenv .return_value = 'https://s3.amazonaws.com/eduvision'
109+
110+ # Mock the AWS signed request
111+ mock_prepared_request = Mock ()
112+ mock_prepared_request .method = 'PUT'
113+ mock_prepared_request .url = 'https://s3.amazonaws.com/eduvision/eduvision/12345678-1234-5678-1234-567812345678.jpeg'
114+ mock_prepared_request .body = b'mock_body'
115+ mock_prepared_request .headers = {'Content-Type' : 'image/jpeg' }
116+
117+ mock_aws_request = Mock ()
118+ mock_aws_request .prepare .return_value = mock_prepared_request
119+ mock_get_aws_signed_request .return_value = mock_aws_request
109120
110121 mock_response = Mock ()
111122 mock_response .status_code = 200
112- mock_put .return_value = mock_response
123+ mock_request .return_value = mock_response
113124
114125 # Create a real PIL image for testing
115126 img = Image .new ('RGB' , (100 , 100 ), color = 'red' )
116127 img .format = 'JPEG'
117128
118129 # Execute
119- result = upload_image (img )
130+ result = upload_image (img , "eduvision" )
120131
121132 # Verify response
122- assert result == 'https://s3.amazonaws.com/my-bucket /12345678-1234-5678-1234-567812345678.jpeg'
123- assert mock_put .called
124- assert mock_put .call_args [1 ]['timeout' ] == 30
133+ assert result == 'https://s3.amazonaws.com/eduvision/eduvision /12345678-1234-5678-1234-567812345678.jpeg'
134+ assert mock_request .called
135+ assert mock_request .call_args [1 ]['timeout' ] == 30
125136
126- @patch ('lf_toolkit.evaluation.image_upload.requests.put' )
137+ @patch ('lf_toolkit.evaluation.image_upload.requests.request' )
138+ @patch ('lf_toolkit.evaluation.image_upload.get_aws_signed_request' )
127139 @patch ('lf_toolkit.evaluation.image_upload.os.getenv' )
128140 @patch ('lf_toolkit.evaluation.image_upload.uuid.uuid4' )
129- def test_upload_with_png_image (self , mock_uuid , mock_getenv , mock_put ):
141+ def test_upload_with_png (self , mock_uuid , mock_getenv , mock_get_aws_signed_request , mock_request ):
130142 """Test uploading PNG image with UUID-based filename"""
131- mock_uuid .return_value = uuid .UUID ('aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' )
132- mock_getenv .return_value = 'https://storage.example.com/'
143+ # Setup mocks
144+ mock_uuid .return_value = uuid .UUID ('12345678-1234-5678-1234-567812345678' )
145+ mock_getenv .return_value = 'https://s3.amazonaws.com/eduvision'
146+
147+ # Mock the AWS signed request
148+ mock_prepared_request = Mock ()
149+ mock_prepared_request .method = 'PUT'
150+ mock_prepared_request .url = 'https://s3.amazonaws.com/eduvision/eduvision/12345678-1234-5678-1234-567812345678.png'
151+ mock_prepared_request .body = b'mock_body'
152+ mock_prepared_request .headers = {'Content-Type' : 'image/jpeg' }
153+
154+ mock_aws_request = Mock ()
155+ mock_aws_request .prepare .return_value = mock_prepared_request
156+ mock_get_aws_signed_request .return_value = mock_aws_request
133157
134158 mock_response = Mock ()
135159 mock_response .status_code = 200
136- mock_put .return_value = mock_response
160+ mock_request .return_value = mock_response
137161
138162 img = Image .new ('RGBA' , (50 , 50 ), color = (0 , 255 , 0 , 128 ))
139163 img .format = 'PNG'
140164
141- result = upload_image (img )
165+ result = upload_image (img , "eduvision" )
142166
143- assert result == 'https://storage.example .com/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee .png'
167+ assert result == 'https://s3.amazonaws .com/eduvision/eduvision/12345678-1234-5678-1234-567812345678 .png'
144168
145169 @patch ('lf_toolkit.evaluation.image_upload.os.getenv' )
146170 def test_upload_missing_s3_uri (self , mock_getenv ):
@@ -151,100 +175,131 @@ def test_upload_missing_s3_uri(self, mock_getenv):
151175 img .format = 'JPEG'
152176
153177 with pytest .raises (MissingEnvironmentVariableError ):
154- upload_image (img )
178+ upload_image (img , "eduvision" )
155179
156- @patch ('lf_toolkit.evaluation.image_upload.requests.put' )
180+ @patch ('lf_toolkit.evaluation.image_upload.requests.request' )
181+ @patch ('lf_toolkit.evaluation.image_upload.get_aws_signed_request' )
157182 @patch ('lf_toolkit.evaluation.image_upload.os.getenv' )
158183 @patch ('lf_toolkit.evaluation.image_upload.uuid.uuid4' )
159- def test_upload_server_error (self , mock_uuid , mock_getenv , mock_put ):
184+ def test_upload_server_error (self , mock_uuid , mock_getenv , mock_get_aws_signed_request , mock_request ):
160185 """Test upload fails when server returns error"""
161186 mock_uuid .return_value = uuid .UUID ('12345678-1234-5678-1234-567812345678' )
162187 mock_getenv .return_value = 'https://s3.amazonaws.com/bucket'
163188
189+ # Mock the AWS signed request
190+ mock_prepared_request = Mock ()
191+ mock_prepared_request .method = 'PUT'
192+ mock_prepared_request .url = 'https://s3.amazonaws.com/bucket/eduvision/12345678-1234-5678-1234-567812345678.jpeg'
193+ mock_prepared_request .body = b'mock_body'
194+ mock_prepared_request .headers = {'Content-Type' : 'image/jpeg' }
195+
196+ mock_aws_request = Mock ()
197+ mock_aws_request .prepare .return_value = mock_prepared_request
198+ mock_get_aws_signed_request .return_value = mock_aws_request
199+
164200 mock_response = Mock ()
165201 mock_response .status_code = 500
166202 mock_response .text = 'Internal Server Error'
167- mock_put .return_value = mock_response
203+ mock_request .return_value = mock_response
168204
169205 img = Image .new ('RGB' , (100 , 100 ))
170206 img .format = 'JPEG'
171207
172208 with pytest .raises (ImageUploadError ) as exc_info :
173- upload_image (img )
209+ upload_image (img , "eduvision" )
174210
175211 assert "Upload failed with status code 500" in str (exc_info .value )
176212
177- @patch ('lf_toolkit.evaluation.image_upload.requests.put' )
213+ @patch ('lf_toolkit.evaluation.image_upload.requests.request' )
214+ @patch ('lf_toolkit.evaluation.image_upload.get_aws_signed_request' )
178215 @patch ('lf_toolkit.evaluation.image_upload.os.getenv' )
179216 @patch ('lf_toolkit.evaluation.image_upload.uuid.uuid4' )
180- def test_upload_network_error (self , mock_uuid , mock_getenv , mock_put ):
217+ def test_upload_network_error (self , mock_uuid , mock_getenv , mock_get_aws_signed_request , mock_request ):
181218 """Test upload fails on network error"""
182219 mock_uuid .return_value = uuid .UUID ('12345678-1234-5678-1234-567812345678' )
183220 mock_getenv .return_value = 'https://s3.amazonaws.com/bucket'
184221
185- mock_put .side_effect = requests .exceptions .ConnectionError ('Connection failed' )
222+ # Mock the AWS signed request
223+ mock_prepared_request = Mock ()
224+ mock_prepared_request .method = 'PUT'
225+ mock_prepared_request .url = 'https://s3.amazonaws.com/bucket/eduvision/12345678-1234-5678-1234-567812345678.jpeg'
226+ mock_prepared_request .body = b'mock_body'
227+ mock_prepared_request .headers = {'Content-Type' : 'image/jpeg' }
228+
229+ mock_aws_request = Mock ()
230+ mock_aws_request .prepare .return_value = mock_prepared_request
231+ mock_get_aws_signed_request .return_value = mock_aws_request
232+
233+ mock_request .side_effect = requests .exceptions .ConnectionError ('Connection failed' )
186234
187235 img = Image .new ('RGB' , (100 , 100 ))
188236 img .format = 'JPEG'
189237
190238 with pytest .raises (ImageUploadError ) as exc_info :
191- upload_image (img )
239+ upload_image (img , "eduvision" )
192240
193241 assert "Network error" in str (exc_info .value )
194242
195- @patch ('lf_toolkit.evaluation.image_upload.requests.put' )
243+ @patch ('lf_toolkit.evaluation.image_upload.requests.request' )
244+ @patch ('lf_toolkit.evaluation.image_upload.get_aws_signed_request' )
196245 @patch ('lf_toolkit.evaluation.image_upload.os.getenv' )
197246 @patch ('lf_toolkit.evaluation.image_upload.uuid.uuid4' )
198- def test_upload_timeout_error (self , mock_uuid , mock_getenv , mock_put ):
247+ def test_upload_timeout_error (self , mock_uuid , mock_getenv , mock_get_aws_signed_request , mock_request ):
199248 """Test upload fails on timeout"""
200249 mock_uuid .return_value = uuid .UUID ('12345678-1234-5678-1234-567812345678' )
201250 mock_getenv .return_value = 'https://s3.amazonaws.com/bucket'
202251
203- mock_put .side_effect = requests .exceptions .Timeout ('Request timed out' )
252+ # Mock the AWS signed request
253+ mock_prepared_request = Mock ()
254+ mock_prepared_request .method = 'PUT'
255+ mock_prepared_request .url = 'https://s3.amazonaws.com/bucket/eduvision/12345678-1234-5678-1234-567812345678.jpeg'
256+ mock_prepared_request .body = b'mock_body'
257+ mock_prepared_request .headers = {'Content-Type' : 'image/jpeg' }
258+
259+ mock_aws_request = Mock ()
260+ mock_aws_request .prepare .return_value = mock_prepared_request
261+ mock_get_aws_signed_request .return_value = mock_aws_request
262+
263+ mock_request .side_effect = requests .exceptions .Timeout ('Request timed out' )
204264
205265 img = Image .new ('RGB' , (100 , 100 ))
206266 img .format = 'JPEG'
207267
208268 with pytest .raises (ImageUploadError ) as exc_info :
209- upload_image (img )
269+ upload_image (img , "eduvision" )
210270
211271 assert "Network error" in str (exc_info .value )
212272
213- @patch ('lf_toolkit.evaluation.image_upload.requests.put' )
273+ @patch ('lf_toolkit.evaluation.image_upload.requests.request' )
274+ @patch ('lf_toolkit.evaluation.image_upload.get_aws_signed_request' )
214275 @patch ('lf_toolkit.evaluation.image_upload.os.getenv' )
215276 @patch ('lf_toolkit.evaluation.image_upload.uuid.uuid4' )
216- def test_upload_image_no_format (self , mock_uuid , mock_getenv , mock_put ):
277+ def test_upload_image_no_format (self , mock_uuid , mock_getenv , mock_get_aws_signed_request , mock_request ):
217278 """Test upload with image that has no format (defaults to PNG) uses UUID filename"""
218279 mock_uuid .return_value = uuid .UUID ('12345678-1234-5678-1234-567812345678' )
219280 mock_getenv .return_value = 'https://s3.amazonaws.com/bucket/'
220281
282+ # Mock the AWS signed request
283+ mock_prepared_request = Mock ()
284+ mock_prepared_request .method = 'PUT'
285+ mock_prepared_request .url = 'https://s3.amazonaws.com/bucket/eduvision/12345678-1234-5678-1234-567812345678.png'
286+ mock_prepared_request .body = b'mock_body'
287+ mock_prepared_request .headers = {'Content-Type' : 'image/png' }
288+
289+ mock_aws_request = Mock ()
290+ mock_aws_request .prepare .return_value = mock_prepared_request
291+ mock_get_aws_signed_request .return_value = mock_aws_request
292+
221293 mock_response = Mock ()
222294 mock_response .status_code = 200
223- mock_put .return_value = mock_response
295+ mock_request .return_value = mock_response
224296
225297 img = Image .new ('RGB' , (100 , 100 ))
226298 img .format = None
227299
228- result = upload_image (img )
229-
230- assert result == 'https://s3.amazonaws.com/bucket/12345678-1234-5678-1234-567812345678.png'
231-
232- @patch ('lf_toolkit.evaluation.image_upload.requests.put' )
233- @patch ('lf_toolkit.evaluation.image_upload.os.getenv' )
234- @patch ('lf_toolkit.evaluation.image_upload.uuid.uuid4' )
235- def test_upload_verifies_correct_file_uploaded (self , mock_uuid , mock_getenv , mock_put ):
236- """Test that the correct file data is sent in upload request"""
237- mock_uuid .return_value = uuid .UUID ('12345678-1234-5678-1234-567812345678' )
238- mock_getenv .return_value = 'https://s3.amazonaws.com/bucket/'
239-
240- mock_response = Mock ()
241- mock_response .status_code = 200
242- mock_put .return_value = mock_response
243-
244- img = Image .new ('RGB' , (100 , 100 ), color = 'blue' )
245- img .format = 'JPEG'
300+ result = upload_image (img , "eduvision" )
246301
247- upload_image ( img )
302+ assert result == 'https://s3.amazonaws.com/bucket/eduvision/12345678-1234-5678-1234-567812345678.png'
248303
249304
250305class TestExceptionHierarchy :
0 commit comments