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
|