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