public function MenuUiNodeTest::testMenuNodeFormWidget in Drupal 8
Same name and namespace in other branches
- 9 core/modules/menu_ui/tests/src/Functional/MenuUiNodeTest.php \Drupal\Tests\menu_ui\Functional\MenuUiNodeTest::testMenuNodeFormWidget()
Test creating, editing, deleting menu links via node form widget.
File
- core/
modules/ menu_ui/ tests/ src/ Functional/ MenuUiNodeTest.php, line 70
Class
- MenuUiNodeTest
- Add, edit, and delete a node with menu link.
Namespace
Drupal\Tests\menu_ui\FunctionalCode
public function testMenuNodeFormWidget() {
// Verify that cacheability metadata is bubbled from the menu link tree
// access checking that is performed when determining the "default parent
// item" options in menu_ui_form_node_type_form_alter(). The "log out" link
// adds the "user.roles:authenticated" cache context.
$this
->drupalGet('admin/structure/types/manage/page');
$this
->assertSession()
->responseHeaderContains('X-Drupal-Cache-Contexts', 'user.roles:authenticated');
// Verify that the menu link title has the correct maxlength.
$title_max_length = \Drupal::service('entity_field.manager')
->getBaseFieldDefinitions('menu_link_content')['title']
->getSetting('max_length');
$this
->drupalGet('node/add/page');
$this
->assertPattern('/<input .* id="edit-menu-title" .* maxlength="' . $title_max_length . '" .* \\/>/');
// Verify that the menu link description has the correct maxlength.
$description_max_length = \Drupal::service('entity_field.manager')
->getBaseFieldDefinitions('menu_link_content')['description']
->getSetting('max_length');
$this
->drupalGet('node/add/page');
$this
->assertPattern('/<input .* id="edit-menu-description" .* maxlength="' . $description_max_length . '" .* \\/>/');
// Disable the default main menu, so that no menus are enabled.
$edit = [
'menu_options[main]' => FALSE,
];
$this
->drupalPostForm('admin/structure/types/manage/page', $edit, t('Save content type'));
// Verify that no menu settings are displayed and nodes can be created.
$this
->drupalGet('node/add/page');
$this
->assertText(t('Create Basic page'));
$this
->assertNoText(t('Menu settings'));
$node_title = $this
->randomMachineName();
$edit = [
'title[0][value]' => $node_title,
'body[0][value]' => $this
->randomString(),
];
$this
->drupalPostForm(NULL, $edit, t('Save'));
$node = $this
->drupalGetNodeByTitle($node_title);
$this
->assertEqual($node
->getTitle(), $edit['title[0][value]']);
// Test that we cannot set a menu item from a menu that is not set as
// available.
$edit = [
'menu_options[tools]' => 1,
'menu_parent' => 'main:',
];
$this
->drupalPostForm('admin/structure/types/manage/page', $edit, t('Save content type'));
$this
->assertText(t('The selected menu item is not under one of the selected menus.'));
$this
->assertNoRaw(t('The content type %name has been updated.', [
'%name' => 'Basic page',
]));
// Enable Tools menu as available menu.
$edit = [
'menu_options[main]' => 1,
'menu_options[tools]' => 1,
'menu_parent' => 'main:',
];
$this
->drupalPostForm('admin/structure/types/manage/page', $edit, t('Save content type'));
$this
->assertRaw(t('The content type %name has been updated.', [
'%name' => 'Basic page',
]));
// Test that we can preview a node that will create a menu item.
$edit = [
'title[0][value]' => $node_title,
'menu[enabled]' => 1,
'menu[title]' => 'Test preview',
];
$this
->drupalPostForm('node/add/page', $edit, t('Preview'));
// Create a node.
$node_title = $this
->randomMachineName();
$edit = [
'title[0][value]' => $node_title,
'body[0][value]' => $this
->randomString(),
];
$this
->drupalPostForm('node/add/page', $edit, t('Save'));
$node = $this
->drupalGetNodeByTitle($node_title);
// Assert that there is no link for the node.
$this
->drupalGet('test-page');
$this
->assertSession()
->linkNotExists($node_title);
// Edit the node, enable the menu link setting, but skip the link title.
$edit = [
'menu[enabled]' => 1,
];
$this
->drupalPostForm('node/' . $node
->id() . '/edit', $edit, t('Save'));
// Assert that there is no link for the node.
$this
->drupalGet('test-page');
$this
->assertSession()
->linkNotExists($node_title);
// Make sure the menu links only appear when the node is published.
// These buttons just appear for 'administer nodes' users.
$admin_user = $this
->drupalCreateUser([
'access administration pages',
'administer content types',
'administer nodes',
'administer menu',
'create page content',
'edit any page content',
]);
$this
->drupalLogin($admin_user);
// Assert that the link does not exist if unpublished.
$edit = [
'menu[enabled]' => 1,
'menu[title]' => $node_title,
'status[value]' => FALSE,
];
$this
->drupalPostForm('node/' . $node
->id() . '/edit', $edit, 'Save');
$this
->drupalGet('test-page');
$this
->assertSession()
->linkNotExists($node_title, 'Found no menu link with the node unpublished');
// Assert that the link exists if published.
$edit['status[value]'] = TRUE;
$this
->drupalPostForm('node/' . $node
->id() . '/edit', $edit, 'Save');
$this
->drupalGet('test-page');
$this
->assertSession()
->linkExists($node_title, 0, 'Found a menu link with the node published');
// Log back in as normal user.
$this
->drupalLogin($this->editor);
// Edit the node and create a menu link.
$edit = [
'menu[enabled]' => 1,
'menu[title]' => $node_title,
'menu[weight]' => 17,
];
$this
->drupalPostForm('node/' . $node
->id() . '/edit', $edit, t('Save'));
// Assert that the link exists.
$this
->drupalGet('test-page');
$this
->assertSession()
->linkExists($node_title);
$this
->drupalGet('node/' . $node
->id() . '/edit');
$this
->assertFieldById('edit-menu-weight', 17, 'Menu weight correct in edit form');
// Verify that the menu link title field has correct maxlength in node edit
// form.
$this
->assertPattern('/<input .* id="edit-menu-title" .* maxlength="' . $title_max_length . '" .* \\/>/');
// Verify that the menu link description field has correct maxlength in
// node add form.
$this
->assertPattern('/<input .* id="edit-menu-description" .* maxlength="' . $description_max_length . '" .* \\/>/');
// Disable the menu link, then edit the node--the link should stay disabled.
$link_id = menu_ui_get_menu_link_defaults($node)['entity_id'];
/** @var \Drupal\menu_link_content\Entity\MenuLinkContent $link */
$link = MenuLinkContent::load($link_id);
$link
->set('enabled', FALSE);
$link
->save();
$this
->drupalPostForm($node
->toUrl('edit-form'), $edit, t('Save'));
$link = MenuLinkContent::load($link_id);
$this
->assertFalse($link
->isEnabled(), 'Saving a node with a disabled menu link keeps the menu link disabled.');
// Edit the node and remove the menu link.
$edit = [
'menu[enabled]' => FALSE,
];
$this
->drupalPostForm('node/' . $node
->id() . '/edit', $edit, t('Save'));
// Assert that there is no link for the node.
$this
->drupalGet('test-page');
$this
->assertSession()
->linkNotExists($node_title);
// Add a menu link to the Administration menu.
$item = MenuLinkContent::create([
'link' => [
[
'uri' => 'entity:node/' . $node
->id(),
],
],
'title' => $this
->randomMachineName(16),
'menu_name' => 'admin',
]);
$item
->save();
// Assert that disabled Administration menu is not shown on the
// node/$nid/edit page.
$this
->drupalGet('node/' . $node
->id() . '/edit');
$this
->assertText('Provide a menu link', 'Link in not allowed menu not shown in node edit form');
// Assert that the link is still in the Administration menu after save.
$this
->drupalPostForm('node/' . $node
->id() . '/edit', $edit, t('Save'));
$link = MenuLinkContent::load($item
->id());
$this
->assertInstanceOf(MenuLinkContent::class, $link);
// Move the menu link back to the Tools menu.
$item->menu_name->value = 'tools';
$item
->save();
// Create a second node.
$child_node = $this
->drupalCreateNode([
'type' => 'article',
]);
// Assign a menu link to the second node, being a child of the first one.
$child_item = MenuLinkContent::create([
'link' => [
[
'uri' => 'entity:node/' . $child_node
->id(),
],
],
'title' => $this
->randomMachineName(16),
'parent' => $item
->getPluginId(),
'menu_name' => $item
->getMenuName(),
]);
$child_item
->save();
// Edit the first node.
$this
->drupalGet('node/' . $node
->id() . '/edit');
// Assert that it is not possible to set the parent of the first node to itself or the second node.
$this
->assertNoOption('edit-menu-menu-parent', 'tools:' . $item
->getPluginId());
$this
->assertNoOption('edit-menu-menu-parent', 'tools:' . $child_item
->getPluginId());
// Assert that unallowed Administration menu is not available in options.
$this
->assertNoOption('edit-menu-menu-parent', 'admin:');
}