bundle; $settings['fields']['field_text_multiple'] = 'text'; $this->setUpContentTypeTest($bundle, $settings); $this->setUpContentWithItems($bundle); $this->setUpRealImage(); } /** * Tests BlazyManager image. * * @param array $settings * The settings being tested. * @param string $expected_responsive_image_style_id * The responsive image style ID. * * @covers ::preRenderImage * @covers ::getResponsiveImageCacheTags * @covers \Drupal\blazy\BlazyLightbox::build * @covers \Drupal\blazy\BlazyLightbox::buildCaptions * @dataProvider providerTestPreRenderImage */ public function testPreRenderImage(array $settings = [], $expected_responsive_image_style_id = '') { $build = $this->data; $settings['count'] = $this->maxItems; $settings['uri'] = $this->uri; $build['settings'] = array_merge($build['settings'], $settings); $element = $this->doPreRenderImage($build); if ($settings['media_switch'] == 'content') { $this->assertEquals($settings['content_url'], $element['#url']); $this->assertArrayHasKey('#url', $element); } else { $this->assertArrayHasKey('data-' . $settings['media_switch'] . '-trigger', $element['#url_attributes']); $this->assertArrayHasKey('#url', $element); } $this->assertEquals($expected_responsive_image_style_id, $element['#settings']['responsive_image_style_id']); } /** * Provide test cases for ::testPreRenderImage(). * * @return array * An array of tested data. */ public function providerTestPreRenderImage() { $data[] = [ [ 'content_url' => 'node/1', 'media_switch' => 'content', ], '', ]; $data[] = [ [ 'lightbox' => TRUE, 'media_switch' => 'photobox', 'resimage' => TRUE, 'responsive_image_style' => 'blazy_responsive_test', ], 'blazy_responsive_test', ]; $data[] = [ [ 'box_style' => 'blazy_crop', 'box_media_style' => 'large', 'box_caption' => 'custom', 'box_caption_custom' => '[node:field_text_multiple]', 'embed_url' => '//www.youtube.com/watch?v=E03HFA923kw', 'lightbox' => TRUE, 'media_switch' => 'blazy_test', 'scheme' => 'youtube', 'type' => 'video', ], '', ]; return $data; } /** * Tests the entity view builder. * * @param string $entity * The tested entity. * @param string $fallback * The fallback text. * @param string $message * The message text. * @param bool $expected * The expected output. * * @covers ::getEntityView * @dataProvider providerTestGetEntityView */ public function testGetEntityView($entity, $fallback, $message, $expected) { if ($entity == 'entity') { $entity_test = EntityTest::create([ 'name' => $this->randomMachineName(), ]); $entity_test->save(); $entity = $entity_test; } elseif ($entity == 'node') { $entity = empty($this->entity) ? $this->setUpContentWithItems($this->bundle) : $this->entity; } elseif ($entity == 'responsive_image') { $entity = $this->blazyManager->entityLoad('blazy_responsive_test', 'responsive_image_style'); } elseif ($entity == 'image') { $entity = $this->testItem; } $result = $this->blazyManager->getEntityView($entity, [], $fallback); $this->assertSame($expected, !empty($result), $message); } /** * Provide test cases for ::testGetEntityView(). * * @return array * An array of tested data. */ public function providerTestGetEntityView() { return [ 'Entity test' => [ 'entity', '', 'Entity test has no entity_test_view(), yet it has view builder.', TRUE, ], 'Node' => [ 'node', '', 'Node has node_view() taking precedence over view builder.', TRUE, ], 'Responsive image' => [ 'responsive_image', 'This is some fallback text.', 'Responsive image has no view builder. Fallback to text.', TRUE, ], 'Image' => [ 'image', '', 'Image is not an instance of EntityInterface, returns false.', FALSE, ], ]; } /** * Tests building Blazy attributes. * * @param array $settings * The settings being tested. * @param bool $uri * Whether to provide image URI, or not. * @param object $item * Whether to provide image item, or not. * @param bool $iframe * Whether to expect an iframe, or not. * @param mixed|bool|int $expected * The expected output. * * @covers \Drupal\blazy\Blazy::buildAttributes * @covers \Drupal\blazy\Blazy::buildBreakpointAttributes * @covers \Drupal\blazy\Blazy::buildUrl * @covers \Drupal\blazy\Dejavu\BlazyDefault::entitySettings * @dataProvider providerBuildAttributes */ public function testBuildAttributes(array $settings, $uri, $item, $iframe, $expected) { $content = []; $variables = ['attributes' => []]; $settings = array_merge($this->getFormatterSettings(), $settings); $settings['blazy'] = TRUE; $settings['lazy'] = 'blazy'; $settings['image_style'] = 'blazy_crop'; $settings['thumbnail_style'] = 'thumbnail'; $settings['uri'] = $uri ? $this->uri : ''; if (!empty($settings['embed_url'])) { $settings = array_merge(BlazyDefault::entitySettings(), $settings); } $variables['element']['#item'] = $item ? $this->testItem : NULL; $variables['element']['#settings'] = $settings; Blazy::buildAttributes($variables); $image = $expected == TRUE ? !empty($variables['image']) : empty($variables['image']); $iframe = $iframe == TRUE ? !empty($variables['iframe_attributes']) : empty($variables['iframe_attributes']); $this->assertTrue($image); $this->assertTrue($iframe); } /** * Provider for ::testBuildAttributes. */ public function providerBuildAttributes() { $breakpoints = $this->getDataBreakpoints(); $breakpoints_cleaned = $this->getDataBreakpoints(TRUE); $data[] = [ [ 'background' => FALSE, 'breakpoints' => [], ], FALSE, NULL, FALSE, FALSE, ]; $data[] = [ [ 'background' => FALSE, 'breakpoints' => [], ], FALSE, TRUE, FALSE, TRUE, ]; $data[] = [ [ 'background' => TRUE, 'breakpoints' => $breakpoints, 'ratio' => 'fluid', 'sizes' => '100w', 'width' => 640, 'height' => 360, ], TRUE, TRUE, FALSE, FALSE, ]; return $data; } /** * Tests responsive image integration. * * @param string $responsive_image_style_id * The responsive_image_style_id. * @param bool $old * Whether to use Drupal core 8.x-2, or later 8.x-3. * @param bool $expected * The expected output_image_tag. * * @dataProvider providerResponsiveImage */ public function testPreprocessResponsiveImage($responsive_image_style_id, $old, $expected) { $variables = [ 'item' => $this->testItem, 'uri' => $this->uri, 'responsive_image_style_id' => $responsive_image_style_id, ]; template_preprocess_responsive_image($variables); if ($old) { $variables['img_element']['#srcset'][0]['uri'] = $this->uri; } else { $variables['img_element']['#uri'] = $this->uri; } Blazy::preprocessResponsiveImage($variables); $this->assertEquals($expected, $variables['output_image_tag']); } /** * Provider for ::testPreprocessResponsiveImage. */ public function providerResponsiveImage() { return [ 'Responsive image with picture 8.x-2' => [ 'blazy_picture_test', TRUE, FALSE, ], 'Responsive image with picture 8.x-3' => [ 'blazy_picture_test', FALSE, FALSE, ], 'Responsive image without picture 8.x-3' => [ 'blazy_responsive_test', FALSE, TRUE, ], ]; } /** * Tests isCrop. * * @covers ::isCrop * @dataProvider providerIsCrop */ public function testIsCrop($image_style_id, $expected) { $image_style = $this->blazyManager->entityLoad($image_style_id, 'image_style'); $is_cropped = $this->blazyManager->isCrop($image_style); $this->assertEquals($expected, $is_cropped); } /** * Provider for ::testIsCrop. */ public function providerIsCrop() { return [ 'Cropped image style' => [ 'blazy_crop', TRUE, ], 'Non-cropped image style' => [ 'large', FALSE, ], ]; } /** * Tests cases for various methods. * * @covers ::attach * @covers ::buildDataBlazy * @covers ::getLightboxes * @covers ::setLightboxes * @covers ::buildSkins * @covers ::getCache * * @todo: Move some to unit tests. */ public function testBlazyManagerMethods() { // Tests Blazy attachments. $attach = ['blazy' => TRUE, 'media_switch' => 'blazy_test']; $attachments = $this->blazyManager->attach($attach); $this->assertArrayHasKey('blazy', $attachments['drupalSettings']); // Tests Blazy [data-blazy] attributes. $build = $this->data; $settings = &$build['settings']; $item = $build['item']; $settings['item'] = $item; $settings['uri'] = $this->uri; $settings['blazy_data'] = []; $settings['background'] = TRUE; $settings['breakpoints'] = $this->getDataBreakpoints(); // Ensure Blazy can be activated by breakpoints. $this->blazyManager->buildDataBlazy($settings, $build); $this->assertNotEmpty($settings['blazy']); // Tests Blazy lightboxes. $this->blazyManager->setLightboxes('blazy_test'); $lightboxes = $this->blazyManager->getLightboxes(); $this->assertFalse(in_array('nixbox', $lightboxes)); $this->assertTrue(in_array('blazy_test', $lightboxes)); // Tests for skins. // Tests skins with a single expected method BlazySkinTest::skins(). $skins = $this->blazyManager->buildSkins('blazy_test', '\Drupal\blazy_test\BlazySkinTest'); // Verify we have cached skins. $cid = 'blazy_test:skins'; $cached_skins = $this->blazyManager->getCache()->get($cid); $this->assertEquals($cid, $cached_skins->cid); $this->assertEquals($skins, $cached_skins->data); // Verify multiple skin methods are respected. Cache::invalidateTags([$cid]); drupal_flush_all_caches(); $this->assertFalse($this->blazyManager->getCache()->get($cid)); $skins = $this->blazyManager->buildSkins('blazy_test', '\Drupal\blazy_test\BlazySkinTest', ['skins', 'features']); $this->assertArrayHasKey('features', $skins); $cached_skins = $this->blazyManager->getCache()->get($cid); $this->assertEquals($skins, $cached_skins->data); } }