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 }
|