Mercurial > public > sg101
comparison core/tests/images/test_utils.py @ 1232:25739432af72 modernize tip
Add unit tests for core.images.utils.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Wed, 30 Apr 2025 21:01:21 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1231:bbabbbb80d60 | 1232:25739432af72 |
---|---|
1 import datetime | |
2 import unittest | |
3 | |
4 from PIL import Image | |
5 | |
6 from mock import patch, call, Mock | |
7 from core.images import utils | |
8 | |
9 | |
10 class ParseImageTestCase(unittest.TestCase): | |
11 @patch('core.images.utils.ImageFile') | |
12 def test_parse_image(self, image_file_mock): | |
13 file = Mock() | |
14 file.chunks.return_value = ['a', 'b', 'c'] | |
15 | |
16 result = utils.parse_image(file) | |
17 | |
18 self.assertEqual(image_file_mock.mock_calls, [ | |
19 call.Parser(), | |
20 call.Parser().feed('a'), | |
21 call.Parser().feed('b'), | |
22 call.Parser().feed('c'), | |
23 call.Parser().close(), | |
24 ]) | |
25 self.assertEqual(result, image_file_mock.Parser().close()) | |
26 | |
27 | |
28 class DownscaleTestCase(unittest.TestCase): | |
29 def setUp(self): | |
30 self.image = Mock() | |
31 | |
32 def test_will_not_upscale(self): | |
33 self.image.size = (50, 50) | |
34 result = utils.downscale_image_square(self.image, 100) | |
35 self.assertEqual(result, self.image) | |
36 self.assertListEqual(self.image.mock_calls, []) | |
37 | |
38 def test_downscale_square(self): | |
39 self.image.size = (50, 50) | |
40 result = utils.downscale_image_square(self.image, 25) | |
41 | |
42 self.assertEqual(result, | |
43 self.image.resize((25, 25), Image.ANTIALIAS)) | |
44 | |
45 def test_downscale_wider(self): | |
46 self.image.size = (500, 400) | |
47 result = utils.downscale_image_square(self.image, 100) | |
48 | |
49 self.assertEqual(self.image.mock_calls, [ | |
50 call.crop((50, 0, 450, 400)), | |
51 call.crop().resize((100, 100), Image.ANTIALIAS), | |
52 ]) | |
53 self.assertEqual(result, self.image.crop().resize()) | |
54 | |
55 def test_downscale_taller(self): | |
56 self.image.size = (400, 500) | |
57 result = utils.downscale_image_square(self.image, 100) | |
58 | |
59 self.assertEqual(self.image.mock_calls, [ | |
60 call.crop((0, 50, 400, 450)), | |
61 call.crop().resize((100, 100), Image.ANTIALIAS), | |
62 ]) | |
63 self.assertEqual(result, self.image.crop().resize()) | |
64 | |
65 | |
66 class OrientImageTestCase(unittest.TestCase): | |
67 def setUp(self): | |
68 self.image = Mock() | |
69 | |
70 def test_has_no_exif_attribute(self): | |
71 self.image = Mock(spec=Image) | |
72 | |
73 result = utils.orient_image(self.image) | |
74 | |
75 self.assertEqual(result, (False, self.image)) | |
76 self.assertEqual(self.image.mock_calls, []) | |
77 | |
78 def test_getexif_raises(self): | |
79 attrs = {'_getexif.side_effect': IndexError} | |
80 self.image.configure_mock(**attrs) | |
81 | |
82 result = utils.orient_image(self.image) | |
83 | |
84 self.assertEqual(result, (False, self.image)) | |
85 self.assertEqual(self.image.mock_calls, [ | |
86 call._getexif(), | |
87 ]) | |
88 | |
89 def test_exif_has_no_orient_tag(self): | |
90 attrs = {'_getexif.return_value': {}} | |
91 self.image.configure_mock(**attrs) | |
92 | |
93 result = utils.orient_image(self.image) | |
94 | |
95 self.assertEqual(result, (False, self.image)) | |
96 self.assertEqual(self.image.mock_calls, [ | |
97 call._getexif(), | |
98 ]) | |
99 | |
100 def test_exif_has_normal_orientation(self): | |
101 attrs = {'_getexif.return_value': {0x112: 1}} | |
102 self.image.configure_mock(**attrs) | |
103 | |
104 result = utils.orient_image(self.image) | |
105 | |
106 self.assertEqual(result, (False, self.image)) | |
107 self.assertEqual(self.image.mock_calls, [ | |
108 call._getexif(), | |
109 ]) | |
110 | |
111 def test_exif_indicates_flipped_horizontal(self): | |
112 attrs = {'_getexif.return_value': {0x112: 2}} | |
113 self.image.configure_mock(**attrs) | |
114 new_image = Mock() | |
115 self.image.transpose.return_value = new_image | |
116 | |
117 result = utils.orient_image(self.image) | |
118 | |
119 self.assertEqual(result, (True, new_image)) | |
120 self.assertEqual(self.image.mock_calls, [ | |
121 call._getexif(), | |
122 call.transpose(Image.FLIP_LEFT_RIGHT), | |
123 ]) | |
124 | |
125 def test_exif_indicates_rotate_180(self): | |
126 attrs = {'_getexif.return_value': {0x112: 3}} | |
127 self.image.configure_mock(**attrs) | |
128 new_image = Mock() | |
129 self.image.transpose.return_value = new_image | |
130 | |
131 result = utils.orient_image(self.image) | |
132 | |
133 self.assertEqual(result, (True, new_image)) | |
134 self.assertEqual(self.image.mock_calls, [ | |
135 call._getexif(), | |
136 call.transpose(Image.ROTATE_180), | |
137 ]) | |
138 | |
139 def test_exif_indicates_mirror_vertical(self): | |
140 attrs = {'_getexif.return_value': {0x112: 4}} | |
141 self.image.configure_mock(**attrs) | |
142 new_image = Mock() | |
143 self.image.transpose.return_value = new_image | |
144 | |
145 result = utils.orient_image(self.image) | |
146 | |
147 self.assertEqual(result, (True, new_image)) | |
148 self.assertEqual(self.image.mock_calls, [ | |
149 call._getexif(), | |
150 call.transpose(Image.FLIP_TOP_BOTTOM), | |
151 ]) | |
152 | |
153 def test_exif_indicates_mirror_horiz_rotate_270(self): | |
154 attrs = {'_getexif.return_value': {0x112: 5}} | |
155 self.image.configure_mock(**attrs) | |
156 self.image.transpose.return_value = self.image | |
157 | |
158 result = utils.orient_image(self.image) | |
159 | |
160 self.assertEqual(result, (True, self.image)) | |
161 self.assertEqual(self.image.mock_calls, [ | |
162 call._getexif(), | |
163 call.transpose(Image.FLIP_LEFT_RIGHT), | |
164 call.transpose(Image.ROTATE_90), | |
165 ]) | |
166 | |
167 def test_exif_indicates_rotate_90(self): | |
168 attrs = {'_getexif.return_value': {0x112: 6}} | |
169 self.image.configure_mock(**attrs) | |
170 self.image.transpose.return_value = self.image | |
171 | |
172 result = utils.orient_image(self.image) | |
173 | |
174 self.assertEqual(result, (True, self.image)) | |
175 self.assertEqual(self.image.mock_calls, [ | |
176 call._getexif(), | |
177 call.transpose(Image.ROTATE_270), | |
178 ]) | |
179 | |
180 def test_exif_indicates_mirror_horiz_rotate_90(self): | |
181 attrs = {'_getexif.return_value': {0x112: 7}} | |
182 self.image.configure_mock(**attrs) | |
183 self.image.transpose.return_value = self.image | |
184 | |
185 result = utils.orient_image(self.image) | |
186 | |
187 self.assertEqual(result, (True, self.image)) | |
188 self.assertEqual(self.image.mock_calls, [ | |
189 call._getexif(), | |
190 call.transpose(Image.FLIP_TOP_BOTTOM), | |
191 call.transpose(Image.ROTATE_90), | |
192 ]) | |
193 | |
194 def test_exif_indicates_rotate_270(self): | |
195 attrs = {'_getexif.return_value': {0x112: 8}} | |
196 self.image.configure_mock(**attrs) | |
197 self.image.transpose.return_value = self.image | |
198 | |
199 result = utils.orient_image(self.image) | |
200 | |
201 self.assertEqual(result, (True, self.image)) | |
202 self.assertEqual(self.image.mock_calls, [ | |
203 call._getexif(), | |
204 call.transpose(Image.ROTATE_90), | |
205 ]) | |
206 | |
207 def test_exif_indicates_unknown_orientation(self): | |
208 attrs = {'_getexif.return_value': {0x112: 42}} | |
209 self.image.configure_mock(**attrs) | |
210 self.image.transpose.return_value = self.image | |
211 | |
212 result = utils.orient_image(self.image) | |
213 | |
214 self.assertEqual(result, (False, self.image)) | |
215 self.assertEqual(self.image.mock_calls, [ | |
216 call._getexif(), | |
217 ]) |