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 ])