comparison core/tests/images/test_upload.py @ 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
comparison
equal deleted inserted replaced
1230:f2977a75bf6e 1231:bbabbbb80d60
1 import datetime
1 import unittest 2 import unittest
2 3
3 from mock import patch, call, mock_open, Mock 4 from mock import patch, call, mock_open, Mock
4 from core.images.upload import process_upload 5 from core.images.upload import process_upload
5 6
63 call().__exit__(None, None, None), 64 call().__exit__(None, None, None),
64 ]) 65 ])
65 self.assertEqual(result, 66 self.assertEqual(result,
66 ('https://site.com/media/user_upload/deadbeef.jpg', 67 ('https://site.com/media/user_upload/deadbeef.jpg',
67 'https://site.com/media/user_upload/deadbeeft.jpg')) 68 'https://site.com/media/user_upload/deadbeeft.jpg'))
69
70 @patch('core.images.upload.BytesIO')
71 @patch('core.images.upload.S3Bucket')
72 @patch('core.images.upload.datetime')
73 @patch('core.images.upload.uuid')
74 @patch('core.images.upload.orient_image')
75 @patch('core.images.upload.Image')
76 @patch('core.images.upload.settings.USER_PHOTOS_LOCAL_UPLOAD', new=False)
77 @patch('core.images.upload.settings.USER_PHOTOS_BUCKET', new='bucket-name')
78 @patch('core.images.upload.settings.USER_PHOTOS_BASE_URL', new='base-url')
79 @patch('core.images.upload.settings.USER_PHOTOS_SECRET_KEY', new='secret-key')
80 @patch('core.images.upload.settings.USER_PHOTOS_ACCESS_KEY', new='access-key')
81 def test_s3_upload(self, image_mock, orient_mock, uuid_mock, now_mock,
82 bucket_mock, bytes_mock):
83 now_mock.datetime.now.return_value = datetime.datetime(2025, 4, 20)
84 uuid_mock.uuid4().bytes = 'deadbeef'
85
86 filename = 'image.jpg'
87 orient_mock.return_value = (True, image_mock.open)
88
89 image = Mock()
90 image.size = (2000, 2000)
91 image_mock.open.return_value = image
92
93 uuid_mock.uuid4().hex = 'deadbeef'
94
95 bucket = Mock()
96 bucket_mock.return_value = bucket
97 bucket.upload_from_filename.return_value = 'image-url'
98 bucket.upload_from_string.return_value = 'thumb-url'
99
100 user = Mock(username='pjmoto')
101 open_mock = mock_open()
102 with patch('__builtin__.open', open_mock):
103 result = process_upload(user, filename)
104
105
106 self.assertEqual(image_mock.open.mock_calls, [
107 call(filename),
108 call.save(filename),
109 call(filename),
110 call().thumbnail((660, 720), image_mock.ANTIALIAS),
111 call().save(filename),
112 call(filename),
113 call().thumbnail((120, 120), image_mock.ANTIALIAS),
114 call().save(bytes_mock(), format=image.format),
115 ])
116 orient_mock.assert_called_with(image_mock.open())
117
118 expected_metadata = {
119 'user': 'pjmoto',
120 'date': '2025-04-20 00:00:00',
121 }
122
123 self.assertEqual(bucket_mock.mock_calls, [
124 call(access_key='access-key',
125 secret_key='secret-key',
126 base_url='base-url',
127 bucket_name='bucket-name'),
128 call().upload_from_filename('ZGVhZGJlZWY.jpg', filename,
129 expected_metadata),
130 call().upload_from_string('ZGVhZGJlZWYt.jpg',
131 bytes_mock().getvalue(),
132 expected_metadata),
133 ])
134
135 self.assertEqual(result, ('image-url', 'thumb-url'))
136