3 namespace Drupal\image\Tests;
5 use Drupal\image\Entity\ImageStyle;
6 use Drupal\simpletest\WebTestBase;
9 * Tests that images have correct dimensions when styled.
13 class ImageDimensionsTest extends WebTestBase {
20 public static $modules = ['image', 'image_module_test'];
22 protected $profile = 'testing';
25 * Test styled image dimensions cumulatively.
27 public function testImageDimensions() {
28 $image_factory = $this->container->get('image.factory');
29 // Create a working copy of the file.
30 $files = $this->drupalGetTestFiles('image');
31 $file = reset($files);
32 $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME);
35 /** @var $style \Drupal\image\ImageStyleInterface */
36 $style = ImageStyle::create(['name' => 'test', 'label' => 'Test']);
38 $generated_uri = 'public://styles/test/public/' . \Drupal::service('file_system')->basename($original_uri);
39 $url = file_url_transform_relative($style->buildUrl($original_uri));
42 '#theme' => 'image_style',
43 '#style_name' => 'test',
44 '#uri' => $original_uri,
48 // Verify that the original image matches the hard-coded values.
49 $image_file = $image_factory->get($original_uri);
50 $this->assertEqual($image_file->getWidth(), $variables['#width']);
51 $this->assertEqual($image_file->getHeight(), $variables['#height']);
53 // Scale an image that is wider than it is high.
55 'id' => 'image_scale',
64 $style->addImageEffect($effect);
66 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="120" height="60" alt="" class="image-style-test" />');
67 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
68 $this->drupalGet($this->getAbsoluteUrl($url));
69 $this->assertResponse(200, 'Image was generated at the URL.');
70 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
71 $image_file = $image_factory->get($generated_uri);
72 $this->assertEqual($image_file->getWidth(), 120);
73 $this->assertEqual($image_file->getHeight(), 60);
75 // Rotate 90 degrees anticlockwise.
77 'id' => 'image_rotate',
85 $style->addImageEffect($effect);
87 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="60" height="120" alt="" class="image-style-test" />');
88 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
89 $this->drupalGet($this->getAbsoluteUrl($url));
90 $this->assertResponse(200, 'Image was generated at the URL.');
91 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
92 $image_file = $image_factory->get($generated_uri);
93 $this->assertEqual($image_file->getWidth(), 60);
94 $this->assertEqual($image_file->getHeight(), 120);
96 // Scale an image that is higher than it is wide (rotated by previous effect).
98 'id' => 'image_scale',
107 $style->addImageEffect($effect);
109 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />');
110 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
111 $this->drupalGet($this->getAbsoluteUrl($url));
112 $this->assertResponse(200, 'Image was generated at the URL.');
113 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
114 $image_file = $image_factory->get($generated_uri);
115 $this->assertEqual($image_file->getWidth(), 45);
116 $this->assertEqual($image_file->getHeight(), 90);
118 // Test upscale disabled.
120 'id' => 'image_scale',
129 $style->addImageEffect($effect);
131 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />');
132 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
133 $this->drupalGet($this->getAbsoluteUrl($url));
134 $this->assertResponse(200, 'Image was generated at the URL.');
135 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
136 $image_file = $image_factory->get($generated_uri);
137 $this->assertEqual($image_file->getWidth(), 45);
138 $this->assertEqual($image_file->getHeight(), 90);
140 // Add a desaturate effect.
142 'id' => 'image_desaturate',
147 $style->addImageEffect($effect);
149 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="45" height="90" alt="" class="image-style-test" />');
150 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
151 $this->drupalGet($this->getAbsoluteUrl($url));
152 $this->assertResponse(200, 'Image was generated at the URL.');
153 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
154 $image_file = $image_factory->get($generated_uri);
155 $this->assertEqual($image_file->getWidth(), 45);
156 $this->assertEqual($image_file->getHeight(), 90);
158 // Add a random rotate effect.
160 'id' => 'image_rotate',
168 $style->addImageEffect($effect);
170 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" alt="" class="image-style-test" />');
171 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
172 $this->drupalGet($this->getAbsoluteUrl($url));
173 $this->assertResponse(200, 'Image was generated at the URL.');
174 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
176 // Add a crop effect.
178 'id' => 'image_crop',
182 'anchor' => 'center-center',
187 $style->addImageEffect($effect);
189 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="30" height="30" alt="" class="image-style-test" />');
190 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
191 $this->drupalGet($this->getAbsoluteUrl($url));
192 $this->assertResponse(200, 'Image was generated at the URL.');
193 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
194 $image_file = $image_factory->get($generated_uri);
195 $this->assertEqual($image_file->getWidth(), 30);
196 $this->assertEqual($image_file->getHeight(), 30);
198 // Rotate to a non-multiple of 90 degrees.
200 'id' => 'image_rotate',
208 $effect_id = $style->addImageEffect($effect);
210 // @todo Uncomment this once
211 // https://www.drupal.org/project/drupal/issues/2670966 is resolved.
212 // $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="41" height="41" alt="" class="image-style-test" />');
213 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
214 $this->drupalGet($this->getAbsoluteUrl($url));
215 $this->assertResponse(200, 'Image was generated at the URL.');
216 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
217 $image_file = $image_factory->get($generated_uri);
218 // @todo Uncomment this once
219 // https://www.drupal.org/project/drupal/issues/2670966 is resolved.
220 // $this->assertEqual($image_file->getWidth(), 41);
221 // $this->assertEqual($image_file->getHeight(), 41);
223 $effect_plugin = $style->getEffect($effect_id);
224 $style->deleteImageEffect($effect_plugin);
226 // Ensure that an effect can unset dimensions.
228 'id' => 'image_module_test_null',
233 $style->addImageEffect($effect);
235 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" alt="" class="image-style-test" />');
237 // Test URI dependent image effect.
238 $style = ImageStyle::create(['name' => 'test_uri', 'label' => 'Test URI']);
240 'id' => 'image_module_test_uri_dependent',
244 $style->addImageEffect($effect);
247 '#theme' => 'image_style',
248 '#style_name' => 'test_uri',
249 '#uri' => $original_uri,
253 // PNG original image. Should be resized to 100x100.
254 $generated_uri = 'public://styles/test_uri/public/' . \Drupal::service('file_system')->basename($original_uri);
255 $url = file_url_transform_relative($style->buildUrl($original_uri));
256 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="100" height="100" alt="" class="image-style-test-uri" />');
257 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
258 $this->drupalGet($this->getAbsoluteUrl($url));
259 $this->assertResponse(200, 'Image was generated at the URL.');
260 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
261 $image_file = $image_factory->get($generated_uri);
262 $this->assertEqual($image_file->getWidth(), 100);
263 $this->assertEqual($image_file->getHeight(), 100);
264 // GIF original image. Should be resized to 50x50.
266 $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME);
267 $generated_uri = 'public://styles/test_uri/public/' . \Drupal::service('file_system')->basename($original_uri);
268 $url = file_url_transform_relative($style->buildUrl($original_uri));
269 $variables['#uri'] = $original_uri;
270 $this->assertEqual($this->getImageTag($variables), '<img src="' . $url . '" width="50" height="50" alt="" class="image-style-test-uri" />');
271 $this->assertFalse(file_exists($generated_uri), 'Generated file does not exist.');
272 $this->drupalGet($this->getAbsoluteUrl($url));
273 $this->assertResponse(200, 'Image was generated at the URL.');
274 $this->assertTrue(file_exists($generated_uri), 'Generated file does exist after we accessed it.');
275 $image_file = $image_factory->get($generated_uri);
276 $this->assertEqual($image_file->getWidth(), 50);
277 $this->assertEqual($image_file->getHeight(), 50);
281 * Render an image style element.
283 * drupal_render() alters the passed $variables array by adding a new key
284 * '#printed' => TRUE. This prevents next call to re-render the element. We
285 * wrap drupal_render() in a helper protected method and pass each time a
286 * fresh array so that $variables won't get altered and the element is
287 * re-rendered each time.
289 protected function getImageTag($variables) {
290 return str_replace("\n", NULL, \Drupal::service('renderer')->renderRoot($variables));