X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Flayout_builder%2Ftests%2Fsrc%2FUnit%2FSectionRenderTest.php;fp=web%2Fcore%2Fmodules%2Flayout_builder%2Ftests%2Fsrc%2FUnit%2FSectionRenderTest.php;h=079a220a450e78ee968406e0f800ee6811dd4d17;hp=0000000000000000000000000000000000000000;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/web/core/modules/layout_builder/tests/src/Unit/SectionRenderTest.php b/web/core/modules/layout_builder/tests/src/Unit/SectionRenderTest.php new file mode 100644 index 000000000..079a220a4 --- /dev/null +++ b/web/core/modules/layout_builder/tests/src/Unit/SectionRenderTest.php @@ -0,0 +1,284 @@ +prophesize(LayoutPluginManagerInterface::class); + $this->blockManager = $this->prophesize(BlockManagerInterface::class); + $this->contextHandler = $this->prophesize(ContextHandlerInterface::class); + $this->contextRepository = $this->prophesize(ContextRepositoryInterface::class); + // @todo Refactor this into some better tests in https://www.drupal.org/node/2942605. + $this->eventDispatcher = (new \ReflectionClass(ContainerAwareEventDispatcher::class))->newInstanceWithoutConstructor(); + + $this->account = $this->prophesize(AccountInterface::class); + $subscriber = new BlockComponentRenderArray($this->account->reveal()); + $this->eventDispatcher->addSubscriber($subscriber); + + $layout = $this->prophesize(LayoutInterface::class); + $layout->getPluginDefinition()->willReturn(new LayoutDefinition([])); + $layout->build(Argument::type('array'))->willReturnArgument(0); + $layout_plugin_manager->createInstance('layout_onecol', [])->willReturn($layout->reveal()); + + $container = new ContainerBuilder(); + $container->set('current_user', $this->account->reveal()); + $container->set('plugin.manager.block', $this->blockManager->reveal()); + $container->set('plugin.manager.core.layout', $layout_plugin_manager->reveal()); + $container->set('context.handler', $this->contextHandler->reveal()); + $container->set('context.repository', $this->contextRepository->reveal()); + $container->set('event_dispatcher', $this->eventDispatcher); + \Drupal::setContainer($container); + } + + /** + * @covers ::toRenderArray + */ + public function testToRenderArray() { + $block_content = ['#markup' => 'The block content.']; + $render_array = [ + '#theme' => 'block', + '#weight' => 0, + '#configuration' => [], + '#plugin_id' => 'block_plugin_id', + '#base_plugin_id' => 'block_plugin_id', + '#derivative_plugin_id' => NULL, + 'content' => $block_content, + '#cache' => [ + 'contexts' => [], + 'tags' => [], + 'max-age' => -1, + ], + ]; + + $block = $this->prophesize(BlockPluginInterface::class); + $this->blockManager->createInstance('block_plugin_id', ['id' => 'block_plugin_id'])->willReturn($block->reveal()); + + $access_result = AccessResult::allowed(); + $block->access($this->account->reveal(), TRUE)->willReturn($access_result); + $block->build()->willReturn($block_content); + $block->getCacheContexts()->willReturn([]); + $block->getCacheTags()->willReturn([]); + $block->getCacheMaxAge()->willReturn(Cache::PERMANENT); + $block->getPluginId()->willReturn('block_plugin_id'); + $block->getBaseId()->willReturn('block_plugin_id'); + $block->getDerivativeId()->willReturn(NULL); + $block->getConfiguration()->willReturn([]); + + $section = [ + new SectionComponent('some_uuid', 'content', ['id' => 'block_plugin_id']), + ]; + $expected = [ + 'content' => [ + 'some_uuid' => $render_array, + ], + ]; + $result = (new Section('layout_onecol', [], $section))->toRenderArray(); + $this->assertEquals($expected, $result); + } + + /** + * @covers ::toRenderArray + */ + public function testToRenderArrayAccessDenied() { + $block = $this->prophesize(BlockPluginInterface::class); + $this->blockManager->createInstance('block_plugin_id', ['id' => 'block_plugin_id'])->willReturn($block->reveal()); + + $access_result = AccessResult::forbidden(); + $block->access($this->account->reveal(), TRUE)->willReturn($access_result); + $block->build()->shouldNotBeCalled(); + $block->getCacheContexts()->willReturn([]); + $block->getCacheTags()->willReturn([]); + $block->getCacheMaxAge()->willReturn(Cache::PERMANENT); + + $section = [ + new SectionComponent('some_uuid', 'content', ['id' => 'block_plugin_id']), + ]; + $expected = [ + 'content' => [ + 'some_uuid' => [ + '#cache' => [ + 'contexts' => [], + 'tags' => [], + 'max-age' => -1, + ], + ], + ], + ]; + $result = (new Section('layout_onecol', [], $section))->toRenderArray(); + $this->assertEquals($expected, $result); + } + + /** + * @covers ::toRenderArray + */ + public function testToRenderArrayPreview() { + $block_content = ['#markup' => 'The block content.']; + $render_array = [ + '#theme' => 'block', + '#weight' => 0, + '#configuration' => [], + '#plugin_id' => 'block_plugin_id', + '#base_plugin_id' => 'block_plugin_id', + '#derivative_plugin_id' => NULL, + 'content' => $block_content, + '#cache' => [ + 'contexts' => [], + 'tags' => [], + 'max-age' => 0, + ], + ]; + $block = $this->prophesize(BlockPluginInterface::class); + $this->blockManager->createInstance('block_plugin_id', ['id' => 'block_plugin_id'])->willReturn($block->reveal()); + + $block->access($this->account->reveal(), TRUE)->shouldNotBeCalled(); + $block->build()->willReturn($block_content); + $block->getCacheContexts()->willReturn([]); + $block->getCacheTags()->willReturn([]); + $block->getCacheMaxAge()->willReturn(Cache::PERMANENT); + $block->getConfiguration()->willReturn([]); + $block->getPluginId()->willReturn('block_plugin_id'); + $block->getBaseId()->willReturn('block_plugin_id'); + $block->getDerivativeId()->willReturn(NULL); + + $section = [ + new SectionComponent('some_uuid', 'content', ['id' => 'block_plugin_id']), + ]; + $expected = [ + 'content' => [ + 'some_uuid' => $render_array, + ], + ]; + $result = (new Section('layout_onecol', [], $section))->toRenderArray([], TRUE); + $this->assertEquals($expected, $result); + } + + /** + * @covers ::toRenderArray + */ + public function testToRenderArrayEmpty() { + $section = []; + $expected = []; + $result = (new Section('layout_onecol', [], $section))->toRenderArray(); + $this->assertEquals($expected, $result); + } + + /** + * @covers ::toRenderArray + */ + public function testContextAwareBlock() { + $render_array = [ + '#theme' => 'block', + '#weight' => 0, + '#configuration' => [], + '#plugin_id' => 'block_plugin_id', + '#base_plugin_id' => 'block_plugin_id', + '#derivative_plugin_id' => NULL, + 'content' => [], + '#cache' => [ + 'contexts' => [], + 'tags' => [], + 'max-age' => -1, + ], + ]; + + $block = $this->prophesize(BlockPluginInterface::class)->willImplement(ContextAwarePluginInterface::class); + $this->blockManager->createInstance('block_plugin_id', ['id' => 'block_plugin_id'])->willReturn($block->reveal()); + + $access_result = AccessResult::allowed(); + $block->access($this->account->reveal(), TRUE)->willReturn($access_result); + $block->build()->willReturn([]); + $block->getCacheContexts()->willReturn([]); + $block->getCacheTags()->willReturn([]); + $block->getCacheMaxAge()->willReturn(Cache::PERMANENT); + $block->getContextMapping()->willReturn([]); + $block->getPluginId()->willReturn('block_plugin_id'); + $block->getBaseId()->willReturn('block_plugin_id'); + $block->getDerivativeId()->willReturn(NULL); + $block->getConfiguration()->willReturn([]); + + $section = [ + new SectionComponent('some_uuid', 'content', ['id' => 'block_plugin_id']), + ]; + $expected = [ + 'content' => [ + 'some_uuid' => $render_array, + ], + ]; + $result = (new Section('layout_onecol', [], $section))->toRenderArray(); + $this->assertEquals($expected, $result); + } + + /** + * @covers ::toRenderArray + */ + public function testToRenderArrayMissingPluginId() { + $this->setExpectedException(PluginException::class, 'No plugin ID specified for component with "some_uuid" UUID'); + (new Section('layout_onecol', [], [new SectionComponent('some_uuid', 'content')]))->toRenderArray(); + } + +}