You are here

class BlockPageVariantTest in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/modules/block/tests/src/Unit/Plugin/DisplayVariant/BlockPageVariantTest.php \Drupal\Tests\block\Unit\Plugin\DisplayVariant\BlockPageVariantTest

@coversDefaultClass \Drupal\block\Plugin\DisplayVariant\BlockPageVariant @group block

Hierarchy

Expanded class hierarchy of BlockPageVariantTest

File

core/modules/block/tests/src/Unit/Plugin/DisplayVariant/BlockPageVariantTest.php, line 18
Contains \Drupal\Tests\block\Unit\Plugin\DisplayVariant\BlockPageVariantTest.

Namespace

Drupal\Tests\block\Unit\Plugin\DisplayVariant
View source
class BlockPageVariantTest extends UnitTestCase {

  /**
   * The block repository.
   *
   * @var \Drupal\block\BlockRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
   */
  protected $blockRepository;

  /**
   * The block view builder.
   *
   * @var \Drupal\Core\Entity\EntityViewBuilderInterface|\PHPUnit_Framework_MockObject_MockObject
   */
  protected $blockViewBuilder;

  /**
   * The plugin context handler.
   *
   * @var \Drupal\Core\Plugin\Context\ContextHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
   */
  protected $contextHandler;

  /**
   * Sets up a display variant plugin for testing.
   *
   * @param array $configuration
   *   An array of plugin configuration.
   * @param array $definition
   *   The plugin definition array.
   *
   * @return \Drupal\block\Plugin\DisplayVariant\BlockPageVariant|\PHPUnit_Framework_MockObject_MockObject
   *   A mocked display variant plugin.
   */
  public function setUpDisplayVariant($configuration = array(), $definition = array()) {
    $container = new Container();
    $cache_context_manager = $this
      ->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(array(
      $configuration,
      'test',
      $definition,
      $this->blockRepository,
      $this->blockViewBuilder,
      [
        'config:block_list',
      ],
    ))
      ->setMethods(array(
      'getRegionNames',
    ))
      ->getMock();
  }
  public function providerBuild() {
    $blocks_config = array(
      'block1' => array(
        // region, is main content block, is messages block, is title block
        'top',
        FALSE,
        FALSE,
        FALSE,
      ),
      // Test multiple blocks in the same region.
      'block2' => array(
        'bottom',
        FALSE,
        FALSE,
        FALSE,
      ),
      'block3' => array(
        'bottom',
        FALSE,
        FALSE,
        FALSE,
      ),
      // Test a block implementing MainContentBlockPluginInterface.
      'block4' => array(
        'center',
        TRUE,
        FALSE,
        FALSE,
      ),
      // Test a block implementing MessagesBlockPluginInterface.
      'block5' => array(
        'center',
        FALSE,
        TRUE,
        FALSE,
      ),
      // Test a block implementing TitleBlockPluginInterface.
      'block6' => array(
        '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(array()));
    $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());
  }

}

Members

Namesort descending Modifiers Type Description Overrides
BlockPageVariantTest::$blockRepository protected property The block repository.
BlockPageVariantTest::$blockViewBuilder protected property The block view builder.
BlockPageVariantTest::$contextHandler protected property The plugin context handler.
BlockPageVariantTest::providerBuild public function
BlockPageVariantTest::setUpDisplayVariant public function Sets up a display variant plugin for testing.
BlockPageVariantTest::testBuild public function Tests the building of a full page variant.
BlockPageVariantTest::testBuildWithoutMainContent public function Tests the building of a full page variant with no main content set.
UnitTestCase::$randomGenerator protected property The random generator.
UnitTestCase::$root protected property The app root.
UnitTestCase::assertArrayEquals protected function Asserts if two arrays are equal by sorting them first.
UnitTestCase::getBlockMockWithMachineName protected function Mocks a block with a block plugin.
UnitTestCase::getClassResolverStub protected function Returns a stub class resolver.
UnitTestCase::getConfigFactoryStub public function Returns a stub config factory that behaves according to the passed in array.
UnitTestCase::getConfigStorageStub public function Returns a stub config storage that returns the supplied configuration.
UnitTestCase::getContainerWithCacheTagsInvalidator protected function Sets up a container with a cache tags invalidator.
UnitTestCase::getRandomGenerator protected function Gets the random generator for the utility methods.
UnitTestCase::getStringTranslationStub public function Returns a stub translation manager that just returns the passed string.
UnitTestCase::randomMachineName public function Generates a unique random string containing letters and numbers.
UnitTestCase::setUp protected function 259