annotate core/modules/image/tests/src/Functional/ImageDimensionsTest.php @ 17:129ea1e6d783

Update, including to Drupal core 8.6.10
author Chris Cannam
date Thu, 28 Feb 2019 13:21:36 +0000
parents c2387f117808
children af1871eacc83
rev   line source
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 }