public function PageNodeSelectionTest::testAdmin in Page Manager 8.4
Tests that a node bundle condition controls the node view page.
File
- tests/
src/ Functional/ PageNodeSelectionTest.php, line 43
Class
- PageNodeSelectionTest
- Tests selecting variants based on nodes.
Namespace
Drupal\Tests\page_manager\FunctionalCode
public function testAdmin() {
// Create two nodes, and view their pages.
$node1 = $this
->drupalCreateNode([
'type' => 'page',
]);
$node2 = $this
->drupalCreateNode([
'title' => '<em>First</em> & <Second>',
'type' => 'article',
]);
$node3 = $this
->drupalCreateNode([
'type' => 'article',
]);
$this
->drupalGet('node/' . $node1
->id());
$this
->assertResponse(200);
$this
->assertText($node1
->label());
$this
->assertTitle($node1
->label() . ' | Drupal');
$this
->drupalGet('node/' . $node2
->id());
$this
->assertResponse(200);
$this
->assertCacheTag('page_manager_route_name:entity.node.canonical');
$expected_title = '<em>First</em> & <Second>';
$this
->assertRaw($expected_title);
$this
->assertTitle(html_entity_decode($expected_title) . ' | Drupal');
// Create a new variant to always return 404, the node_view page exists by
// default.
$http_status_variant = PageVariant::create([
'variant' => 'http_status_code',
'label' => 'HTTP status code',
'id' => 'http_status_code',
'page' => 'node_view',
]);
$http_status_variant
->getVariantPlugin()
->setConfiguration([
'status_code' => 404,
]);
$http_status_variant
->save();
$this
->triggerRouterRebuild();
$this
->drupalGet('node/' . $node1
->id());
$this
->assertResponse(404);
$this
->assertCacheTag('page_manager_route_name:entity.node.canonical');
$this
->assertNoText($node1
->label());
$this
->drupalGet('node/' . $node2
->id());
$this
->assertResponse(404);
$this
->assertNoText($node2
->label());
// Add a new variant.
/** @var \Drupal\page_manager\PageVariantInterface $block_page_variant */
$block_page_variant = PageVariant::create([
'variant' => 'block_display',
'id' => 'block_page_first',
'label' => 'First',
'page' => 'node_view',
]);
$block_page_plugin = $block_page_variant
->getVariantPlugin();
$this
->assertTrue(!empty($block_page_plugin
->getConfiguration()['uuid']));
$uuid = $block_page_plugin
->getConfiguration()['uuid'];
$block_page_plugin
->setConfiguration([
'page_title' => '[node:title]',
]);
$second_uuid = $block_page_plugin
->getConfiguration()['uuid'];
$this
->assertEqual($uuid, $second_uuid);
/** @var \Drupal\page_manager\Plugin\DisplayVariant\PageBlockDisplayVariant $block_page_plugin */
$block_page_plugin
->addBlock([
'id' => 'entity_view:node',
'label' => 'Entity view (Content)',
'label_display' => FALSE,
'view_mode' => 'default',
'region' => 'top',
'context_mapping' => [
'entity' => 'node',
],
]);
$block_page_variant
->addSelectionCondition([
'id' => 'node_type',
'bundles' => [
'article' => 'article',
],
'context_mapping' => [
'node' => 'node',
],
]);
$block_page_variant
->setWeight(-10);
$block_page_variant
->save();
$this
->triggerRouterRebuild();
// The page node will 404, but the article node will display the variant.
$this
->drupalGet('node/' . $node1
->id());
$this
->assertResponse(404);
$this
->assertNoText($node1
->label());
$this
->drupalGet('node/' . $node2
->id());
$this
->assertResponse(200);
$this
->assertTitle(html_entity_decode($expected_title) . ' | Drupal');
$this
->assertText($node2->body->value);
$this
->assertRaw('<h1 class="page-title">' . $expected_title . '</h1>');
// Test cacheability metadata.
$this
->drupalGet('node/' . $node3
->id());
$this
->assertTitle($node3
->label() . ' | Drupal');
$this
->assertText($node3->body->value);
$this
->assertNoText($node2
->label());
// Ensure that setting the same title directly in the block display results
// in the same output.
$block_page_plugin
->setConfiguration([
'page_title' => '<em>First</em> & <Second>',
]);
$block_page_variant
->save();
$this
->drupalGet('node/' . $node2
->id());
$this
->assertResponse(200);
$this
->assertTitle(html_entity_decode($expected_title) . ' | Drupal');
$this
->assertRaw('<h1 class="page-title">' . $expected_title . '</h1>');
// Ensure this doesn't affect the /node/add page.
$this
->drupalGet('node/add');
$this
->assertResponse(200);
}