Mercurial > public > sg101
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 |