View source
<?php
namespace Drupal\responsive_image\Tests;
use Drupal\Component\Utility\Unicode;
use Drupal\image\Tests\ImageFieldTestBase;
use Drupal\image\Entity\ImageStyle;
use Drupal\node\Entity\Node;
use Drupal\file\Entity\File;
use Drupal\responsive_image\Plugin\Field\FieldFormatter\ResponsiveImageFormatter;
use Drupal\user\RoleInterface;
class ResponsiveImageFieldDisplayTest extends ImageFieldTestBase {
protected $dumpHeaders = TRUE;
protected $responsiveImgStyle;
public static $modules = array(
'field_ui',
'responsive_image',
'responsive_image_test_module',
);
protected function setUp() {
parent::setUp();
$this->adminUser = $this
->drupalCreateUser(array(
'administer responsive images',
'access content',
'access administration pages',
'administer site configuration',
'administer content types',
'administer node display',
'administer nodes',
'create article content',
'edit any article content',
'delete any article content',
'administer image styles',
));
$this
->drupalLogin($this->adminUser);
$this->responsiveImgStyle = entity_create('responsive_image_style', array(
'id' => 'style_one',
'label' => 'Style One',
'breakpoint_group' => 'responsive_image_test_module',
'fallback_image_style' => 'large',
));
}
public function testResponsiveImageFieldFormattersPublic() {
$this
->addTestImageStyleMappings();
$this
->doTestResponsiveImageFieldFormatters('public');
}
public function testResponsiveImageFieldFormattersPrivate() {
$this
->addTestImageStyleMappings();
user_role_change_permissions(RoleInterface::ANONYMOUS_ID, array(
'access content' => FALSE,
));
$this
->doTestResponsiveImageFieldFormatters('private');
}
public function testResponsiveImageFieldFormattersEmptyStyle() {
$this
->addTestImageStyleMappings(TRUE);
$this
->doTestResponsiveImageFieldFormatters('public', TRUE);
}
protected function addTestImageStyleMappings($empty_styles = FALSE) {
if ($empty_styles) {
$this->responsiveImgStyle
->addImageStyleMapping('responsive_image_test_module.mobile', '1x', array(
'image_mapping_type' => 'image_style',
'image_mapping' => '',
))
->addImageStyleMapping('responsive_image_test_module.narrow', '1x', array(
'image_mapping_type' => 'sizes',
'image_mapping' => array(
'sizes' => '(min-width: 700px) 700px, 100vw',
'sizes_image_styles' => array(),
),
))
->addImageStyleMapping('responsive_image_test_module.wide', '1x', array(
'image_mapping_type' => 'image_style',
'image_mapping' => '',
))
->save();
}
else {
$this->responsiveImgStyle
->addImageStyleMapping('responsive_image_test_module.mobile', '1x', array(
'image_mapping_type' => 'image_style',
'image_mapping' => RESPONSIVE_IMAGE_EMPTY_IMAGE,
))
->addImageStyleMapping('responsive_image_test_module.mobile', '1.5x', array(
'image_mapping_type' => 'image_style',
'image_mapping' => 'thumbnail',
))
->addImageStyleMapping('responsive_image_test_module.narrow', '1x', array(
'image_mapping_type' => 'sizes',
'image_mapping' => array(
'sizes' => '(min-width: 700px) 700px, 100vw',
'sizes_image_styles' => array(
'large',
'medium',
),
),
))
->addImageStyleMapping('responsive_image_test_module.wide', '1x', array(
'image_mapping_type' => 'image_style',
'image_mapping' => 'large',
))
->addImageStyleMapping('responsive_image_test_module.wide', '3x', array(
'image_mapping_type' => 'image_style',
'image_mapping' => RESPONSIVE_IMAGE_ORIGINAL_IMAGE,
))
->save();
}
}
protected function doTestResponsiveImageFieldFormatters($scheme, $empty_styles = FALSE) {
$renderer = $this->container
->get('renderer');
$node_storage = $this->container
->get('entity.manager')
->getStorage('node');
$field_name = Unicode::strtolower($this
->randomMachineName());
$this
->createImageField($field_name, 'article', array(
'uri_scheme' => $scheme,
));
$test_image = current($this
->drupalGetTestFiles('image', 39325));
$alt = $this
->randomMachineName();
$nid = $this
->uploadNodeImage($test_image, $field_name, 'article', $alt);
$node_storage
->resetCache(array(
$nid,
));
$node = $node_storage
->load($nid);
$image_uri = File::load($node->{$field_name}->target_id)
->getFileUri();
$image = array(
'#theme' => 'image',
'#uri' => $image_uri,
'#width' => 360,
'#height' => 240,
'#alt' => $alt,
);
$default_output = str_replace("\n", NULL, $renderer
->renderRoot($image));
$this
->assertRaw($default_output, 'Default formatter displaying correctly on full node view.');
$display_options = array(
'type' => 'responsive_image_test',
'settings' => ResponsiveImageFormatter::defaultSettings(),
);
$display = $this->container
->get('entity.manager')
->getStorage('entity_view_display')
->load('node.article.default');
if (!$display) {
$values = [
'targetEntityType' => 'node',
'bundle' => 'article',
'mode' => 'default',
'status' => TRUE,
];
$display = $this->container
->get('entity.manager')
->getStorage('entity_view_display')
->create($values);
}
$display
->setComponent($field_name, $display_options)
->save();
$this
->drupalGet('node/' . $nid);
$display_options = array(
'type' => 'responsive_image_test',
'settings' => array(
'image_link' => 'file',
'responsive_image_style' => 'style_one',
),
);
$display = entity_get_display('node', 'article', 'default');
$display
->setComponent($field_name, $display_options)
->save();
$this
->drupalGet('node/' . $nid);
$display_options = array(
'type' => 'responsive_image',
'settings' => array(
'image_link' => 'file',
'responsive_image_style' => 'style_one',
),
);
$display = entity_get_display('node', 'article', 'default');
$display
->setComponent($field_name, $display_options)
->save();
$default_output = '<a href="' . file_create_url($image_uri) . '"><picture';
$this
->drupalGet('node/' . $nid);
$cache_tags_header = $this
->drupalGetHeader('X-Drupal-Cache-Tags');
$this
->assertTrue(!preg_match('/ image_style\\:/', $cache_tags_header), 'No image style cache tag found.');
$this
->removeWhiteSpace();
$this
->assertRaw($default_output, 'Image linked to file formatter displaying correctly on full node view.');
$this
->assertEqual(file_get_contents($test_image->uri), $this
->drupalGet(file_create_url($image_uri)), 'File was downloaded successfully.');
if ($scheme == 'private') {
$this
->assertEqual($this
->drupalGetHeader('Content-Type'), 'image/png', 'Content-Type header was sent.');
$this
->assertTrue(strstr($this
->drupalGetHeader('Cache-Control'), 'private') !== FALSE, 'Cache-Control header was sent.');
$this
->drupalLogout();
$this
->drupalGet(file_create_url($image_uri));
$this
->assertResponse('403', 'Access denied to original image as anonymous user.');
$this
->drupalLogin($this->adminUser);
}
$display_options['settings']['responsive_image_style'] = 'style_one';
$display_options['settings']['image_link'] = '';
$display
->setComponent($field_name, $display_options)
->save();
$large_style = ImageStyle::load('large');
$large_style
->createDerivative($image_uri, $large_style
->buildUri($image_uri));
$this
->drupalGet('node/' . $nid);
if (!$empty_styles) {
$this
->assertRaw('/styles/medium/');
$this
->assertRaw('<!--[if IE 9]><video style="display: none;"><![endif]-->');
$this
->assertRaw('<!--[if IE 9]></video><![endif]-->');
$this
->assertRaw('data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==');
$thumbnail_style = ImageStyle::load('thumbnail');
$this
->assertRaw('data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== 1x, ' . $thumbnail_style
->buildUrl($image_uri) . ' 1.5x');
$this
->assertRaw('/styles/medium/');
$this
->assertRaw(file_create_url($image_uri) . ' 3x');
$this
->assertRaw('media="(min-width: 0px)"');
$this
->assertRaw('media="(min-width: 560px)"');
$this
->assertRaw('sizes="(min-width: 700px) 700px, 100vw"');
$this
->assertPattern('/media="\\(min-width: 560px\\)".+?sizes="\\(min-width: 700px\\) 700px, 100vw"/');
$medium_style = ImageStyle::load('medium');
$this
->assertRaw($medium_style
->buildUrl($image_uri) . ' 220w, ' . $large_style
->buildUrl($image_uri) . ' 360w');
$this
->assertRaw('media="(min-width: 851px)"');
}
$this
->assertRaw('/styles/large/');
$cache_tags = explode(' ', $this
->drupalGetHeader('X-Drupal-Cache-Tags'));
$this
->assertTrue(in_array('config:responsive_image.styles.style_one', $cache_tags));
if (!$empty_styles) {
$this
->assertTrue(in_array('config:image.style.medium', $cache_tags));
$this
->assertTrue(in_array('config:image.style.thumbnail', $cache_tags));
$this
->assertRaw('type="image/png"');
}
$this
->assertTrue(in_array('config:image.style.large', $cache_tags));
$image = \Drupal::service('image.factory')
->get($image_uri);
$fallback_image = array(
'#theme' => 'image',
'#alt' => $alt,
'#srcset' => array(
array(
'uri' => $large_style
->buildUrl($image
->getSource()),
),
),
);
$default_output = trim($renderer
->renderRoot($fallback_image));
$this
->assertRaw($default_output, 'Image style large formatter displaying correctly on full node view.');
if ($scheme == 'private') {
$this
->drupalLogout();
$this
->drupalGet($large_style
->buildUrl($image_uri));
$this
->assertResponse('403', 'Access denied to image style large as anonymous user.');
$cache_tags_header = $this
->drupalGetHeader('X-Drupal-Cache-Tags');
$this
->assertTrue(!preg_match('/ image_style\\:/', $cache_tags_header), 'No image style cache tag found.');
}
}
public function testResponsiveImageFieldFormattersLinkToFile() {
$this
->addTestImageStyleMappings();
$this
->assertResponsiveImageFieldFormattersLink('file');
}
public function testResponsiveImageFieldFormattersLinkToNode() {
$this
->addTestImageStyleMappings();
$this
->assertResponsiveImageFieldFormattersLink('content');
}
public function testResponsiveImageFieldFormattersEmptyMediaQuery() {
$this->responsiveImgStyle
->addImageStyleMapping('responsive_image_test_module.empty', '1x', array(
'image_mapping_type' => 'image_style',
'image_mapping' => RESPONSIVE_IMAGE_EMPTY_IMAGE,
))
->addImageStyleMapping('responsive_image_test_module.mobile', '1x', array(
'image_mapping_type' => 'image_style',
'image_mapping' => 'thumbnail',
))
->save();
$node_storage = $this->container
->get('entity.manager')
->getStorage('node');
$field_name = Unicode::strtolower($this
->randomMachineName());
$this
->createImageField($field_name, 'article', array(
'uri_scheme' => 'public',
));
$test_image = current($this
->drupalGetTestFiles('image'));
$nid = $this
->uploadNodeImage($test_image, $field_name, 'article', $this
->randomMachineName());
$node_storage
->resetCache(array(
$nid,
));
$display_options = array(
'type' => 'responsive_image',
'settings' => array(
'image_link' => '',
'responsive_image_style' => 'style_one',
),
);
$display = entity_get_display('node', 'article', 'default');
$display
->setComponent($field_name, $display_options)
->save();
$this
->drupalGet('node/' . $nid);
$this
->assertNoPattern('@srcset="data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== 1x".+?media=".+?/><source@');
$thumbnail_style = ImageStyle::load('thumbnail');
$node = $node_storage
->load($nid);
$image_uri = File::load($node->{$field_name}->target_id)
->getFileUri();
$this
->assertPattern('/srcset="' . preg_quote($thumbnail_style
->buildUrl($image_uri), '/') . ' 1x".+?media="\\(min-width: 0px\\)"/');
}
public function testResponsiveImageFieldFormattersOneSource() {
$this->responsiveImgStyle
->addImageStyleMapping('responsive_image_test_module.empty', '1x', array(
'image_mapping_type' => 'image_style',
'image_mapping' => 'medium',
))
->addImageStyleMapping('responsive_image_test_module.empty', '2x', array(
'image_mapping_type' => 'image_style',
'image_mapping' => 'large',
))
->save();
$node_storage = $this->container
->get('entity.manager')
->getStorage('node');
$field_name = Unicode::strtolower($this
->randomMachineName());
$this
->createImageField($field_name, 'article', array(
'uri_scheme' => 'public',
));
$test_image = current($this
->drupalGetTestFiles('image'));
$nid = $this
->uploadNodeImage($test_image, $field_name, 'article', $this
->randomMachineName());
$node_storage
->resetCache(array(
$nid,
));
$display_options = array(
'type' => 'responsive_image',
'settings' => array(
'image_link' => '',
'responsive_image_style' => 'style_one',
),
);
$display = entity_get_display('node', 'article', 'default');
$display
->setComponent($field_name, $display_options)
->save();
$this
->drupalGet('node/' . $nid);
$large_style = ImageStyle::load('large');
$medium_style = ImageStyle::load('medium');
$node = $node_storage
->load($nid);
$image_uri = File::load($node->{$field_name}->target_id)
->getFileUri();
$this
->assertRaw('<img srcset="' . $medium_style
->buildUrl($image_uri) . ' 1x, ' . $large_style
->buildUrl($image_uri) . ' 2x"');
}
private function assertResponsiveImageFieldFormattersLink($link_type) {
$field_name = Unicode::strtolower($this
->randomMachineName());
$field_settings = array(
'alt_field_required' => 0,
);
$this
->createImageField($field_name, 'article', array(
'uri_scheme' => 'public',
), $field_settings);
$test_image = current($this
->drupalGetTestFiles('image'));
$display_options = array(
'type' => 'responsive_image',
'settings' => array(
'image_link' => $link_type,
'responsive_image_style' => 'style_one',
),
);
entity_get_display('node', 'article', 'default')
->setComponent($field_name, $display_options)
->save();
$this
->previewNodeImage($test_image, $field_name, 'article');
$this
->assertPattern('/picture/');
$nid = $this
->uploadNodeImage($test_image, $field_name, 'article');
$this->container
->get('entity.manager')
->getStorage('node')
->resetCache(array(
$nid,
));
$node = Node::load($nid);
$display_options = array(
'type' => 'responsive_image',
'settings' => array(
'image_link' => $link_type,
'responsive_image_style' => 'style_one',
),
);
entity_get_display('node', 'article', 'default')
->setComponent($field_name, $display_options)
->save();
$large_style = ImageStyle::load('large');
$image_uri = File::load($node->{$field_name}->target_id)
->getFileUri();
$large_style
->createDerivative($image_uri, $large_style
->buildUri($image_uri));
$this
->drupalGet('node/' . $nid);
$this
->removeWhiteSpace();
switch ($link_type) {
case 'file':
$this
->assertPattern('/<a(.*?)href="' . preg_quote(file_create_url($image_uri), '/') . '"(.*?)><picture/');
break;
case 'content':
$this
->assertPattern('/<a(.*?)href="' . preg_quote($node
->url(), '/') . '"(.*?)><picture/');
break;
}
}
}