Yaffs site version 1.1
[yaffs-website] / web / modules / contrib / blazy / tests / src / Kernel / BlazyManagerTest.php
diff --git a/web/modules/contrib/blazy/tests/src/Kernel/BlazyManagerTest.php b/web/modules/contrib/blazy/tests/src/Kernel/BlazyManagerTest.php
new file mode 100644 (file)
index 0000000..5fbd760
--- /dev/null
@@ -0,0 +1,424 @@
+<?php
+
+namespace Drupal\Tests\blazy\Kernel;
+
+use Drupal\Core\Cache\Cache;
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\blazy\Blazy;
+use Drupal\blazy\Dejavu\BlazyDefault;
+
+/**
+ * Tests the Blazy manager methods.
+ *
+ * @coversDefaultClass \Drupal\blazy\BlazyManager
+ *
+ * @group blazy
+ */
+class BlazyManagerTest extends BlazyKernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $bundle = $this->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);
+  }
+
+}