Skip to content

Commit b375d16

Browse files
committed
Added passing of folder name
1 parent e011409 commit b375d16

File tree

2 files changed

+110
-54
lines changed

2 files changed

+110
-54
lines changed

lf_toolkit/evaluation/image_upload.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,11 @@ def get_aws_signed_request(full_url, buffer, mime_type):
113113
return aws_request
114114

115115

116-
def upload_image(img: Image.Image) -> str:
116+
def upload_image(img: Image.Image, folder_name: str) -> str:
117117
"""Upload PIL image with comprehensive MIME type validation
118118
119119
Args:
120+
folder_name: name of folder to save image
120121
img: PIL Image object to upload
121122
122123
Returns:
@@ -133,7 +134,7 @@ def upload_image(img: Image.Image) -> str:
133134

134135
filename: str = generate_file_name(img)
135136

136-
full_url = base_url + filename
137+
full_url = os.path.join(base_url, folder_name, filename)
137138

138139
if img.format is None:
139140
img.format = 'PNG'
@@ -174,5 +175,5 @@ def upload_image(img: Image.Image) -> str:
174175
img.format = 'JPEG'
175176

176177
# Execute
177-
result = upload_image(img)
178+
result = upload_image(img, "eduvision")
178179
print(result)

tests/evaluation/image_upload_test.py

Lines changed: 106 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
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):
9897
class 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

250305
class TestExceptionHierarchy:

0 commit comments

Comments
 (0)