Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\image\Tests;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\image\Entity\ImageStyle;
|
Chris@0
|
6 use Drupal\simpletest\WebTestBase;
|
Chris@0
|
7
|
Chris@0
|
8 /**
|
Chris@0
|
9 * Tests that images have correct dimensions when styled.
|
Chris@0
|
10 *
|
Chris@0
|
11 * @group image
|
Chris@0
|
12 */
|
Chris@0
|
13 class ImageDimensionsTest extends WebTestBase {
|
Chris@0
|
14
|
Chris@0
|
15 /**
|
Chris@0
|
16 * Modules to enable.
|
Chris@0
|
17 *
|
Chris@0
|
18 * @var array
|
Chris@0
|
19 */
|
Chris@0
|
20 public static $modules = ['image', 'image_module_test'];
|
Chris@0
|
21
|
Chris@0
|
22 protected $profile = 'testing';
|
Chris@0
|
23
|
Chris@0
|
24 /**
|
Chris@0
|
25 * Test styled image dimensions cumulatively.
|
Chris@0
|
26 */
|
Chris@0
|
27 public function testImageDimensions() {
|
Chris@0
|
28 $image_factory = $this->container->get('image.factory');
|
Chris@0
|
29 // Create a working copy of the file.
|
Chris@0
|
30 $files = $this->drupalGetTestFiles('image');
|
Chris@0
|
31 $file = reset($files);
|
Chris@0
|
32 $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME);
|
Chris@0
|
33
|
Chris@0
|
34 // Create a style.
|
Chris@0
|
35 /** @var $style \Drupal\image\ImageStyleInterface */
|
Chris@0
|
36 $style = ImageStyle::create(['name' => 'test', 'label' => 'Test']);
|
Chris@0
|
37 $style->save();
|
Chris@0
|
38 $generated_uri = 'public://styles/test/public/' . \Drupal::service('file_system')->basename($original_uri);
|
Chris@0
|
39 $url = file_url_transform_relative($style->buildUrl($original_uri));
|
Chris@0
|
40
|
Chris@0
|
41 $variables = [
|
Chris@0
|
42 '#theme' => 'image_style',
|
Chris@0
|
43 '#style_name' => 'test',
|
Chris@0
|
44 '#uri' => $original_uri,
|
Chris@0
|
45 '#width' => 40,
|
Chris@0
|
46 '#height' => 20,
|
Chris@0
|
47 ];
|
Chris@0
|
48 // Verify that the original image matches the hard-coded values.
|
Chris@0
|
49 $image_file = $image_factory->get($original_uri);
|
Chris@0
|
50 $this->assertEqual($image_file->getWidth(), $variables['#width']);
|
Chris@0
|
51 $this->assertEqual($image_file->getHeight(), $variables['#height']);
|
Chris@0
|
52
|
Chris@0
|
53 // Scale an image that is wider than it is high.
|
Chris@0
|
54 $effect = [
|
Chris@0
|
55 'id' => 'image_scale',
|
Chris@0
|
56 'data' => [
|
Chris@0
|
57 'width' => 120,
|
Chris@0
|
58 'height' => 90,
|
Chris@0
|
59 'upscale' => TRUE,
|
Chris@0
|
60 ],
|
Chris@0
|
61 'weight' => 0,
|
Chris@0
|
62 ];
|
Chris@0
|
63
|
Chris@0
|
64 $style->addImageEffect($effect);
|
Chris@0
|
65 $style->save();
|
Chris@0
|
66 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="120" height="60" alt="" class="image-style-test" />');
|
Chris@0
|
67 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
|
Chris@0
|
68 $this->drupalGet($this->getAbsoluteUrl($url));
|
Chris@0
|
69 $this->assertResponse(200, 'Image was generated at the URL.');
|
Chris@0
|
70 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
|
Chris@0
|
71 $image_file = $image_factory->get($generated_uri);
|
Chris@0
|
72 $this->assertEqual($image_file->getWidth(), 120);
|
Chris@0
|
73 $this->assertEqual($image_file->getHeight(), 60);
|
Chris@0
|
74
|
Chris@0
|
75 // Rotate 90 degrees anticlockwise.
|
Chris@0
|
76 $effect = [
|
Chris@0
|
77 'id' => 'image_rotate',
|
Chris@0
|
78 'data' => [
|
Chris@0
|
79 'degrees' => -90,
|
Chris@0
|
80 'random' => FALSE,
|
Chris@0
|
81 ],
|
Chris@0
|
82 'weight' => 1,
|
Chris@0
|
83 ];
|
Chris@0
|
84
|
Chris@0
|
85 $style->addImageEffect($effect);
|
Chris@0
|
86 $style->save();
|
Chris@0
|
87 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="60" height="120" alt="" class="image-style-test" />');
|
Chris@0
|
88 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
|
Chris@0
|
89 $this->drupalGet($this->getAbsoluteUrl($url));
|
Chris@0
|
90 $this->assertResponse(200, 'Image was generated at the URL.');
|
Chris@0
|
91 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
|
Chris@0
|
92 $image_file = $image_factory->get($generated_uri);
|
Chris@0
|
93 $this->assertEqual($image_file->getWidth(), 60);
|
Chris@0
|
94 $this->assertEqual($image_file->getHeight(), 120);
|
Chris@0
|
95
|
Chris@0
|
96 // Scale an image that is higher than it is wide (rotated by previous effect).
|
Chris@0
|
97 $effect = [
|
Chris@0
|
98 'id' => 'image_scale',
|
Chris@0
|
99 'data' => [
|
Chris@0
|
100 'width' => 120,
|
Chris@0
|
101 'height' => 90,
|
Chris@0
|
102 'upscale' => TRUE,
|
Chris@0
|
103 ],
|
Chris@0
|
104 'weight' => 2,
|
Chris@0
|
105 ];
|
Chris@0
|
106
|
Chris@0
|
107 $style->addImageEffect($effect);
|
Chris@0
|
108 $style->save();
|
Chris@0
|
109 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />');
|
Chris@0
|
110 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
|
Chris@0
|
111 $this->drupalGet($this->getAbsoluteUrl($url));
|
Chris@0
|
112 $this->assertResponse(200, 'Image was generated at the URL.');
|
Chris@0
|
113 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
|
Chris@0
|
114 $image_file = $image_factory->get($generated_uri);
|
Chris@0
|
115 $this->assertEqual($image_file->getWidth(), 45);
|
Chris@0
|
116 $this->assertEqual($image_file->getHeight(), 90);
|
Chris@0
|
117
|
Chris@0
|
118 // Test upscale disabled.
|
Chris@0
|
119 $effect = [
|
Chris@0
|
120 'id' => 'image_scale',
|
Chris@0
|
121 'data' => [
|
Chris@0
|
122 'width' => 400,
|
Chris@0
|
123 'height' => 200,
|
Chris@0
|
124 'upscale' => FALSE,
|
Chris@0
|
125 ],
|
Chris@0
|
126 'weight' => 3,
|
Chris@0
|
127 ];
|
Chris@0
|
128
|
Chris@0
|
129 $style->addImageEffect($effect);
|
Chris@0
|
130 $style->save();
|
Chris@0
|
131 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />');
|
Chris@0
|
132 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
|
Chris@0
|
133 $this->drupalGet($this->getAbsoluteUrl($url));
|
Chris@0
|
134 $this->assertResponse(200, 'Image was generated at the URL.');
|
Chris@0
|
135 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
|
Chris@0
|
136 $image_file = $image_factory->get($generated_uri);
|
Chris@0
|
137 $this->assertEqual($image_file->getWidth(), 45);
|
Chris@0
|
138 $this->assertEqual($image_file->getHeight(), 90);
|
Chris@0
|
139
|
Chris@0
|
140 // Add a desaturate effect.
|
Chris@0
|
141 $effect = [
|
Chris@0
|
142 'id' => 'image_desaturate',
|
Chris@0
|
143 'data' => [],
|
Chris@0
|
144 'weight' => 4,
|
Chris@0
|
145 ];
|
Chris@0
|
146
|
Chris@0
|
147 $style->addImageEffect($effect);
|
Chris@0
|
148 $style->save();
|
Chris@0
|
149 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />');
|
Chris@0
|
150 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
|
Chris@0
|
151 $this->drupalGet($this->getAbsoluteUrl($url));
|
Chris@0
|
152 $this->assertResponse(200, 'Image was generated at the URL.');
|
Chris@0
|
153 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
|
Chris@0
|
154 $image_file = $image_factory->get($generated_uri);
|
Chris@0
|
155 $this->assertEqual($image_file->getWidth(), 45);
|
Chris@0
|
156 $this->assertEqual($image_file->getHeight(), 90);
|
Chris@0
|
157
|
Chris@0
|
158 // Add a random rotate effect.
|
Chris@0
|
159 $effect = [
|
Chris@0
|
160 'id' => 'image_rotate',
|
Chris@0
|
161 'data' => [
|
Chris@0
|
162 'degrees' => 180,
|
Chris@0
|
163 'random' => TRUE,
|
Chris@0
|
164 ],
|
Chris@0
|
165 'weight' => 5,
|
Chris@0
|
166 ];
|
Chris@0
|
167
|
Chris@0
|
168 $style->addImageEffect($effect);
|
Chris@0
|
169 $style->save();
|
Chris@0
|
170 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" alt="" class="image-style-test" />');
|
Chris@0
|
171 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
|
Chris@0
|
172 $this->drupalGet($this->getAbsoluteUrl($url));
|
Chris@0
|
173 $this->assertResponse(200, 'Image was generated at the URL.');
|
Chris@0
|
174 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
|
Chris@0
|
175
|
Chris@0
|
176 // Add a crop effect.
|
Chris@0
|
177 $effect = [
|
Chris@0
|
178 'id' => 'image_crop',
|
Chris@0
|
179 'data' => [
|
Chris@0
|
180 'width' => 30,
|
Chris@0
|
181 'height' => 30,
|
Chris@0
|
182 'anchor' => 'center-center',
|
Chris@0
|
183 ],
|
Chris@0
|
184 'weight' => 6,
|
Chris@0
|
185 ];
|
Chris@0
|
186
|
Chris@0
|
187 $style->addImageEffect($effect);
|
Chris@0
|
188 $style->save();
|
Chris@0
|
189 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="30" height="30" alt="" class="image-style-test" />');
|
Chris@0
|
190 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
|
Chris@0
|
191 $this->drupalGet($this->getAbsoluteUrl($url));
|
Chris@0
|
192 $this->assertResponse(200, 'Image was generated at the URL.');
|
Chris@0
|
193 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
|
Chris@0
|
194 $image_file = $image_factory->get($generated_uri);
|
Chris@0
|
195 $this->assertEqual($image_file->getWidth(), 30);
|
Chris@0
|
196 $this->assertEqual($image_file->getHeight(), 30);
|
Chris@0
|
197
|
Chris@0
|
198 // Rotate to a non-multiple of 90 degrees.
|
Chris@0
|
199 $effect = [
|
Chris@0
|
200 'id' => 'image_rotate',
|
Chris@0
|
201 'data' => [
|
Chris@0
|
202 'degrees' => 57,
|
Chris@0
|
203 'random' => FALSE,
|
Chris@0
|
204 ],
|
Chris@0
|
205 'weight' => 7,
|
Chris@0
|
206 ];
|
Chris@0
|
207
|
Chris@0
|
208 $effect_id = $style->addImageEffect($effect);
|
Chris@0
|
209 $style->save();
|
Chris@12
|
210 // @todo Uncomment this once
|
Chris@12
|
211 // https://www.drupal.org/project/drupal/issues/2670966 is resolved.
|
Chris@12
|
212 // $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="41" height="41" alt="" class="image-style-test" />');
|
Chris@0
|
213 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
|
Chris@0
|
214 $this->drupalGet($this->getAbsoluteUrl($url));
|
Chris@0
|
215 $this->assertResponse(200, 'Image was generated at the URL.');
|
Chris@0
|
216 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
|
Chris@0
|
217 $image_file = $image_factory->get($generated_uri);
|
Chris@12
|
218 // @todo Uncomment this once
|
Chris@12
|
219 // https://www.drupal.org/project/drupal/issues/2670966 is resolved.
|
Chris@12
|
220 // $this->assertEqual($image_file->getWidth(), 41);
|
Chris@12
|
221 // $this->assertEqual($image_file->getHeight(), 41);
|
Chris@0
|
222
|
Chris@0
|
223 $effect_plugin = $style->getEffect($effect_id);
|
Chris@0
|
224 $style->deleteImageEffect($effect_plugin);
|
Chris@0
|
225
|
Chris@0
|
226 // Ensure that an effect can unset dimensions.
|
Chris@0
|
227 $effect = [
|
Chris@0
|
228 'id' => 'image_module_test_null',
|
Chris@0
|
229 'data' => [],
|
Chris@0
|
230 'weight' => 8,
|
Chris@0
|
231 ];
|
Chris@0
|
232
|
Chris@0
|
233 $style->addImageEffect($effect);
|
Chris@0
|
234 $style->save();
|
Chris@0
|
235 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" alt="" class="image-style-test" />');
|
Chris@0
|
236
|
Chris@0
|
237 // Test URI dependent image effect.
|
Chris@0
|
238 $style = ImageStyle::create(['name' => 'test_uri', 'label' => 'Test URI']);
|
Chris@0
|
239 $effect = [
|
Chris@0
|
240 'id' => 'image_module_test_uri_dependent',
|
Chris@0
|
241 'data' => [],
|
Chris@0
|
242 'weight' => 0,
|
Chris@0
|
243 ];
|
Chris@0
|
244 $style->addImageEffect($effect);
|
Chris@0
|
245 $style->save();
|
Chris@0
|
246 $variables = [
|
Chris@0
|
247 '#theme' => 'image_style',
|
Chris@0
|
248 '#style_name' => 'test_uri',
|
Chris@0
|
249 '#uri' => $original_uri,
|
Chris@0
|
250 '#width' => 40,
|
Chris@0
|
251 '#height' => 20,
|
Chris@0
|
252 ];
|
Chris@0
|
253 // PNG original image. Should be resized to 100x100.
|
Chris@0
|
254 $generated_uri = 'public://styles/test_uri/public/' . \Drupal::service('file_system')->basename($original_uri);
|
Chris@0
|
255 $url = file_url_transform_relative($style->buildUrl($original_uri));
|
Chris@0
|
256 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="100" height="100" alt="" class="image-style-test-uri" />');
|
Chris@0
|
257 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
|
Chris@0
|
258 $this->drupalGet($this->getAbsoluteUrl($url));
|
Chris@0
|
259 $this->assertResponse(200, 'Image was generated at the URL.');
|
Chris@0
|
260 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
|
Chris@0
|
261 $image_file = $image_factory->get($generated_uri);
|
Chris@0
|
262 $this->assertEqual($image_file->getWidth(), 100);
|
Chris@0
|
263 $this->assertEqual($image_file->getHeight(), 100);
|
Chris@0
|
264 // GIF original image. Should be resized to 50x50.
|
Chris@0
|
265 $file = $files[1];
|
Chris@0
|
266 $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME);
|
Chris@0
|
267 $generated_uri = 'public://styles/test_uri/public/' . \Drupal::service('file_system')->basename($original_uri);
|
Chris@0
|
268 $url = file_url_transform_relative($style->buildUrl($original_uri));
|
Chris@0
|
269 $variables['#uri'] = $original_uri;
|
Chris@0
|
270 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="50" height="50" alt="" class="image-style-test-uri" />');
|
Chris@0
|
271 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
|
Chris@0
|
272 $this->drupalGet($this->getAbsoluteUrl($url));
|
Chris@0
|
273 $this->assertResponse(200, 'Image was generated at the URL.');
|
Chris@0
|
274 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
|
Chris@0
|
275 $image_file = $image_factory->get($generated_uri);
|
Chris@0
|
276 $this->assertEqual($image_file->getWidth(), 50);
|
Chris@0
|
277 $this->assertEqual($image_file->getHeight(), 50);
|
Chris@0
|
278 }
|
Chris@0
|
279
|
Chris@0
|
280 /**
|
Chris@0
|
281 * Render an image style element.
|
Chris@0
|
282 *
|
Chris@0
|
283 * drupal_render() alters the passed $variables array by adding a new key
|
Chris@0
|
284 * '#printed' => TRUE. This prevents next call to re-render the element. We
|
Chris@0
|
285 * wrap drupal_render() in a helper protected method and pass each time a
|
Chris@0
|
286 * fresh array so that $variables won't get altered and the element is
|
Chris@0
|
287 * re-rendered each time.
|
Chris@0
|
288 */
|
Chris@0
|
289 protected function getImageTag($variables) {
|
Chris@0
|
290 return str_replace("\n", NULL, \Drupal::service('renderer')->renderRoot($variables));
|
Chris@0
|
291 }
|
Chris@0
|
292
|
Chris@0
|
293 }
|