public function MenuLinksOriginTest::testPendingRevisions in Menu Item Extras 8.2
Tests handling of pending revisions.
@coversDefaultClass \Drupal\menu_link_content\Plugin\Validation\Constraint\MenuTreeHierarchyConstraintValidator
File
- tests/
src/ Kernel/ MenuLinksOriginTest.php, line 339
Class
- MenuLinksOriginTest
- Tests handling of menu links hierarchies.
Namespace
Drupal\Tests\menu_item_extras\KernelCode
public function testPendingRevisions() {
/** @var \Drupal\Core\Entity\RevisionableStorageInterface $storage */
$storage = \Drupal::entityTypeManager()
->getStorage('menu_link_content');
// Add new menu items in a hierarchy.
$default_root_1_title = $this
->randomMachineName(8);
$root_1 = $storage
->create([
'title' => $default_root_1_title,
'link' => [
[
'uri' => 'internal:/#root_1',
],
],
'menu_name' => 'menu_test',
]);
$root_1
->save();
$default_child1_title = $this
->randomMachineName(8);
$child1 = $storage
->create([
'title' => $default_child1_title,
'link' => [
[
'uri' => 'internal:/#child1',
],
],
'menu_name' => 'menu_test',
'parent' => 'menu_link_content:' . $root_1
->uuid(),
]);
$child1
->save();
$default_child2_title = $this
->randomMachineName(8);
$child2 = $storage
->create([
'title' => $default_child2_title,
'link' => [
[
'uri' => 'internal:/#child2',
],
],
'menu_name' => 'menu_test',
'parent' => 'menu_link_content:' . $child1
->uuid(),
]);
$child2
->save();
$default_root_2_title = $this
->randomMachineName(8);
$root_2 = $storage
->create([
'title' => $default_root_2_title,
'link' => [
[
'uri' => 'internal:/#root_2',
],
],
'menu_name' => 'menu_test',
]);
$root_2
->save();
// Check that changing the title and the link in a pending revision is
// allowed.
$pending_child1_title = $this
->randomMachineName(8);
$child1_pending_revision = $storage
->createRevision($child1, FALSE);
$child1_pending_revision
->set('title', $pending_child1_title);
$child1_pending_revision
->set('link', [
[
'uri' => 'internal:/#test',
],
]);
$violations = $child1_pending_revision
->validate();
$this
->assertEmpty($violations);
$child1_pending_revision
->save();
$storage
->resetCache();
$child1_pending_revision = $storage
->loadRevision($child1_pending_revision
->getRevisionId());
$this
->assertFalse($child1_pending_revision
->isDefaultRevision());
$this
->assertEquals($pending_child1_title, $child1_pending_revision
->getTitle());
$this
->assertEquals('/#test', $child1_pending_revision
->getUrlObject()
->toString());
// Check that saving a pending revision does not affect the menu tree.
$menu_tree = \Drupal::menuTree()
->load('menu_test', new MenuTreeParameters());
$parent_link = reset($menu_tree);
$this
->assertEquals($default_root_1_title, $parent_link->link
->getTitle());
$this
->assertEquals('/#root_1', $parent_link->link
->getUrlObject()
->toString());
$child1_link = reset($parent_link->subtree);
$this
->assertEquals($default_child1_title, $child1_link->link
->getTitle());
$this
->assertEquals('/#child1', $child1_link->link
->getUrlObject()
->toString());
$child2_link = reset($child1_link->subtree);
$this
->assertEquals($default_child2_title, $child2_link->link
->getTitle());
$this
->assertEquals('/#child2', $child2_link->link
->getUrlObject()
->toString());
// Check that changing the parent in a pending revision is not allowed.
$child2_pending_revision = $storage
->createRevision($child2, FALSE);
$child2_pending_revision
->set('parent', $child1
->id());
$violations = $child2_pending_revision
->validate();
$this
->assertCount(1, $violations);
$this
->assertEquals('You can only change the hierarchy for the <em>published</em> version of this menu link.', $violations[0]
->getMessage());
$this
->assertEquals('menu_parent', $violations[0]
->getPropertyPath());
// Check that changing the weight in a pending revision is not allowed.
$child2_pending_revision = $storage
->createRevision($child2, FALSE);
$child2_pending_revision
->set('weight', 500);
$violations = $child2_pending_revision
->validate();
$this
->assertCount(1, $violations);
$this
->assertEquals('You can only change the hierarchy for the <em>published</em> version of this menu link.', $violations[0]
->getMessage());
$this
->assertEquals('weight', $violations[0]
->getPropertyPath());
// Check that changing both the parent and the weight in a pending revision
// is not allowed.
$child2_pending_revision = $storage
->createRevision($child2, FALSE);
$child2_pending_revision
->set('parent', $child1
->id());
$child2_pending_revision
->set('weight', 500);
$violations = $child2_pending_revision
->validate();
$this
->assertCount(2, $violations);
$this
->assertEquals('You can only change the hierarchy for the <em>published</em> version of this menu link.', $violations[0]
->getMessage());
$this
->assertEquals('You can only change the hierarchy for the <em>published</em> version of this menu link.', $violations[1]
->getMessage());
$this
->assertEquals('menu_parent', $violations[0]
->getPropertyPath());
$this
->assertEquals('weight', $violations[1]
->getPropertyPath());
// Check that changing the parent of a term which didn't have a parent
// initially is not allowed in a pending revision.
$root_2_pending_revision = $storage
->createRevision($root_2, FALSE);
$root_2_pending_revision
->set('parent', $root_1
->id());
$violations = $root_2_pending_revision
->validate();
$this
->assertCount(1, $violations);
$this
->assertEquals('You can only change the hierarchy for the <em>published</em> version of this menu link.', $violations[0]
->getMessage());
$this
->assertEquals('menu_parent', $violations[0]
->getPropertyPath());
}