entity_hierarchy-8.x-2.24/tests/src/Functional/ReorderChildrenWithRevisionsFunctionalTest.php
tests/src/Functional/ReorderChildrenWithRevisionsFunctionalTest.php
<?php
namespace Drupal\Tests\entity_hierarchy\Functional;
use Drupal\entity_test\Entity\EntityTestRev;
use Drupal\Tests\block\Traits\BlockCreationTrait;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\entity_hierarchy\Traits\EntityHierarchyTestTrait;
/**
* Tests reordering with revisions.
*
* @group entity_hierarchy.
*/
class ReorderChildrenWithRevisionsFunctionalTest extends BrowserTestBase {
use EntityHierarchyTestTrait;
use BlockCreationTrait;
const ENTITY_TYPE = 'entity_test_rev';
const FIELD_NAME = 'parents';
/**
* {@inheritdoc}
*/
protected $defaultTheme = 'stark';
/**
* {@inheritdoc}
*/
protected static $modules = [
'entity_hierarchy',
'entity_test',
'system',
'user',
'dbal',
'block',
'field',
];
/**
* {@inheritdoc}
*/
protected function createTestEntity($parentId, $label = 'Child 1', $weight = 0) {
$values = [
'type' => static::ENTITY_TYPE,
$this->container->get('entity_type.manager')->getDefinition(static::ENTITY_TYPE)->getKey('label') => $label,
];
if ($parentId) {
$values[static::FIELD_NAME] = [
'target_id' => $parentId,
'weight' => $weight,
];
}
$entity = $this->doCreateTestEntity($values);
// Create a revision with the wrong weight.
$entity->setNewRevision(TRUE);
if ($parentId) {
$entity->{static::FIELD_NAME}->weight = -1 * $weight;
}
$entity->save();
// And a default revision with the correct weight.
$entity->setNewRevision(TRUE);
if ($parentId) {
$entity->{static::FIELD_NAME}->weight = $weight;
}
$entity->save();
return $entity;
}
/**
* {@inheritdoc}
*/
protected function doCreateTestEntity(array $values) {
$entity = EntityTestRev::create($values);
return $entity;
}
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
$this->setupEntityHierarchyField(static::ENTITY_TYPE, static::ENTITY_TYPE, static::FIELD_NAME);
$this->additionalSetup();
}
/**
* Tests children reorder form.
*/
public function testReordering(): void {
$entities = $this->createChildEntities($this->parent->id());
$root_node = $this->treeStorage->getNode($this->parentStub);
$children = $this->treeStorage->findChildren($root_node->getNodeKey());
$mapper = $this->container->get('entity_hierarchy.entity_tree_node_mapper');
$ancestors = $mapper->loadEntitiesForTreeNodesWithoutAccessChecks('entity_test_rev', $children);
$labels = $this->getLabels($ancestors);
$this->assertEquals([
'Child 5',
'Child 4',
'Child 3',
'Child 2',
'Child 1',
], $labels);
// Now insert one in the middle.
$name = 'Child 6';
$entities[$name] = $this->createTestEntity($this->parent->id(), $name, -2);
$children = $this->treeStorage->findChildren($root_node->getNodeKey());
$ancestors = $mapper->loadEntitiesForTreeNodesWithoutAccessChecks('entity_test_rev', $children);
$labels = $this->getLabels($ancestors);
$this->assertEquals([
'Child 5',
'Child 4',
'Child 3',
'Child 2',
'Child 6',
'Child 1',
], $labels);
// Now we visit the form for reordering.
$this->drupalLogin($this->drupalCreateUser([
'reorder entity_hierarchy children',
'view test entity',
'administer entity_test content',
]));
$this->drupalGet($this->parent->toUrl('entity_hierarchy_reorder'));
$assert = $this->assertSession();
$assert->statusCodeEquals(200);
foreach ($entities as $entity) {
$assert->linkExists($entity->label());
}
// Now move Child 6 to the top.
$this->submitForm([
'children[' . $entities[$name]->id() . '][weight]' => -10,
], 'Update child order');
$children = $this->treeStorage->findChildren($root_node->getNodeKey());
$ancestors = $mapper->loadEntitiesForTreeNodesWithoutAccessChecks('entity_test_rev', $children);
$labels = $this->getLabels($ancestors);
$this->assertEquals([
'Child 6',
'Child 5',
'Child 4',
'Child 3',
'Child 2',
'Child 1',
], $labels);
}
/**
* Get labels.
*
* @param \SplObjectStorage $ancestors
* Ancestors.
*
* @return array
* Labels.
*/
protected function getLabels(\SplObjectStorage $ancestors) {
$labels = [];
foreach ($ancestors as $node) {
$entity = $ancestors->offsetGet($node);
$labels[] = $entity->label();
}
return $labels;
}
}
