entity_hierarchy-8.x-2.24/tests/src/Kernel/ViewsIntegrationTest.php
tests/src/Kernel/ViewsIntegrationTest.php
<?php namespace Drupal\Tests\entity_hierarchy\Kernel; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\views\Tests\ViewResultAssertionTrait; use Drupal\views\Views; /** * Defines a class for testing views integration. * * @group entity_hierarchy */ class ViewsIntegrationTest extends EntityHierarchyKernelTestBase { use ViewResultAssertionTrait; /** * Module containing the test views. * * @var string */ protected $testViewModule = 'entity_hierarchy_test_views'; /** * {@inheritdoc} */ protected static $modules = [ 'entity_hierarchy', 'entity_test', 'system', 'user', 'dbal', 'field', 'views', 'entity_hierarchy_test_views', ]; /** * {@inheritdoc} */ protected function additionalSetup() { parent::additionalSetup(); $this->installConfig($this->testViewModule); $this->installConfig('system'); } /** * Gets the views argument from a given entity. * * @param \Drupal\Core\Entity\ContentEntityInterface $entity * The entity. * * @return int * The views argument/contextual filter value. */ protected function getArgumentFromEntity(ContentEntityInterface $entity) : int { return $entity->id(); } /** * Tests views integration. */ public function testViewsIntegrationDirectChildren(): void { $children = $this->createChildEntities($this->parent->id(), 3); $child = reset($children); $this->createChildEntities($child->id(), 5); // Tree is as follows // 1 : Parent // - 4 : Child 3 // - 3 : Child 2 // - 2 : Child 1 // - - 9 : Child 5 // - - 8 : Child 4 // - - 7 : Child 3 // - - 6 : Child 2 // - - 5 : Child 1 // Test showing single hierarchy. $expected = [ [ 'name' => 'Child 3', 'id' => 4, ], [ 'name' => 'Child 2', 'id' => 3, ], [ 'name' => 'Child 1', 'id' => 2, ], ]; $executable = Views::getView('entity_hierarchy_test_children_view'); $executable->preview('block_1', [$this->getArgumentFromEntity($this->parent)]); $this->assertCount(3, $executable->result); $this->assertIdenticalResultset($executable, $expected, [ 'name' => 'name', 'id' => 'id', ]); } /** * Tests views integration. */ public function testViewsIntegrationIncludingGrandChildren(): void { $children = $this->createChildEntities($this->parent->id(), 3); $child = reset($children); $this->createChildEntities($child->id(), 5); // Tree is as follows // 1 : Parent // - 4 : Child 3 // - 3 : Child 2 // - 2 : Child 1 // - - 9 : Child 5 // - - 8 : Child 4 // - - 7 : Child 3 // - - 6 : Child 2 // - - 5 : Child 1 // Test showing single hierarchy. $expected = [ [ 'name' => 'Child 3', 'id' => 4, ], [ 'name' => 'Child 2', 'id' => 3, ], [ 'name' => 'Child 1', 'id' => 2, ], [ 'name' => 'Child 5', 'id' => 9, ], [ 'name' => 'Child 4', 'id' => 8, ], [ 'name' => 'Child 3', 'id' => 7, ], [ 'name' => 'Child 2', 'id' => 6, ], [ 'name' => 'Child 1', 'id' => 5, ], ]; $executable = Views::getView('entity_hierarchy_test_children_view'); $executable->preview('block_2', [$this->getArgumentFromEntity($this->parent)]); $this->assertCount(8, $executable->result); $this->assertIdenticalResultset($executable, $expected, [ 'name' => 'name', 'id' => 'id', ]); } /** * Tests views integration. */ public function testViewsIntegrationParents(): void { $children = $this->createChildEntities($this->parent->id(), 1); $child = reset($children); $grandchildren = $this->createChildEntities($child->id(), 1); // Tree is as follows // 1 : Parent // - 2 : Child 1 // - - 3 : Child 1 // Test showing single hierarchy. $expected = [ [ 'name' => 'Parent', 'id' => 1, ], [ 'name' => 'Child 1', 'id' => 2, ], ]; $executable = Views::getView('entity_hierarchy_test_children_view'); $executable->preview('block_3', [$this->getArgumentFromEntity(reset($grandchildren))]); $this->assertCount(2, $executable->result); $this->assertIdenticalResultset($executable, $expected, [ 'name' => 'name', 'id' => 'id', ]); } /** * Tests views sibling integration. */ public function testViewsIntegrationSiblings(): void { $children = $this->createChildEntities($this->parent->id(), 3); $child = reset($children); $this->createChildEntities($child->id(), 5); // Tree is as follows // 1 : Parent // - 4 : Child 3 // - 3 : Child 2 // - 2 : Child 1 // - - 9 : Child 5 // - - 8 : Child 4 // - - 7 : Child 3 // - - 6 : Child 2 // - - 5 : Child 1 // Test showing single hierarchy. $expected = [ [ 'name' => 'Child 3', 'id' => 4, ], [ 'name' => 'Child 2', 'id' => 3, ], ]; $executable = Views::getView('entity_hierarchy_test_children_view'); $executable->preview('block_4', [$this->getArgumentFromEntity($child)]); $this->assertCount(2, $executable->result); $this->assertIdenticalResultset($executable, $expected, [ 'name' => 'name', 'id' => 'id', ]); } /** * Tests views sibling integration with show_self enabled. */ public function testViewsIntegrationSiblingsShowSelf(): void { $children = $this->createChildEntities($this->parent->id(), 3); $child = reset($children); $this->createChildEntities($child->id(), 5); // Tree is as follows // 1 : Parent // - 4 : Child 3 // - 3 : Child 2 // - 2 : Child 1 // - - 9 : Child 5 // - - 8 : Child 4 // - - 7 : Child 3 // - - 6 : Child 2 // - - 5 : Child 1 // Test showing siblings with the show_self option enabled. $expected = [ [ 'name' => 'Child 3', 'id' => 4, ], [ 'name' => 'Child 2', 'id' => 3, ], [ 'name' => 'Child 1', 'id' => 2, ], ]; $executable = Views::getView('entity_hierarchy_test_children_view'); $executable->preview('block_5', [$this->getArgumentFromEntity($child)]); $this->assertCount(3, $executable->result); $this->assertIdenticalResultset($executable, $expected, [ 'name' => 'name', 'id' => 'id', ]); } /** * Tests the depth field. */ public function testDepthField(): void { $children = $this->createChildEntities($this->parent->id(), 1); $child = reset($children); $this->createChildEntities($child->id(), 1); // Tree is as follows // 1 : Parent // - 2 : Child 1 // - - 3 : Child 1. $executable = Views::getView('entity_hierarchy_test_fields_view'); $output = $executable->preview('field_depth'); $output = \Drupal::service('renderer')->renderRoot($output); $this->assertStringContainsString('Parent at depth 0', $output); $this->assertStringContainsString('Child 1 at depth 2', $output); } /** * Tests the child summary field. */ public function testChildrenSummaryField(): void { $children = $this->createChildEntities($this->parent->id(), 1, 'First'); $child = reset($children); $children = $this->createChildEntities($child->id(), 2, 'Second'); foreach ($children as $key => $child) { $children = $this->createChildEntities($child->id(), 3, "Third-{$key}"); } $child = reset($children); $this->createChildEntities($child->id(), 1, 'Fourth'); $this->createChildEntities($this->parent->id(), 1, 'Other'); $executable = Views::getView('entity_hierarchy_test_fields_view'); $output = $executable->preview('summary_child_counts'); $output = \Drupal::service('renderer')->renderRoot($output); $this->assertStringContainsString('Parent child counts are 2 / 2 / 6 / 1', $output); $this->assertStringContainsString('Child First1 child counts are 2 / 6 / 1', $output); $this->assertStringContainsString('Child Second2 child counts are 3 / 1', $output); $this->assertStringContainsString('Child Third-Child Second21 child counts are 1', $output); $this->assertStringContainsString('Child Second1 child counts are 3', $output); } /** * Tests the relationship to the root node.. */ public function testRelationshipRoot(): void { $children = $this->createChildEntities($this->parent->id(), 1, 'First'); $child = reset($children); $children = $this->createChildEntities($child->id(), 2, 'Second'); $child = reset($children); $children = $this->createChildEntities($child->id(), 1, 'Third'); $child = reset($children); $children = $this->createChildEntities($child->id(), 1, 'Fourth'); // Tree is as follows. // 1 : First 1 // - 2 : Second 1 // - 3 : Second 2 // -- 4 : Third 1 // --- 5 : Fourth 1. $executable = Views::getView('entity_hierarchy_test_relationships_view'); $output = $executable->preview('root'); $output = trim(\Drupal::service('renderer')->renderRoot($output)); $this->assertStringContainsString('Parent is root of Child First1', $output); $this->assertStringContainsString('Parent is root of Child Third1', $output); $this->assertStringContainsString('Parent is root of Child Fourth1', $output); $this->assertStringNotContainsString('1 is root', $output); $this->assertEquals(6, substr_count($output, ' is root of')); } /** * Tests the relationship to the parent node. */ public function testRelationshipParent(): void { $children = $this->createChildEntities($this->parent->id(), 1, 'First'); $child = reset($children); $children = $this->createChildEntities($child->id(), 2, 'Second'); $child = reset($children); $children = $this->createChildEntities($child->id(), 1, 'Third'); $child = reset($children); $children = $this->createChildEntities($child->id(), 1, 'Fourth'); // Tree is as follows. // 1 : First 1 // - 2 : Second 1 // - 3 : Second 2 // -- 4 : Third 1 // --- 5 : Fourth 1. $executable = Views::getView('entity_hierarchy_test_relationships_view'); $output = $executable->preview('parent'); $output = \Drupal::service('renderer')->renderRoot($output); $this->assertStringContainsString('Child First1 is parent of Child Second2', $output); $this->assertStringContainsString('Child Second1 is parent of Child Third1', $output); $this->assertStringContainsString('Child Third1 is parent of Child Fourth1', $output); $this->assertStringNotContainsString('Child Fourth1 is parent of', $output); $this->assertEquals(5, substr_count($output, ' is parent of Child')); } /** * Tests the relationship to the children nodes. */ public function testRelationshipChildren(): void { $children = $this->createChildEntities($this->parent->id(), 1, 'First'); $child = reset($children); $children = $this->createChildEntities($child->id(), 2, 'Second'); $child = reset($children); $children = $this->createChildEntities($child->id(), 1, 'Third'); $child = reset($children); $children = $this->createChildEntities($child->id(), 1, 'Fourth'); // Tree is as follows. // 1 : First 1 // - 2 : Second 1 // - 3 : Second 2 // -- 4 : Third 1 // --- 5 : Fourth 1. $executable = Views::getView('entity_hierarchy_test_relationships_view'); $output = $executable->preview('children'); $output = trim(\Drupal::service('renderer')->renderRoot($output)); $this->assertStringContainsString('Child Second1 is child of Child First1', $output); $this->assertStringContainsString('Child Third1 is child of Child Second1', $output); $this->assertStringContainsString('Child Fourth1 is child of Child Third1', $output); $this->assertStringNotContainsString('child of Child Fourth1', $output); $this->assertEquals(5, substr_count($output, ' is child of')); } /** * Tests target_id filter uses core's entity_reference plugin. */ public function testEntityReferenceFilterHandler(): void { $data = \Drupal::service('views.views_data')->getAll(); $this->assertEquals('entity_reference', $data[$this->parent->getEntityTypeId() . '__parents']['parents_target_id']['filter']['id']); } }