X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fblock%2Ftests%2Fsrc%2FUnit%2FPlugin%2FDisplayVariant%2FBlockPageVariantTest.php;fp=web%2Fcore%2Fmodules%2Fblock%2Ftests%2Fsrc%2FUnit%2FPlugin%2FDisplayVariant%2FBlockPageVariantTest.php;h=15694113534b8bcff0fd3c4c961740bf29b4b30e;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/core/modules/block/tests/src/Unit/Plugin/DisplayVariant/BlockPageVariantTest.php b/web/core/modules/block/tests/src/Unit/Plugin/DisplayVariant/BlockPageVariantTest.php new file mode 100644 index 000000000..156941135 --- /dev/null +++ b/web/core/modules/block/tests/src/Unit/Plugin/DisplayVariant/BlockPageVariantTest.php @@ -0,0 +1,264 @@ +getMockBuilder('Drupal\Core\Cache\CacheContextsManager') + ->disableOriginalConstructor() + ->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->getMock('Drupal\block\BlockRepositoryInterface'); + $this->blockViewBuilder = $this->getMock('Drupal\Core\Entity\EntityViewBuilderInterface'); + + return $this->getMockBuilder('Drupal\block\Plugin\DisplayVariant\BlockPageVariant') + ->setConstructorArgs([$configuration, 'test', $definition, $this->blockRepository, $this->blockViewBuilder, ['config:block_list']]) + ->setMethods(['getRegionNames']) + ->getMock(); + } + + public function providerBuild() { + $blocks_config = [ + 'block1' => [ + // region, is main content block, is messages block, is title block + 'top', FALSE, FALSE, FALSE, + ], + // Test multiple blocks in the same region. + 'block2' => [ + 'bottom', FALSE, FALSE, FALSE, + ], + 'block3' => [ + 'bottom', FALSE, FALSE, FALSE, + ], + // Test a block implementing MainContentBlockPluginInterface. + 'block4' => [ + 'center', TRUE, FALSE, FALSE, + ], + // Test a block implementing MessagesBlockPluginInterface. + 'block5' => [ + 'center', FALSE, TRUE, FALSE, + ], + // Test a block implementing TitleBlockPluginInterface. + '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, + ], + // The main content was rendered via a block. + '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, + ], + // The messages are rendered via the fallback in case there is no block + // rendering the main content. + 'content' => [ + 'messages' => [ + '#weight' => -1000, + '#type' => 'status_messages', + ], + ], + ], + ]; + 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, + ], + // The main content & messages are rendered via the fallback in case + // there are no blocks rendering them. + 'content' => [ + 'system_main' => ['#markup' => 'Hello kittens!'], + 'messages' => [ + '#weight' => -1000, + '#type' => 'status_messages', + ], + ], + ], + ]; + return $test_cases; + } + + /** + * Tests the building of a full page variant. + * + * @covers ::build + * + * @dataProvider providerBuild + */ + 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->getMock('Drupal\Core\Block\BlockPluginInterface'); + $main_content_block_plugin = $this->getMock('Drupal\Core\Block\MainContentBlockPluginInterface'); + $messages_block_plugin = $this->getMock('Drupal\Core\Block\MessagesBlockPluginInterface'); + $title_block_plugin = $this->getMock('Drupal\Core\Block\TitleBlockPluginInterface'); + foreach ($blocks_config as $block_id => $block_config) { + $block = $this->getMock('Drupal\block\BlockInterface'); + $block->expects($this->any()) + ->method('getContexts') + ->willReturn([]); + $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); + } + + /** + * Tests the building of a full page variant with no main content set. + * + * @covers ::build + */ + 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', + ], + ], + ]; + $this->assertSame($expected, $display_variant->build()); + } + +}