View source
<?php
namespace Drupal\Tests\blazy\Kernel;
use Drupal\Core\Cache\Cache;
use Drupal\entity_test\Entity\EntityTest;
use Drupal\blazy\Blazy;
use Drupal\blazy\BlazyDefault;
class BlazyManagerTest extends BlazyKernelTestBase {
protected function setUp() {
parent::setUp();
$bundle = $this->bundle;
$settings['fields']['field_text_multiple'] = 'text';
$this
->setUpContentTypeTest($bundle, $settings);
$this
->setUpContentWithItems($bundle);
$this
->setUpRealImage();
}
public function testPreRenderImage(array $settings = [], $expected_responsive_image_style_id = '') {
$build = $this->data;
$settings['count'] = $this->maxItems;
$settings['uri'] = $this->uri;
$settings['responsive_image_style_id'] = '';
$settings['resimage'] = empty($settings['responsive_image_style']) ? FALSE : $this->blazyManager
->entityLoad($settings['responsive_image_style'], 'responsive_image_style');
$build['settings'] = array_merge($build['settings'], $settings) + BlazyDefault::itemSettings();
$switch_css = str_replace('_', '-', $settings['media_switch']);
$element = $this
->doPreRenderImage($build);
if ($settings['media_switch'] == 'content') {
$this
->assertEquals($settings['content_url'], $element['#url']);
$this
->assertArrayHasKey('#url', $element);
}
else {
$this
->assertArrayHasKey('data-' . $switch_css . '-trigger', $element['#url_attributes']);
$this
->assertArrayHasKey('#url', $element);
}
$this
->assertEquals($expected_responsive_image_style_id, $element['#settings']['responsive_image_style_id']);
}
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;
}
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);
}
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,
],
];
}
public function testBuildAttributes(array $settings, $uri, $item, $iframe, $expected) {
$variables = [
'attributes' => [],
];
$settings = array_merge($this
->getFormatterSettings(), $settings);
$settings += BlazyDefault::itemSettings();
$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);
}
public function providerBuildAttributes() {
$breakpoints = $this
->getDataBreakpoints();
$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;
}
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']);
}
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,
],
];
}
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);
}
public function providerIsCrop() {
return [
'Cropped image style' => [
'blazy_crop',
TRUE,
],
'Non-cropped image style' => [
'large',
FALSE,
],
];
}
public function testBlazyManagerMethods() {
$attach = [
'blazy' => TRUE,
'media_switch' => 'blazy_test',
];
$attachments = $this->blazyManager
->attach($attach);
$this
->assertArrayHasKey('blazy', $attachments['drupalSettings']);
$build = $this->data;
$settings =& $build['settings'];
$settings += BlazyDefault::itemSettings();
$item = $build['item'];
$settings['item'] = $item;
$settings['uri'] = $this->uri;
$settings['blazy_data'] = [];
$settings['background'] = TRUE;
$settings['breakpoints'] = $this
->getDataBreakpoints();
$this->blazyManager
->buildDataBlazy($settings, $build);
$this
->assertNotEmpty($settings['blazy']);
$lightboxes = $this->blazyManager
->getLightboxes();
$this
->assertFalse(in_array('nixbox', $lightboxes));
$skins = $this->blazyManager
->buildSkins('blazy_test', '\\Drupal\\blazy_test\\BlazySkinTest');
$cid = 'blazy_test:skins';
$cached_skins = $this->blazyManager
->getCache()
->get($cid);
$this
->assertEquals($cid, $cached_skins->cid);
$this
->assertEquals($skins, $cached_skins->data);
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);
}
}