View source
<?php
namespace Drupal\Tests\block\Unit\Plugin\DisplayVariant;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\DependencyInjection\Container;
use Drupal\Tests\UnitTestCase;
class BlockPageVariantTest extends UnitTestCase {
protected $blockRepository;
protected $blockViewBuilder;
protected $contextHandler;
public function setUpDisplayVariant($configuration = [], $definition = []) {
$container = new Container();
$cache_context_manager = $this
->getMockBuilder('Drupal\\Core\\Cache\\Context\\CacheContextsManager')
->disableOriginalConstructor()
->onlyMethods([
'assertValidTokens',
])
->getMock();
$container
->set('cache_contexts_manager', $cache_context_manager);
$cache_context_manager
->expects($this
->any())
->method('assertValidTokens')
->willReturn(TRUE);
\Drupal::setContainer($container);
$this->blockRepository = $this
->createMock('Drupal\\block\\BlockRepositoryInterface');
$this->blockViewBuilder = $this
->createMock('Drupal\\Core\\Entity\\EntityViewBuilderInterface');
return $this
->getMockBuilder('Drupal\\block\\Plugin\\DisplayVariant\\BlockPageVariant')
->setConstructorArgs([
$configuration,
'test',
$definition,
$this->blockRepository,
$this->blockViewBuilder,
[
'config:block_list',
],
])
->addMethods([
'getRegionNames',
])
->getMock();
}
public function providerBuild() {
$blocks_config = [
'block1' => [
'top',
FALSE,
FALSE,
FALSE,
],
'block2' => [
'bottom',
FALSE,
FALSE,
FALSE,
],
'block3' => [
'bottom',
FALSE,
FALSE,
FALSE,
],
'block4' => [
'center',
TRUE,
FALSE,
FALSE,
],
'block5' => [
'center',
FALSE,
TRUE,
FALSE,
],
'block6' => [
'center',
FALSE,
FALSE,
TRUE,
],
];
$test_cases = [];
$test_cases[] = [
$blocks_config,
6,
[
'#cache' => [
'tags' => [
'config:block_list',
'route',
],
'contexts' => [],
'max-age' => -1,
],
'top' => [
'block1' => [],
'#sorted' => TRUE,
],
'center' => [
'block4' => [],
'block5' => [],
'block6' => [],
'#sorted' => TRUE,
],
'bottom' => [
'block2' => [],
'block3' => [],
'#sorted' => TRUE,
],
],
];
unset($blocks_config['block5']);
$test_cases[] = [
$blocks_config,
5,
[
'#cache' => [
'tags' => [
'config:block_list',
'route',
],
'contexts' => [],
'max-age' => -1,
],
'top' => [
'block1' => [],
'#sorted' => TRUE,
],
'center' => [
'block4' => [],
'block6' => [],
'#sorted' => TRUE,
],
'bottom' => [
'block2' => [],
'block3' => [],
'#sorted' => TRUE,
],
'content' => [
'messages' => [
'#weight' => -1000,
'#type' => 'status_messages',
'#include_fallback' => TRUE,
],
],
],
];
unset($blocks_config['block4']);
unset($blocks_config['block6']);
$test_cases[] = [
$blocks_config,
3,
[
'#cache' => [
'tags' => [
'config:block_list',
'route',
],
'contexts' => [],
'max-age' => -1,
],
'top' => [
'block1' => [],
'#sorted' => TRUE,
],
'bottom' => [
'block2' => [],
'block3' => [],
'#sorted' => TRUE,
],
'content' => [
'system_main' => [
'#markup' => 'Hello kittens!',
],
'messages' => [
'#weight' => -1000,
'#type' => 'status_messages',
'#include_fallback' => TRUE,
],
],
],
];
return $test_cases;
}
public function testBuild(array $blocks_config, $visible_block_count, array $expected_render_array) {
$display_variant = $this
->setUpDisplayVariant();
$display_variant
->setMainContent([
'#markup' => 'Hello kittens!',
]);
$blocks = [
'top' => [],
'center' => [],
'bottom' => [],
];
$block_plugin = $this
->createMock('Drupal\\Core\\Block\\BlockPluginInterface');
$main_content_block_plugin = $this
->createMock('Drupal\\Core\\Block\\MainContentBlockPluginInterface');
$messages_block_plugin = $this
->createMock('Drupal\\Core\\Block\\MessagesBlockPluginInterface');
$title_block_plugin = $this
->createMock('Drupal\\Core\\Block\\TitleBlockPluginInterface');
foreach ($blocks_config as $block_id => $block_config) {
$block = $this
->createMock('Drupal\\block\\BlockInterface');
$block
->expects($this
->atLeastOnce())
->method('getPlugin')
->willReturn($block_config[1] ? $main_content_block_plugin : ($block_config[2] ? $messages_block_plugin : ($block_config[3] ? $title_block_plugin : $block_plugin)));
$blocks[$block_config[0]][$block_id] = $block;
}
$this->blockViewBuilder
->expects($this
->exactly($visible_block_count))
->method('view')
->will($this
->returnValue([]));
$this->blockRepository
->expects($this
->once())
->method('getVisibleBlocksPerRegion')
->willReturnCallback(function (&$cacheable_metadata) use ($blocks) {
$cacheable_metadata['top'] = (new CacheableMetadata())
->addCacheTags([
'route',
]);
return $blocks;
});
$value = $display_variant
->build();
$this
->assertSame($expected_render_array, $value);
}
public function testBuildWithoutMainContent() {
$display_variant = $this
->setUpDisplayVariant();
$this->blockRepository
->expects($this
->once())
->method('getVisibleBlocksPerRegion')
->willReturn([]);
$expected = [
'#cache' => [
'tags' => [
'config:block_list',
],
'contexts' => [],
'max-age' => -1,
],
'content' => [
'system_main' => [],
'messages' => [
'#weight' => -1000,
'#type' => 'status_messages',
'#include_fallback' => TRUE,
],
],
];
$this
->assertSame($expected, $display_variant
->build());
}
}