You are here

public function ContextualFiltersBlockContextTest::testBlockContext in Drupal 10

Same name and namespace in other branches
  1. 8 core/modules/views/tests/src/Functional/Plugin/ContextualFiltersBlockContextTest.php \Drupal\Tests\views\Functional\Plugin\ContextualFiltersBlockContextTest::testBlockContext()
  2. 9 core/modules/views/tests/src/Functional/Plugin/ContextualFiltersBlockContextTest.php \Drupal\Tests\views\Functional\Plugin\ContextualFiltersBlockContextTest::testBlockContext()

Tests exposed context.

File

core/modules/views/tests/src/Functional/Plugin/ContextualFiltersBlockContextTest.php, line 88

Class

ContextualFiltersBlockContextTest
A test for contextual filters exposed as block context.

Namespace

Drupal\Tests\views\Functional\Plugin

Code

public function testBlockContext() {
  $this
    ->drupalLogin($this
    ->drupalCreateUser([
    'administer views',
    'administer blocks',
  ]));

  // Check if context was correctly propagated to the block.
  $definition = $this->container
    ->get('plugin.manager.block')
    ->getDefinition('views_block:test_view_block_with_context-block_1');
  $this
    ->assertInstanceOf(ContextDefinitionInterface::class, $definition['context_definitions']['nid']);

  /** @var \Drupal\Core\Plugin\Context\ContextDefinitionInterface $context */
  $context = $definition['context_definitions']['nid'];
  $this
    ->assertEquals('entity:node', $context
    ->getDataType(), 'Context definition data type is correct.');
  $this
    ->assertEquals('Content: ID', $context
    ->getLabel(), 'Context definition label is correct.');
  $this
    ->assertFalse($context
    ->isRequired(), 'Context is not required.');

  // Place test block via block UI to check if contexts are correctly exposed.
  $this
    ->drupalGet('admin/structure/block/add/views_block:test_view_block_with_context-block_1/classy', [
    'query' => [
      'region' => 'content',
    ],
  ]);
  $edit = [
    'settings[context_mapping][nid]' => '@node.node_route_context:node',
  ];
  $this
    ->submitForm($edit, 'Save block');

  // Check if mapping saved correctly.

  /** @var \Drupal\block\BlockInterface $block */
  $block = $this->container
    ->get('entity_type.manager')
    ->getStorage('block')
    ->load('views_block__test_view_block_with_context_block_1');
  $expected_settings = [
    'id' => 'views_block:test_view_block_with_context-block_1',
    'label' => '',
    'provider' => 'views',
    'label_display' => 'visible',
    'views_label' => '',
    'items_per_page' => 'none',
    'context_mapping' => [
      'nid' => '@node.node_route_context:node',
    ],
  ];
  $this
    ->assertEquals($expected_settings, $block
    ->getPlugin()
    ->getConfiguration(), 'Block settings are correct.');

  // Make sure view behaves as expected.
  $this
    ->drupalGet('<front>');
  $this
    ->assertSession()
    ->pageTextContains('Test view: No results found.');
  $this
    ->drupalGet($this->nodes[0]
    ->toUrl());
  $this
    ->assertSession()
    ->pageTextContains('Test view row: First test node');
  $this
    ->drupalGet($this->nodes[1]
    ->toUrl());
  $this
    ->assertSession()
    ->pageTextContains('Test view row: Second test node');

  // Check the second block which should expose two integer contexts, one
  // based on the numeric plugin and the other based on numeric validation.
  $definition = $this->container
    ->get('plugin.manager.block')
    ->getDefinition('views_block:test_view_block_with_context-block_2');
  $this
    ->assertInstanceOf(ContextDefinitionInterface::class, $definition['context_definitions']['created']);

  /** @var \Drupal\Core\Plugin\Context\ContextDefinitionInterface $context */
  $context = $definition['context_definitions']['created'];
  $this
    ->assertEquals('integer', $context
    ->getDataType(), 'Context definition data type is correct.');
  $this
    ->assertEquals('Content: Authored on', $context
    ->getLabel(), 'Context definition label is correct.');
  $this
    ->assertFalse($context
    ->isRequired(), 'Context is not required.');
  $this
    ->assertInstanceOf(ContextDefinitionInterface::class, $definition['context_definitions']['vid']);

  /** @var \Drupal\Core\Plugin\Context\ContextDefinitionInterface $context */
  $context = $definition['context_definitions']['vid'];
  $this
    ->assertEquals('integer', $context
    ->getDataType(), 'Context definition data type is correct.');
  $this
    ->assertEquals('Content: Revision ID', $context
    ->getLabel(), 'Context definition label is correct.');
  $this
    ->assertFalse($context
    ->isRequired(), 'Context is not required.');
  $this
    ->assertInstanceOf(ContextDefinitionInterface::class, $definition['context_definitions']['title']);

  /** @var \Drupal\Core\Plugin\Context\ContextDefinitionInterface $context */
  $context = $definition['context_definitions']['title'];
  $this
    ->assertEquals('string', $context
    ->getDataType(), 'Context definition data type is correct.');
  $this
    ->assertEquals('Content: Title', $context
    ->getLabel(), 'Context definition label is correct.');
  $this
    ->assertFalse($context
    ->isRequired(), 'Context is not required.');
}