bgneal@1231: import datetime bgneal@1230: import unittest bgneal@1230: bgneal@1230: from mock import patch, call, mock_open, Mock bgneal@1230: from core.images.upload import process_upload bgneal@1230: bgneal@1230: class ProcessUploadTestCase(unittest.TestCase): bgneal@1230: bgneal@1230: @patch('core.images.upload.Site.objects.get_current') bgneal@1230: @patch('core.images.upload.os.chmod') bgneal@1230: @patch('core.images.upload.uuid') bgneal@1230: @patch('core.images.upload.shutil') bgneal@1230: @patch('core.images.upload.BytesIO') bgneal@1230: @patch('core.images.upload.orient_image') bgneal@1230: @patch('core.images.upload.Image') bgneal@1230: @patch('core.images.upload.settings.SITE_SCHEME', new='https') bgneal@1230: @patch('core.images.upload.settings.USER_PHOTOS_LOCAL_UPLOAD', new=True) bgneal@1230: @patch('core.images.upload.settings.MEDIA_ROOT', new='/media') bgneal@1230: @patch('core.images.upload.settings.USER_PHOTOS_LOCAL_UPLOAD_DIR', new='user_upload') bgneal@1230: def test_local_upload(self, image_mock, orient_mock, bytes_mock, bgneal@1230: shutil_mock, uuid_mock, chmod_mock, current_mock): bgneal@1230: filename = 'image.jpg' bgneal@1230: orient_mock.return_value = (True, image_mock.open) bgneal@1230: bgneal@1230: image = Mock() bgneal@1230: image.size = (2000, 2000) bgneal@1230: image_mock.open.return_value = image bgneal@1230: bgneal@1230: uuid_mock.uuid4().hex = 'deadbeef' bgneal@1230: bgneal@1230: site_mock = Mock() bgneal@1230: site_mock.configure_mock(name='Site', domain='site.com') bgneal@1230: current_mock.return_value = site_mock bgneal@1230: bgneal@1230: open_mock = mock_open() bgneal@1230: with patch('__builtin__.open', open_mock): bgneal@1230: result = process_upload(None, filename) bgneal@1230: bgneal@1230: self.assertEqual(image_mock.open.mock_calls, [ bgneal@1230: call(filename), bgneal@1230: call.save(filename), bgneal@1230: call(filename), bgneal@1230: call().thumbnail((660, 720), image_mock.ANTIALIAS), bgneal@1230: call().save(filename), bgneal@1230: call(filename), bgneal@1230: call().thumbnail((120, 120), image_mock.ANTIALIAS), bgneal@1230: call().save(bytes_mock(), format=image.format), bgneal@1230: ]) bgneal@1230: orient_mock.assert_called_with(image_mock.open()) bgneal@1230: bgneal@1230: expected_path = '/media/user_upload/deadbeef.jpg' bgneal@1230: expected_thumb_path = '/media/user_upload/deadbeeft.jpg' bgneal@1230: shutil_mock.copy.assert_called_once_with(filename, expected_path) bgneal@1230: self.assertEqual(chmod_mock.mock_calls, [ bgneal@1230: call(expected_path, 0644), bgneal@1230: call(expected_thumb_path, 0644), bgneal@1230: ]) bgneal@1230: bgneal@1230: bytes_mock().seek.assert_called_once_with(0) bgneal@1230: self.assertEqual(open_mock.mock_calls, [ bgneal@1230: call(expected_thumb_path, 'wb'), bgneal@1230: call().__enter__(), bgneal@1230: call().write(bytes_mock().getvalue()), bgneal@1230: call().__exit__(None, None, None), bgneal@1230: ]) bgneal@1230: self.assertEqual(result, bgneal@1230: ('https://site.com/media/user_upload/deadbeef.jpg', bgneal@1230: 'https://site.com/media/user_upload/deadbeeft.jpg')) bgneal@1231: bgneal@1231: @patch('core.images.upload.BytesIO') bgneal@1231: @patch('core.images.upload.S3Bucket') bgneal@1231: @patch('core.images.upload.datetime') bgneal@1231: @patch('core.images.upload.uuid') bgneal@1231: @patch('core.images.upload.orient_image') bgneal@1231: @patch('core.images.upload.Image') bgneal@1231: @patch('core.images.upload.settings.USER_PHOTOS_LOCAL_UPLOAD', new=False) bgneal@1231: @patch('core.images.upload.settings.USER_PHOTOS_BUCKET', new='bucket-name') bgneal@1231: @patch('core.images.upload.settings.USER_PHOTOS_BASE_URL', new='base-url') bgneal@1231: @patch('core.images.upload.settings.USER_PHOTOS_SECRET_KEY', new='secret-key') bgneal@1231: @patch('core.images.upload.settings.USER_PHOTOS_ACCESS_KEY', new='access-key') bgneal@1231: def test_s3_upload(self, image_mock, orient_mock, uuid_mock, now_mock, bgneal@1231: bucket_mock, bytes_mock): bgneal@1231: now_mock.datetime.now.return_value = datetime.datetime(2025, 4, 20) bgneal@1231: uuid_mock.uuid4().bytes = 'deadbeef' bgneal@1231: bgneal@1231: filename = 'image.jpg' bgneal@1231: orient_mock.return_value = (True, image_mock.open) bgneal@1231: bgneal@1231: image = Mock() bgneal@1231: image.size = (2000, 2000) bgneal@1231: image_mock.open.return_value = image bgneal@1231: bgneal@1231: uuid_mock.uuid4().hex = 'deadbeef' bgneal@1231: bgneal@1231: bucket = Mock() bgneal@1231: bucket_mock.return_value = bucket bgneal@1231: bucket.upload_from_filename.return_value = 'image-url' bgneal@1231: bucket.upload_from_string.return_value = 'thumb-url' bgneal@1231: bgneal@1231: user = Mock(username='pjmoto') bgneal@1231: open_mock = mock_open() bgneal@1231: with patch('__builtin__.open', open_mock): bgneal@1231: result = process_upload(user, filename) bgneal@1231: bgneal@1231: bgneal@1231: self.assertEqual(image_mock.open.mock_calls, [ bgneal@1231: call(filename), bgneal@1231: call.save(filename), bgneal@1231: call(filename), bgneal@1231: call().thumbnail((660, 720), image_mock.ANTIALIAS), bgneal@1231: call().save(filename), bgneal@1231: call(filename), bgneal@1231: call().thumbnail((120, 120), image_mock.ANTIALIAS), bgneal@1231: call().save(bytes_mock(), format=image.format), bgneal@1231: ]) bgneal@1231: orient_mock.assert_called_with(image_mock.open()) bgneal@1231: bgneal@1231: expected_metadata = { bgneal@1231: 'user': 'pjmoto', bgneal@1231: 'date': '2025-04-20 00:00:00', bgneal@1231: } bgneal@1231: bgneal@1231: self.assertEqual(bucket_mock.mock_calls, [ bgneal@1231: call(access_key='access-key', bgneal@1231: secret_key='secret-key', bgneal@1231: base_url='base-url', bgneal@1231: bucket_name='bucket-name'), bgneal@1231: call().upload_from_filename('ZGVhZGJlZWY.jpg', filename, bgneal@1231: expected_metadata), bgneal@1231: call().upload_from_string('ZGVhZGJlZWYt.jpg', bgneal@1231: bytes_mock().getvalue(), bgneal@1231: expected_metadata), bgneal@1231: ]) bgneal@1231: bgneal@1231: self.assertEqual(result, ('image-url', 'thumb-url')) bgneal@1231: