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() { $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)->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_content); $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(); } }