annotate 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
rev   line source
bgneal@1231 1 import datetime
bgneal@1230 2 import unittest
bgneal@1230 3
bgneal@1230 4 from mock import patch, call, mock_open, Mock
bgneal@1230 5 from core.images.upload import process_upload
bgneal@1230 6
bgneal@1230 7 class ProcessUploadTestCase(unittest.TestCase):
bgneal@1230 8
bgneal@1230 9 @patch('core.images.upload.Site.objects.get_current')
bgneal@1230 10 @patch('core.images.upload.os.chmod')
bgneal@1230 11 @patch('core.images.upload.uuid')
bgneal@1230 12 @patch('core.images.upload.shutil')
bgneal@1230 13 @patch('core.images.upload.BytesIO')
bgneal@1230 14 @patch('core.images.upload.orient_image')
bgneal@1230 15 @patch('core.images.upload.Image')
bgneal@1230 16 @patch('core.images.upload.settings.SITE_SCHEME', new='https')
bgneal@1230 17 @patch('core.images.upload.settings.USER_PHOTOS_LOCAL_UPLOAD', new=True)
bgneal@1230 18 @patch('core.images.upload.settings.MEDIA_ROOT', new='/media')
bgneal@1230 19 @patch('core.images.upload.settings.USER_PHOTOS_LOCAL_UPLOAD_DIR', new='user_upload')
bgneal@1230 20 def test_local_upload(self, image_mock, orient_mock, bytes_mock,
bgneal@1230 21 shutil_mock, uuid_mock, chmod_mock, current_mock):
bgneal@1230 22 filename = 'image.jpg'
bgneal@1230 23 orient_mock.return_value = (True, image_mock.open)
bgneal@1230 24
bgneal@1230 25 image = Mock()
bgneal@1230 26 image.size = (2000, 2000)
bgneal@1230 27 image_mock.open.return_value = image
bgneal@1230 28
bgneal@1230 29 uuid_mock.uuid4().hex = 'deadbeef'
bgneal@1230 30
bgneal@1230 31 site_mock = Mock()
bgneal@1230 32 site_mock.configure_mock(name='Site', domain='site.com')
bgneal@1230 33 current_mock.return_value = site_mock
bgneal@1230 34
bgneal@1230 35 open_mock = mock_open()
bgneal@1230 36 with patch('__builtin__.open', open_mock):
bgneal@1230 37 result = process_upload(None, filename)
bgneal@1230 38
bgneal@1230 39 self.assertEqual(image_mock.open.mock_calls, [
bgneal@1230 40 call(filename),
bgneal@1230 41 call.save(filename),
bgneal@1230 42 call(filename),
bgneal@1230 43 call().thumbnail((660, 720), image_mock.ANTIALIAS),
bgneal@1230 44 call().save(filename),
bgneal@1230 45 call(filename),
bgneal@1230 46 call().thumbnail((120, 120), image_mock.ANTIALIAS),
bgneal@1230 47 call().save(bytes_mock(), format=image.format),
bgneal@1230 48 ])
bgneal@1230 49 orient_mock.assert_called_with(image_mock.open())
bgneal@1230 50
bgneal@1230 51 expected_path = '/media/user_upload/deadbeef.jpg'
bgneal@1230 52 expected_thumb_path = '/media/user_upload/deadbeeft.jpg'
bgneal@1230 53 shutil_mock.copy.assert_called_once_with(filename, expected_path)
bgneal@1230 54 self.assertEqual(chmod_mock.mock_calls, [
bgneal@1230 55 call(expected_path, 0644),
bgneal@1230 56 call(expected_thumb_path, 0644),
bgneal@1230 57 ])
bgneal@1230 58
bgneal@1230 59 bytes_mock().seek.assert_called_once_with(0)
bgneal@1230 60 self.assertEqual(open_mock.mock_calls, [
bgneal@1230 61 call(expected_thumb_path, 'wb'),
bgneal@1230 62 call().__enter__(),
bgneal@1230 63 call().write(bytes_mock().getvalue()),
bgneal@1230 64 call().__exit__(None, None, None),
bgneal@1230 65 ])
bgneal@1230 66 self.assertEqual(result,
bgneal@1230 67 ('https://site.com/media/user_upload/deadbeef.jpg',
bgneal@1230 68 'https://site.com/media/user_upload/deadbeeft.jpg'))
bgneal@1231 69
bgneal@1231 70 @patch('core.images.upload.BytesIO')
bgneal@1231 71 @patch('core.images.upload.S3Bucket')
bgneal@1231 72 @patch('core.images.upload.datetime')
bgneal@1231 73 @patch('core.images.upload.uuid')
bgneal@1231 74 @patch('core.images.upload.orient_image')
bgneal@1231 75 @patch('core.images.upload.Image')
bgneal@1231 76 @patch('core.images.upload.settings.USER_PHOTOS_LOCAL_UPLOAD', new=False)
bgneal@1231 77 @patch('core.images.upload.settings.USER_PHOTOS_BUCKET', new='bucket-name')
bgneal@1231 78 @patch('core.images.upload.settings.USER_PHOTOS_BASE_URL', new='base-url')
bgneal@1231 79 @patch('core.images.upload.settings.USER_PHOTOS_SECRET_KEY', new='secret-key')
bgneal@1231 80 @patch('core.images.upload.settings.USER_PHOTOS_ACCESS_KEY', new='access-key')
bgneal@1231 81 def test_s3_upload(self, image_mock, orient_mock, uuid_mock, now_mock,
bgneal@1231 82 bucket_mock, bytes_mock):
bgneal@1231 83 now_mock.datetime.now.return_value = datetime.datetime(2025, 4, 20)
bgneal@1231 84 uuid_mock.uuid4().bytes = 'deadbeef'
bgneal@1231 85
bgneal@1231 86 filename = 'image.jpg'
bgneal@1231 87 orient_mock.return_value = (True, image_mock.open)
bgneal@1231 88
bgneal@1231 89 image = Mock()
bgneal@1231 90 image.size = (2000, 2000)
bgneal@1231 91 image_mock.open.return_value = image
bgneal@1231 92
bgneal@1231 93 uuid_mock.uuid4().hex = 'deadbeef'
bgneal@1231 94
bgneal@1231 95 bucket = Mock()
bgneal@1231 96 bucket_mock.return_value = bucket
bgneal@1231 97 bucket.upload_from_filename.return_value = 'image-url'
bgneal@1231 98 bucket.upload_from_string.return_value = 'thumb-url'
bgneal@1231 99
bgneal@1231 100 user = Mock(username='pjmoto')
bgneal@1231 101 open_mock = mock_open()
bgneal@1231 102 with patch('__builtin__.open', open_mock):
bgneal@1231 103 result = process_upload(user, filename)
bgneal@1231 104
bgneal@1231 105
bgneal@1231 106 self.assertEqual(image_mock.open.mock_calls, [
bgneal@1231 107 call(filename),
bgneal@1231 108 call.save(filename),
bgneal@1231 109 call(filename),
bgneal@1231 110 call().thumbnail((660, 720), image_mock.ANTIALIAS),
bgneal@1231 111 call().save(filename),
bgneal@1231 112 call(filename),
bgneal@1231 113 call().thumbnail((120, 120), image_mock.ANTIALIAS),
bgneal@1231 114 call().save(bytes_mock(), format=image.format),
bgneal@1231 115 ])
bgneal@1231 116 orient_mock.assert_called_with(image_mock.open())
bgneal@1231 117
bgneal@1231 118 expected_metadata = {
bgneal@1231 119 'user': 'pjmoto',
bgneal@1231 120 'date': '2025-04-20 00:00:00',
bgneal@1231 121 }
bgneal@1231 122
bgneal@1231 123 self.assertEqual(bucket_mock.mock_calls, [
bgneal@1231 124 call(access_key='access-key',
bgneal@1231 125 secret_key='secret-key',
bgneal@1231 126 base_url='base-url',
bgneal@1231 127 bucket_name='bucket-name'),
bgneal@1231 128 call().upload_from_filename('ZGVhZGJlZWY.jpg', filename,
bgneal@1231 129 expected_metadata),
bgneal@1231 130 call().upload_from_string('ZGVhZGJlZWYt.jpg',
bgneal@1231 131 bytes_mock().getvalue(),
bgneal@1231 132 expected_metadata),
bgneal@1231 133 ])
bgneal@1231 134
bgneal@1231 135 self.assertEqual(result, ('image-url', 'thumb-url'))
bgneal@1231 136