changeset 1231:bbabbbb80d60 modernize tip

Add unit test for S3 upload of images.
author Brian Neal <bgneal@gmail.com>
date Sun, 20 Apr 2025 19:15:39 -0500
parents f2977a75bf6e
children
files core/tests/images/test_upload.py
diffstat 1 files changed, 69 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/core/tests/images/test_upload.py	Sun Apr 20 17:49:44 2025 -0500
+++ b/core/tests/images/test_upload.py	Sun Apr 20 19:15:39 2025 -0500
@@ -1,3 +1,4 @@
+import datetime
 import unittest
 
 from mock import patch, call, mock_open, Mock
@@ -65,3 +66,71 @@
         self.assertEqual(result,
                          ('https://site.com/media/user_upload/deadbeef.jpg',
                           'https://site.com/media/user_upload/deadbeeft.jpg'))
+
+    @patch('core.images.upload.BytesIO')
+    @patch('core.images.upload.S3Bucket')
+    @patch('core.images.upload.datetime')
+    @patch('core.images.upload.uuid')
+    @patch('core.images.upload.orient_image')
+    @patch('core.images.upload.Image')
+    @patch('core.images.upload.settings.USER_PHOTOS_LOCAL_UPLOAD', new=False)
+    @patch('core.images.upload.settings.USER_PHOTOS_BUCKET', new='bucket-name')
+    @patch('core.images.upload.settings.USER_PHOTOS_BASE_URL', new='base-url')
+    @patch('core.images.upload.settings.USER_PHOTOS_SECRET_KEY', new='secret-key')
+    @patch('core.images.upload.settings.USER_PHOTOS_ACCESS_KEY', new='access-key')
+    def test_s3_upload(self, image_mock, orient_mock, uuid_mock, now_mock,
+                       bucket_mock, bytes_mock):
+        now_mock.datetime.now.return_value = datetime.datetime(2025, 4, 20)
+        uuid_mock.uuid4().bytes = 'deadbeef'
+
+        filename = 'image.jpg'
+        orient_mock.return_value = (True, image_mock.open)
+
+        image = Mock()
+        image.size = (2000, 2000)
+        image_mock.open.return_value = image
+
+        uuid_mock.uuid4().hex = 'deadbeef'
+
+        bucket = Mock()
+        bucket_mock.return_value = bucket
+        bucket.upload_from_filename.return_value = 'image-url'
+        bucket.upload_from_string.return_value = 'thumb-url'
+
+        user = Mock(username='pjmoto')
+        open_mock = mock_open()
+        with patch('__builtin__.open', open_mock):
+            result = process_upload(user, filename)
+
+
+        self.assertEqual(image_mock.open.mock_calls, [
+            call(filename),
+            call.save(filename),
+            call(filename),
+            call().thumbnail((660, 720), image_mock.ANTIALIAS),
+            call().save(filename),
+            call(filename),
+            call().thumbnail((120, 120), image_mock.ANTIALIAS),
+            call().save(bytes_mock(), format=image.format),
+        ])
+        orient_mock.assert_called_with(image_mock.open())
+
+        expected_metadata = {
+            'user': 'pjmoto',
+            'date': '2025-04-20 00:00:00',
+        }
+
+        self.assertEqual(bucket_mock.mock_calls, [
+            call(access_key='access-key',
+                 secret_key='secret-key',
+                 base_url='base-url',
+                 bucket_name='bucket-name'),
+            call().upload_from_filename('ZGVhZGJlZWY.jpg', filename,
+                                        expected_metadata),
+            call().upload_from_string('ZGVhZGJlZWYt.jpg',
+                                      bytes_mock().getvalue(),
+                                      expected_metadata),
+        ])
+
+        self.assertEqual(result, ('image-url', 'thumb-url'))
+