annotate core/modules/responsive_image/src/Tests/ResponsiveImageFieldDisplayTest.php @ 6:875880e46745

Styling
author Chris Cannam
date Fri, 08 Dec 2017 13:21:27 +0000
parents 4c8ae668cc8c
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\responsive_image\Tests;
Chris@0 4
Chris@0 5 use Drupal\Component\Utility\Unicode;
Chris@0 6 use Drupal\image\Tests\ImageFieldTestBase;
Chris@0 7 use Drupal\image\Entity\ImageStyle;
Chris@0 8 use Drupal\node\Entity\Node;
Chris@0 9 use Drupal\file\Entity\File;
Chris@0 10 use Drupal\responsive_image\Plugin\Field\FieldFormatter\ResponsiveImageFormatter;
Chris@0 11 use Drupal\responsive_image\Entity\ResponsiveImageStyle;
Chris@0 12 use Drupal\user\RoleInterface;
Chris@0 13
Chris@0 14 /**
Chris@0 15 * Tests responsive image display formatter.
Chris@0 16 *
Chris@0 17 * @group responsive_image
Chris@0 18 */
Chris@0 19 class ResponsiveImageFieldDisplayTest extends ImageFieldTestBase {
Chris@0 20
Chris@0 21 protected $dumpHeaders = TRUE;
Chris@0 22
Chris@0 23 /**
Chris@0 24 * Responsive image style entity instance we test with.
Chris@0 25 *
Chris@0 26 * @var \Drupal\responsive_image\Entity\ResponsiveImageStyle
Chris@0 27 */
Chris@0 28 protected $responsiveImgStyle;
Chris@0 29
Chris@0 30 /**
Chris@0 31 * Modules to enable.
Chris@0 32 *
Chris@0 33 * @var array
Chris@0 34 */
Chris@0 35 public static $modules = ['field_ui', 'responsive_image', 'responsive_image_test_module'];
Chris@0 36
Chris@0 37 /**
Chris@0 38 * Drupal\simpletest\WebTestBase\setUp().
Chris@0 39 */
Chris@0 40 protected function setUp() {
Chris@0 41 parent::setUp();
Chris@0 42
Chris@0 43 // Create user.
Chris@0 44 $this->adminUser = $this->drupalCreateUser([
Chris@0 45 'administer responsive images',
Chris@0 46 'access content',
Chris@0 47 'access administration pages',
Chris@0 48 'administer site configuration',
Chris@0 49 'administer content types',
Chris@0 50 'administer node display',
Chris@0 51 'administer nodes',
Chris@0 52 'create article content',
Chris@0 53 'edit any article content',
Chris@0 54 'delete any article content',
Chris@0 55 'administer image styles'
Chris@0 56 ]);
Chris@0 57 $this->drupalLogin($this->adminUser);
Chris@0 58 // Add responsive image style.
Chris@0 59 $this->responsiveImgStyle = ResponsiveImageStyle::create([
Chris@0 60 'id' => 'style_one',
Chris@0 61 'label' => 'Style One',
Chris@0 62 'breakpoint_group' => 'responsive_image_test_module',
Chris@0 63 'fallback_image_style' => 'large',
Chris@0 64 ]);
Chris@0 65 }
Chris@0 66
Chris@0 67 /**
Chris@0 68 * Tests responsive image formatters on node display for public files.
Chris@0 69 */
Chris@0 70 public function testResponsiveImageFieldFormattersPublic() {
Chris@0 71 $this->addTestImageStyleMappings();
Chris@0 72 $this->doTestResponsiveImageFieldFormatters('public');
Chris@0 73 }
Chris@0 74
Chris@0 75 /**
Chris@0 76 * Tests responsive image formatters on node display for private files.
Chris@0 77 */
Chris@0 78 public function testResponsiveImageFieldFormattersPrivate() {
Chris@0 79 $this->addTestImageStyleMappings();
Chris@0 80 // Remove access content permission from anonymous users.
Chris@0 81 user_role_change_permissions(RoleInterface::ANONYMOUS_ID, ['access content' => FALSE]);
Chris@0 82 $this->doTestResponsiveImageFieldFormatters('private');
Chris@0 83 }
Chris@0 84
Chris@0 85 /**
Chris@0 86 * Test responsive image formatters when image style is empty.
Chris@0 87 */
Chris@0 88 public function testResponsiveImageFieldFormattersEmptyStyle() {
Chris@0 89 $this->addTestImageStyleMappings(TRUE);
Chris@0 90 $this->doTestResponsiveImageFieldFormatters('public', TRUE);
Chris@0 91 }
Chris@0 92
Chris@0 93 /**
Chris@0 94 * Add image style mappings to the responsive image style entity.
Chris@0 95 *
Chris@0 96 * @param bool $empty_styles
Chris@0 97 * If true, the image style mappings will get empty image styles.
Chris@0 98 */
Chris@0 99 protected function addTestImageStyleMappings($empty_styles = FALSE) {
Chris@0 100 if ($empty_styles) {
Chris@0 101 $this->responsiveImgStyle
Chris@0 102 ->addImageStyleMapping('responsive_image_test_module.mobile', '1x', [
Chris@0 103 'image_mapping_type' => 'image_style',
Chris@0 104 'image_mapping' => '',
Chris@0 105 ])
Chris@0 106 ->addImageStyleMapping('responsive_image_test_module.narrow', '1x', [
Chris@0 107 'image_mapping_type' => 'sizes',
Chris@0 108 'image_mapping' => [
Chris@0 109 'sizes' => '(min-width: 700px) 700px, 100vw',
Chris@0 110 'sizes_image_styles' => [],
Chris@0 111 ],
Chris@0 112 ])
Chris@0 113 ->addImageStyleMapping('responsive_image_test_module.wide', '1x', [
Chris@0 114 'image_mapping_type' => 'image_style',
Chris@0 115 'image_mapping' => '',
Chris@0 116 ])
Chris@0 117 ->save();
Chris@0 118 }
Chris@0 119 else {
Chris@0 120 $this->responsiveImgStyle
Chris@0 121 // Test the output of an empty image.
Chris@0 122 ->addImageStyleMapping('responsive_image_test_module.mobile', '1x', [
Chris@0 123 'image_mapping_type' => 'image_style',
Chris@0 124 'image_mapping' => RESPONSIVE_IMAGE_EMPTY_IMAGE,
Chris@0 125 ])
Chris@0 126 // Test the output with a 1.5x multiplier.
Chris@0 127 ->addImageStyleMapping('responsive_image_test_module.mobile', '1.5x', [
Chris@0 128 'image_mapping_type' => 'image_style',
Chris@0 129 'image_mapping' => 'thumbnail',
Chris@0 130 ])
Chris@0 131 // Test the output of the 'sizes' attribute.
Chris@0 132 ->addImageStyleMapping('responsive_image_test_module.narrow', '1x', [
Chris@0 133 'image_mapping_type' => 'sizes',
Chris@0 134 'image_mapping' => [
Chris@0 135 'sizes' => '(min-width: 700px) 700px, 100vw',
Chris@0 136 'sizes_image_styles' => [
Chris@0 137 'large',
Chris@0 138 'medium',
Chris@0 139 ],
Chris@0 140 ],
Chris@0 141 ])
Chris@0 142 // Test the normal output of mapping to an image style.
Chris@0 143 ->addImageStyleMapping('responsive_image_test_module.wide', '1x', [
Chris@0 144 'image_mapping_type' => 'image_style',
Chris@0 145 'image_mapping' => 'large',
Chris@0 146 ])
Chris@0 147 // Test the output of the original image.
Chris@0 148 ->addImageStyleMapping('responsive_image_test_module.wide', '3x', [
Chris@0 149 'image_mapping_type' => 'image_style',
Chris@0 150 'image_mapping' => RESPONSIVE_IMAGE_ORIGINAL_IMAGE,
Chris@0 151 ])
Chris@0 152 ->save();
Chris@0 153 }
Chris@0 154 }
Chris@0 155 /**
Chris@0 156 * Test responsive image formatters on node display.
Chris@0 157 *
Chris@0 158 * If the empty styles param is set, then the function only tests for the
Chris@0 159 * fallback image style (large).
Chris@0 160 *
Chris@0 161 * @param string $scheme
Chris@0 162 * File scheme to use.
Chris@0 163 * @param bool $empty_styles
Chris@0 164 * If true, use an empty string for image style names.
Chris@0 165 * Defaults to false.
Chris@0 166 */
Chris@0 167 protected function doTestResponsiveImageFieldFormatters($scheme, $empty_styles = FALSE) {
Chris@0 168 /** @var \Drupal\Core\Render\RendererInterface $renderer */
Chris@0 169 $renderer = $this->container->get('renderer');
Chris@0 170 $node_storage = $this->container->get('entity.manager')->getStorage('node');
Chris@0 171 $field_name = Unicode::strtolower($this->randomMachineName());
Chris@0 172 $this->createImageField($field_name, 'article', ['uri_scheme' => $scheme]);
Chris@0 173 // Create a new node with an image attached. Make sure we use a large image
Chris@0 174 // so the scale effects of the image styles always have an effect.
Chris@0 175 $test_image = current($this->drupalGetTestFiles('image', 39325));
Chris@0 176
Chris@0 177 // Create alt text for the image.
Chris@0 178 $alt = $this->randomMachineName();
Chris@0 179
Chris@0 180 $nid = $this->uploadNodeImage($test_image, $field_name, 'article', $alt);
Chris@0 181 $node_storage->resetCache([$nid]);
Chris@0 182 $node = $node_storage->load($nid);
Chris@0 183
Chris@0 184 // Test that the default formatter is being used.
Chris@0 185 $image_uri = File::load($node->{$field_name}->target_id)->getFileUri();
Chris@0 186 $image = [
Chris@0 187 '#theme' => 'image',
Chris@0 188 '#uri' => $image_uri,
Chris@0 189 '#width' => 360,
Chris@0 190 '#height' => 240,
Chris@0 191 '#alt' => $alt,
Chris@0 192 ];
Chris@0 193 $default_output = str_replace("\n", NULL, $renderer->renderRoot($image));
Chris@0 194 $this->assertRaw($default_output, 'Default formatter displaying correctly on full node view.');
Chris@0 195
Chris@0 196 // Test field not being configured. This should not cause a fatal error.
Chris@0 197 $display_options = [
Chris@0 198 'type' => 'responsive_image_test',
Chris@0 199 'settings' => ResponsiveImageFormatter::defaultSettings(),
Chris@0 200 ];
Chris@0 201 $display = $this->container->get('entity.manager')
Chris@0 202 ->getStorage('entity_view_display')
Chris@0 203 ->load('node.article.default');
Chris@0 204 if (!$display) {
Chris@0 205 $values = [
Chris@0 206 'targetEntityType' => 'node',
Chris@0 207 'bundle' => 'article',
Chris@0 208 'mode' => 'default',
Chris@0 209 'status' => TRUE,
Chris@0 210 ];
Chris@0 211 $display = $this->container->get('entity.manager')->getStorage('entity_view_display')->create($values);
Chris@0 212 }
Chris@0 213 $display->setComponent($field_name, $display_options)->save();
Chris@0 214
Chris@0 215 $this->drupalGet('node/' . $nid);
Chris@0 216
Chris@0 217 // Test theme function for responsive image, but using the test formatter.
Chris@0 218 $display_options = [
Chris@0 219 'type' => 'responsive_image_test',
Chris@0 220 'settings' => [
Chris@0 221 'image_link' => 'file',
Chris@0 222 'responsive_image_style' => 'style_one',
Chris@0 223 ],
Chris@0 224 ];
Chris@0 225 $display = entity_get_display('node', 'article', 'default');
Chris@0 226 $display->setComponent($field_name, $display_options)
Chris@0 227 ->save();
Chris@0 228
Chris@0 229 $this->drupalGet('node/' . $nid);
Chris@0 230
Chris@0 231 // Use the responsive image formatter linked to file formatter.
Chris@0 232 $display_options = [
Chris@0 233 'type' => 'responsive_image',
Chris@0 234 'settings' => [
Chris@0 235 'image_link' => 'file',
Chris@0 236 'responsive_image_style' => 'style_one',
Chris@0 237 ],
Chris@0 238 ];
Chris@0 239 $display = entity_get_display('node', 'article', 'default');
Chris@0 240 $display->setComponent($field_name, $display_options)
Chris@0 241 ->save();
Chris@0 242
Chris@0 243 $default_output = '<a href="' . file_url_transform_relative(file_create_url($image_uri)) . '"><picture';
Chris@0 244 $this->drupalGet('node/' . $nid);
Chris@0 245 $cache_tags_header = $this->drupalGetHeader('X-Drupal-Cache-Tags');
Chris@0 246 $this->assertTrue(!preg_match('/ image_style\:/', $cache_tags_header), 'No image style cache tag found.');
Chris@0 247
Chris@0 248 $this->removeWhiteSpace();
Chris@0 249 $this->assertRaw($default_output, 'Image linked to file formatter displaying correctly on full node view.');
Chris@0 250 // Verify that the image can be downloaded.
Chris@0 251 $this->assertEqual(file_get_contents($test_image->uri), $this->drupalGet(file_create_url($image_uri)), 'File was downloaded successfully.');
Chris@0 252 if ($scheme == 'private') {
Chris@0 253 // Only verify HTTP headers when using private scheme and the headers are
Chris@0 254 // sent by Drupal.
Chris@0 255 $this->assertEqual($this->drupalGetHeader('Content-Type'), 'image/png', 'Content-Type header was sent.');
Chris@0 256 $this->assertTrue(strstr($this->drupalGetHeader('Cache-Control'), 'private') !== FALSE, 'Cache-Control header was sent.');
Chris@0 257
Chris@0 258 // Log out and try to access the file.
Chris@0 259 $this->drupalLogout();
Chris@0 260 $this->drupalGet(file_create_url($image_uri));
Chris@0 261 $this->assertResponse('403', 'Access denied to original image as anonymous user.');
Chris@0 262
Chris@0 263 // Log in again.
Chris@0 264 $this->drupalLogin($this->adminUser);
Chris@0 265 }
Chris@0 266
Chris@0 267 // Use the responsive image formatter with a responsive image style.
Chris@0 268 $display_options['settings']['responsive_image_style'] = 'style_one';
Chris@0 269 $display_options['settings']['image_link'] = '';
Chris@0 270 $display->setComponent($field_name, $display_options)
Chris@0 271 ->save();
Chris@0 272
Chris@0 273 // Create a derivative so at least one MIME type will be known.
Chris@0 274 $large_style = ImageStyle::load('large');
Chris@0 275 $large_style->createDerivative($image_uri, $large_style->buildUri($image_uri));
Chris@0 276
Chris@0 277 // Output should contain all image styles and all breakpoints.
Chris@0 278 $this->drupalGet('node/' . $nid);
Chris@0 279 if (!$empty_styles) {
Chris@0 280 $this->assertRaw('/styles/medium/');
Chris@0 281 // Make sure the IE9 workaround is present.
Chris@0 282 $this->assertRaw('<!--[if IE 9]><video style="display: none;"><![endif]-->');
Chris@0 283 $this->assertRaw('<!--[if IE 9]></video><![endif]-->');
Chris@0 284 // Assert the empty image is present.
Chris@0 285 $this->assertRaw('data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==');
Chris@0 286 $thumbnail_style = ImageStyle::load('thumbnail');
Chris@0 287 // Assert the output of the 'srcset' attribute (small multipliers first).
Chris@0 288 $this->assertRaw('data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== 1x, ' . file_url_transform_relative($thumbnail_style->buildUrl($image_uri)) . ' 1.5x');
Chris@0 289 $this->assertRaw('/styles/medium/');
Chris@0 290 // Assert the output of the original image.
Chris@0 291 $this->assertRaw(file_url_transform_relative(file_create_url($image_uri)) . ' 3x');
Chris@0 292 // Assert the output of the breakpoints.
Chris@0 293 $this->assertRaw('media="(min-width: 0px)"');
Chris@0 294 $this->assertRaw('media="(min-width: 560px)"');
Chris@0 295 // Assert the output of the 'sizes' attribute.
Chris@0 296 $this->assertRaw('sizes="(min-width: 700px) 700px, 100vw"');
Chris@0 297 $this->assertPattern('/media="\(min-width: 560px\)".+?sizes="\(min-width: 700px\) 700px, 100vw"/');
Chris@0 298 // Assert the output of the 'srcset' attribute (small images first).
Chris@0 299 $medium_style = ImageStyle::load('medium');
Chris@0 300 $this->assertRaw(file_url_transform_relative($medium_style->buildUrl($image_uri)) . ' 220w, ' . file_url_transform_relative($large_style->buildUrl($image_uri)) . ' 360w');
Chris@0 301 $this->assertRaw('media="(min-width: 851px)"');
Chris@0 302 }
Chris@0 303 $this->assertRaw('/styles/large/');
Chris@0 304 $cache_tags = explode(' ', $this->drupalGetHeader('X-Drupal-Cache-Tags'));
Chris@0 305 $this->assertTrue(in_array('config:responsive_image.styles.style_one', $cache_tags));
Chris@0 306 if (!$empty_styles) {
Chris@0 307 $this->assertTrue(in_array('config:image.style.medium', $cache_tags));
Chris@0 308 $this->assertTrue(in_array('config:image.style.thumbnail', $cache_tags));
Chris@0 309 $this->assertRaw('type="image/png"');
Chris@0 310 }
Chris@0 311 $this->assertTrue(in_array('config:image.style.large', $cache_tags));
Chris@0 312
Chris@0 313 // Test the fallback image style.
Chris@0 314 $image = \Drupal::service('image.factory')->get($image_uri);
Chris@0 315 $fallback_image = [
Chris@0 316 '#theme' => 'image',
Chris@0 317 '#alt' => $alt,
Chris@0 318 '#uri' => file_url_transform_relative($large_style->buildUrl($image->getSource())),
Chris@0 319 ];
Chris@0 320 // The image.html.twig template has a newline after the <img> tag but
Chris@0 321 // responsive-image.html.twig doesn't have one after the fallback image, so
Chris@0 322 // we remove it here.
Chris@0 323 $default_output = trim($renderer->renderRoot($fallback_image));
Chris@0 324 $this->assertRaw($default_output, 'Image style large formatter displaying correctly on full node view.');
Chris@0 325
Chris@0 326 if ($scheme == 'private') {
Chris@0 327 // Log out and try to access the file.
Chris@0 328 $this->drupalLogout();
Chris@0 329 $this->drupalGet($large_style->buildUrl($image_uri));
Chris@0 330 $this->assertResponse('403', 'Access denied to image style large as anonymous user.');
Chris@0 331 $cache_tags_header = $this->drupalGetHeader('X-Drupal-Cache-Tags');
Chris@0 332 $this->assertTrue(!preg_match('/ image_style\:/', $cache_tags_header), 'No image style cache tag found.');
Chris@0 333 }
Chris@0 334 }
Chris@0 335
Chris@0 336 /**
Chris@0 337 * Tests responsive image formatters on node display linked to the file.
Chris@0 338 */
Chris@0 339 public function testResponsiveImageFieldFormattersLinkToFile() {
Chris@0 340 $this->addTestImageStyleMappings();
Chris@0 341 $this->assertResponsiveImageFieldFormattersLink('file');
Chris@0 342 }
Chris@0 343
Chris@0 344 /**
Chris@0 345 * Tests responsive image formatters on node display linked to the node.
Chris@0 346 */
Chris@0 347 public function testResponsiveImageFieldFormattersLinkToNode() {
Chris@0 348 $this->addTestImageStyleMappings();
Chris@0 349 $this->assertResponsiveImageFieldFormattersLink('content');
Chris@0 350 }
Chris@0 351
Chris@0 352 /**
Chris@0 353 * Tests responsive image formatter on node display with an empty media query.
Chris@0 354 */
Chris@0 355 public function testResponsiveImageFieldFormattersEmptyMediaQuery() {
Chris@0 356 $this->responsiveImgStyle
Chris@0 357 // Test the output of an empty media query.
Chris@0 358 ->addImageStyleMapping('responsive_image_test_module.empty', '1x', [
Chris@0 359 'image_mapping_type' => 'image_style',
Chris@0 360 'image_mapping' => RESPONSIVE_IMAGE_EMPTY_IMAGE,
Chris@0 361 ])
Chris@0 362 // Test the output with a 1.5x multiplier.
Chris@0 363 ->addImageStyleMapping('responsive_image_test_module.mobile', '1x', [
Chris@0 364 'image_mapping_type' => 'image_style',
Chris@0 365 'image_mapping' => 'thumbnail',
Chris@0 366 ])
Chris@0 367 ->save();
Chris@0 368 $node_storage = $this->container->get('entity.manager')->getStorage('node');
Chris@0 369 $field_name = Unicode::strtolower($this->randomMachineName());
Chris@0 370 $this->createImageField($field_name, 'article', ['uri_scheme' => 'public']);
Chris@0 371 // Create a new node with an image attached.
Chris@0 372 $test_image = current($this->drupalGetTestFiles('image'));
Chris@0 373 $nid = $this->uploadNodeImage($test_image, $field_name, 'article', $this->randomMachineName());
Chris@0 374 $node_storage->resetCache([$nid]);
Chris@0 375
Chris@0 376 // Use the responsive image formatter linked to file formatter.
Chris@0 377 $display_options = [
Chris@0 378 'type' => 'responsive_image',
Chris@0 379 'settings' => [
Chris@0 380 'image_link' => '',
Chris@0 381 'responsive_image_style' => 'style_one',
Chris@0 382 ],
Chris@0 383 ];
Chris@0 384 $display = entity_get_display('node', 'article', 'default');
Chris@0 385 $display->setComponent($field_name, $display_options)
Chris@0 386 ->save();
Chris@0 387
Chris@0 388 // View the node.
Chris@0 389 $this->drupalGet('node/' . $nid);
Chris@0 390
Chris@0 391 // Assert an empty media attribute is not output.
Chris@0 392 $this->assertNoPattern('@srcset="data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== 1x".+?media=".+?/><source@');
Chris@0 393
Chris@0 394 // Assert the media attribute is present if it has a value.
Chris@0 395 $thumbnail_style = ImageStyle::load('thumbnail');
Chris@0 396 $node = $node_storage->load($nid);
Chris@0 397 $image_uri = File::load($node->{$field_name}->target_id)->getFileUri();
Chris@0 398 $this->assertPattern('/srcset="' . preg_quote(file_url_transform_relative($thumbnail_style->buildUrl($image_uri)), '/') . ' 1x".+?media="\(min-width: 0px\)"/');
Chris@0 399 }
Chris@0 400
Chris@0 401 /**
Chris@0 402 * Tests responsive image formatter on node display with one source.
Chris@0 403 */
Chris@0 404 public function testResponsiveImageFieldFormattersOneSource() {
Chris@0 405 $this->responsiveImgStyle
Chris@0 406 // Test the output of an empty media query.
Chris@0 407 ->addImageStyleMapping('responsive_image_test_module.empty', '1x', [
Chris@0 408 'image_mapping_type' => 'image_style',
Chris@0 409 'image_mapping' => 'medium',
Chris@0 410 ])
Chris@0 411 ->addImageStyleMapping('responsive_image_test_module.empty', '2x', [
Chris@0 412 'image_mapping_type' => 'image_style',
Chris@0 413 'image_mapping' => 'large',
Chris@0 414 ])
Chris@0 415 ->save();
Chris@0 416 $node_storage = $this->container->get('entity.manager')->getStorage('node');
Chris@0 417 $field_name = Unicode::strtolower($this->randomMachineName());
Chris@0 418 $this->createImageField($field_name, 'article', ['uri_scheme' => 'public']);
Chris@0 419 // Create a new node with an image attached.
Chris@0 420 $test_image = current($this->drupalGetTestFiles('image'));
Chris@0 421 $nid = $this->uploadNodeImage($test_image, $field_name, 'article', $this->randomMachineName());
Chris@0 422 $node_storage->resetCache([$nid]);
Chris@0 423
Chris@0 424 // Use the responsive image formatter linked to file formatter.
Chris@0 425 $display_options = [
Chris@0 426 'type' => 'responsive_image',
Chris@0 427 'settings' => [
Chris@0 428 'image_link' => '',
Chris@0 429 'responsive_image_style' => 'style_one',
Chris@0 430 ],
Chris@0 431 ];
Chris@0 432 $display = entity_get_display('node', 'article', 'default');
Chris@0 433 $display->setComponent($field_name, $display_options)
Chris@0 434 ->save();
Chris@0 435
Chris@0 436 // View the node.
Chris@0 437 $this->drupalGet('node/' . $nid);
Chris@0 438
Chris@0 439 // Assert the media attribute is present if it has a value.
Chris@0 440 $large_style = ImageStyle::load('large');
Chris@0 441 $medium_style = ImageStyle::load('medium');
Chris@0 442 $node = $node_storage->load($nid);
Chris@0 443 $image_uri = File::load($node->{$field_name}->target_id)->getFileUri();
Chris@0 444 $this->assertRaw('<img srcset="' . file_url_transform_relative($medium_style->buildUrl($image_uri)) . ' 1x, ' . file_url_transform_relative($large_style->buildUrl($image_uri)) . ' 2x"');
Chris@0 445 }
Chris@0 446
Chris@0 447 /**
Chris@0 448 * Tests responsive image formatters linked to the file or node.
Chris@0 449 *
Chris@0 450 * @param string $link_type
Chris@0 451 * The link type to test. Either 'file' or 'content'.
Chris@0 452 */
Chris@0 453 private function assertResponsiveImageFieldFormattersLink($link_type) {
Chris@0 454 $field_name = Unicode::strtolower($this->randomMachineName());
Chris@0 455 $field_settings = ['alt_field_required' => 0];
Chris@0 456 $this->createImageField($field_name, 'article', ['uri_scheme' => 'public'], $field_settings);
Chris@0 457 // Create a new node with an image attached.
Chris@0 458 $test_image = current($this->drupalGetTestFiles('image'));
Chris@0 459
Chris@0 460 // Test the image linked to file formatter.
Chris@0 461 $display_options = [
Chris@0 462 'type' => 'responsive_image',
Chris@0 463 'settings' => [
Chris@0 464 'image_link' => $link_type,
Chris@0 465 'responsive_image_style' => 'style_one',
Chris@0 466 ],
Chris@0 467 ];
Chris@0 468 entity_get_display('node', 'article', 'default')
Chris@0 469 ->setComponent($field_name, $display_options)
Chris@0 470 ->save();
Chris@0 471 // Ensure that preview works.
Chris@0 472 $this->previewNodeImage($test_image, $field_name, 'article');
Chris@0 473
Chris@0 474 // Look for a picture tag in the preview output
Chris@0 475 $this->assertPattern('/picture/');
Chris@0 476
Chris@0 477 $nid = $this->uploadNodeImage($test_image, $field_name, 'article');
Chris@0 478 $this->container->get('entity.manager')->getStorage('node')->resetCache([$nid]);
Chris@0 479 $node = Node::load($nid);
Chris@0 480
Chris@0 481 // Use the responsive image formatter linked to file formatter.
Chris@0 482 $display_options = [
Chris@0 483 'type' => 'responsive_image',
Chris@0 484 'settings' => [
Chris@0 485 'image_link' => $link_type,
Chris@0 486 'responsive_image_style' => 'style_one',
Chris@0 487 ],
Chris@0 488 ];
Chris@0 489 entity_get_display('node', 'article', 'default')
Chris@0 490 ->setComponent($field_name, $display_options)
Chris@0 491 ->save();
Chris@0 492
Chris@0 493 // Create a derivative so at least one MIME type will be known.
Chris@0 494 $large_style = ImageStyle::load('large');
Chris@0 495 $image_uri = File::load($node->{$field_name}->target_id)->getFileUri();
Chris@0 496 $large_style->createDerivative($image_uri, $large_style->buildUri($image_uri));
Chris@0 497
Chris@0 498 // Output should contain all image styles and all breakpoints.
Chris@0 499 $this->drupalGet('node/' . $nid);
Chris@0 500 $this->removeWhiteSpace();
Chris@0 501 switch ($link_type) {
Chris@0 502 case 'file':
Chris@0 503 // Make sure the link to the file is present.
Chris@0 504 $this->assertPattern('/<a(.*?)href="' . preg_quote(file_url_transform_relative(file_create_url($image_uri)), '/') . '"(.*?)><picture/');
Chris@0 505 break;
Chris@0 506
Chris@0 507 case 'content':
Chris@0 508 // Make sure the link to the node is present.
Chris@0 509 $this->assertPattern('/<a(.*?)href="' . preg_quote($node->url(), '/') . '"(.*?)><picture/');
Chris@0 510 break;
Chris@0 511 }
Chris@0 512 }
Chris@0 513
Chris@0 514 }