3 namespace Drupal\Tests\image\Functional;
5 use Drupal\image\Entity\ImageStyle;
6 use Drupal\Tests\BrowserTestBase;
7 use Drupal\Tests\TestFileCreationTrait;
10 * Tests that images have correct dimensions when styled.
14 class ImageDimensionsTest extends BrowserTestBase {
16 use TestFileCreationTrait {
17 getTestFiles as drupalGetTestFiles;
18 compareFiles as drupalCompareFiles;
26 public static $modules = ['image', 'image_module_test'];
28 protected $profile = 'testing';
31 * Test styled image dimensions cumulatively.
33 public function testImageDimensions() {
34 $image_factory = $this->container->get('image.factory');
35 // Create a working copy of the file.
36 $files = $this->drupalGetTestFiles('image');
37 $file = reset($files);
38 $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME);
41 /** @var $style \Drupal\image\ImageStyleInterface */
42 $style = ImageStyle::create(['name' => 'test', 'label' => 'Test']);
44 $generated_uri = 'public://styles/test/public/' . \Drupal::service('file_system')->basename($original_uri);
45 $url = file_url_transform_relative($style->buildUrl($original_uri));
48 '#theme' => 'image_style',
49 '#style_name' => 'test',
50 '#uri' => $original_uri,
54 // Verify that the original image matches the hard-coded values.
55 $image_file = $image_factory->get($original_uri);
56 $this->assertEqual($image_file->getWidth(), $variables['#width']);
57 $this->assertEqual($image_file->getHeight(), $variables['#height']);
59 // Scale an image that is wider than it is high.
61 'id' => 'image_scale',
70 $style->addImageEffect($effect);
72 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="120" height="60" alt="" class="image-style-test" />');
73 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
74 $this->drupalGet($this->getAbsoluteUrl($url));
75 $this->assertResponse(200, 'Image was generated at the URL.');
76 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
77 $image_file = $image_factory->get($generated_uri);
78 $this->assertEqual($image_file->getWidth(), 120);
79 $this->assertEqual($image_file->getHeight(), 60);
81 // Rotate 90 degrees anticlockwise.
83 'id' => 'image_rotate',
91 $style->addImageEffect($effect);
93 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="60" height="120" alt="" class="image-style-test" />');
94 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
95 $this->drupalGet($this->getAbsoluteUrl($url));
96 $this->assertResponse(200, 'Image was generated at the URL.');
97 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
98 $image_file = $image_factory->get($generated_uri);
99 $this->assertEqual($image_file->getWidth(), 60);
100 $this->assertEqual($image_file->getHeight(), 120);
102 // Scale an image that is higher than it is wide (rotated by previous effect).
104 'id' => 'image_scale',
113 $style->addImageEffect($effect);
115 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />');
116 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
117 $this->drupalGet($this->getAbsoluteUrl($url));
118 $this->assertResponse(200, 'Image was generated at the URL.');
119 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
120 $image_file = $image_factory->get($generated_uri);
121 $this->assertEqual($image_file->getWidth(), 45);
122 $this->assertEqual($image_file->getHeight(), 90);
124 // Test upscale disabled.
126 'id' => 'image_scale',
135 $style->addImageEffect($effect);
137 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />');
138 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
139 $this->drupalGet($this->getAbsoluteUrl($url));
140 $this->assertResponse(200, 'Image was generated at the URL.');
141 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
142 $image_file = $image_factory->get($generated_uri);
143 $this->assertEqual($image_file->getWidth(), 45);
144 $this->assertEqual($image_file->getHeight(), 90);
146 // Add a desaturate effect.
148 'id' => 'image_desaturate',
153 $style->addImageEffect($effect);
155 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />');
156 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
157 $this->drupalGet($this->getAbsoluteUrl($url));
158 $this->assertResponse(200, 'Image was generated at the URL.');
159 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
160 $image_file = $image_factory->get($generated_uri);
161 $this->assertEqual($image_file->getWidth(), 45);
162 $this->assertEqual($image_file->getHeight(), 90);
164 // Add a random rotate effect.
166 'id' => 'image_rotate',
174 $style->addImageEffect($effect);
176 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" alt="" class="image-style-test" />');
177 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
178 $this->drupalGet($this->getAbsoluteUrl($url));
179 $this->assertResponse(200, 'Image was generated at the URL.');
180 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
182 // Add a crop effect.
184 'id' => 'image_crop',
188 'anchor' => 'center-center',
193 $style->addImageEffect($effect);
195 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="30" height="30" alt="" class="image-style-test" />');
196 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
197 $this->drupalGet($this->getAbsoluteUrl($url));
198 $this->assertResponse(200, 'Image was generated at the URL.');
199 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
200 $image_file = $image_factory->get($generated_uri);
201 $this->assertEqual($image_file->getWidth(), 30);
202 $this->assertEqual($image_file->getHeight(), 30);
204 // Rotate to a non-multiple of 90 degrees.
206 'id' => 'image_rotate',
214 $effect_id = $style->addImageEffect($effect);
216 // @todo Uncomment this once
217 // https://www.drupal.org/project/drupal/issues/2670966 is resolved.
218 // $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="41" height="41" alt="" class="image-style-test" />');
219 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
220 $this->drupalGet($this->getAbsoluteUrl($url));
221 $this->assertResponse(200, 'Image was generated at the URL.');
222 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
223 $image_file = $image_factory->get($generated_uri);
224 // @todo Uncomment this once
225 // https://www.drupal.org/project/drupal/issues/2670966 is resolved.
226 // $this->assertEqual($image_file->getWidth(), 41);
227 // $this->assertEqual($image_file->getHeight(), 41);
229 $effect_plugin = $style->getEffect($effect_id);
230 $style->deleteImageEffect($effect_plugin);
232 // Ensure that an effect can unset dimensions.
234 'id' => 'image_module_test_null',
239 $style->addImageEffect($effect);
241 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" alt="" class="image-style-test" />');
243 // Test URI dependent image effect.
244 $style = ImageStyle::create(['name' => 'test_uri', 'label' => 'Test URI']);
246 'id' => 'image_module_test_uri_dependent',
250 $style->addImageEffect($effect);
253 '#theme' => 'image_style',
254 '#style_name' => 'test_uri',
255 '#uri' => $original_uri,
259 // PNG original image. Should be resized to 100x100.
260 $generated_uri = 'public://styles/test_uri/public/' . \Drupal::service('file_system')->basename($original_uri);
261 $url = file_url_transform_relative($style->buildUrl($original_uri));
262 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="100" height="100" alt="" class="image-style-test-uri" />');
263 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
264 $this->drupalGet($this->getAbsoluteUrl($url));
265 $this->assertResponse(200, 'Image was generated at the URL.');
266 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
267 $image_file = $image_factory->get($generated_uri);
268 $this->assertEqual($image_file->getWidth(), 100);
269 $this->assertEqual($image_file->getHeight(), 100);
270 // GIF original image. Should be resized to 50x50.
272 $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME);
273 $generated_uri = 'public://styles/test_uri/public/' . \Drupal::service('file_system')->basename($original_uri);
274 $url = file_url_transform_relative($style->buildUrl($original_uri));
275 $variables['#uri'] = $original_uri;
276 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="50" height="50" alt="" class="image-style-test-uri" />');
277 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
278 $this->drupalGet($this->getAbsoluteUrl($url));
279 $this->assertResponse(200, 'Image was generated at the URL.');
280 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
281 $image_file = $image_factory->get($generated_uri);
282 $this->assertEqual($image_file->getWidth(), 50);
283 $this->assertEqual($image_file->getHeight(), 50);
287 * Render an image style element.
289 * Function drupal_render() alters the passed $variables array by adding a new
290 * key '#printed' => TRUE. This prevents next call to re-render the element.
291 * We wrap drupal_render() in a helper protected method and pass each time a
292 * fresh array so that $variables won't get altered and the element is
293 * re-rendered each time.
295 protected function getImageTag($variables) {
296 return str_replace("\n", NULL, \Drupal::service('renderer')->renderRoot($variables));