annotate core/modules/image/src/Tests/ImageDimensionsTest.php @ 0:4c8ae668cc8c

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