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