View source
<?php
namespace Drupal\Tests\menu_ui\Functional;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\menu_link_content\Entity\MenuLinkContent;
use Drupal\node\Entity\Node;
use Drupal\Tests\BrowserTestBase;
class MenuUiNodeTest extends BrowserTestBase {
protected $editor;
public static $modules = [
'menu_ui',
'test_page_test',
'node',
'block',
'locale',
'language',
'content_translation',
];
protected $defaultTheme = 'stark';
protected function setUp() {
parent::setUp();
$this
->drupalPlaceBlock('system_menu_block:main');
$this
->drupalPlaceBlock('page_title_block');
$this
->drupalCreateContentType([
'type' => 'page',
'name' => 'Basic page',
]);
$this->editor = $this
->drupalCreateUser([
'access administration pages',
'administer content types',
'administer menu',
'create page content',
'edit any page content',
'delete any page content',
'create content translations',
'update content translations',
'delete content translations',
'translate any entity',
]);
$this
->drupalLogin($this->editor);
}
public function testMenuNodeFormWidget() {
$this
->drupalGet('admin/structure/types/manage/page');
$this
->assertSession()
->responseHeaderContains('X-Drupal-Cache-Contexts', 'user.roles:authenticated');
$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 . '" .* \\/>/');
$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 . '" .* \\/>/');
$edit = [
'menu_options[main]' => FALSE,
];
$this
->drupalPostForm('admin/structure/types/manage/page', $edit, t('Save content type'));
$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]']);
$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',
]));
$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',
]));
$edit = [
'title[0][value]' => $node_title,
'menu[enabled]' => 1,
'menu[title]' => 'Test preview',
];
$this
->drupalPostForm('node/add/page', $edit, t('Preview'));
$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);
$this
->drupalGet('test-page');
$this
->assertSession()
->linkNotExists($node_title);
$edit = [
'menu[enabled]' => 1,
];
$this
->drupalPostForm('node/' . $node
->id() . '/edit', $edit, t('Save'));
$this
->drupalGet('test-page');
$this
->assertSession()
->linkNotExists($node_title);
$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);
$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');
$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');
$this
->drupalLogin($this->editor);
$edit = [
'menu[enabled]' => 1,
'menu[title]' => $node_title,
'menu[weight]' => 17,
];
$this
->drupalPostForm('node/' . $node
->id() . '/edit', $edit, t('Save'));
$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');
$this
->assertPattern('/<input .* id="edit-menu-title" .* maxlength="' . $title_max_length . '" .* \\/>/');
$this
->assertPattern('/<input .* id="edit-menu-description" .* maxlength="' . $description_max_length . '" .* \\/>/');
$link_id = menu_ui_get_menu_link_defaults($node)['entity_id'];
$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 = [
'menu[enabled]' => FALSE,
];
$this
->drupalPostForm('node/' . $node
->id() . '/edit', $edit, t('Save'));
$this
->drupalGet('test-page');
$this
->assertSession()
->linkNotExists($node_title);
$item = MenuLinkContent::create([
'link' => [
[
'uri' => 'entity:node/' . $node
->id(),
],
],
'title' => $this
->randomMachineName(16),
'menu_name' => 'admin',
]);
$item
->save();
$this
->drupalGet('node/' . $node
->id() . '/edit');
$this
->assertText('Provide a menu link', 'Link in not allowed menu not shown in node edit form');
$this
->drupalPostForm('node/' . $node
->id() . '/edit', $edit, t('Save'));
$link = MenuLinkContent::load($item
->id());
$this
->assertInstanceOf(MenuLinkContent::class, $link);
$item->menu_name->value = 'tools';
$item
->save();
$child_node = $this
->drupalCreateNode([
'type' => 'article',
]);
$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();
$this
->drupalGet('node/' . $node
->id() . '/edit');
$this
->assertNoOption('edit-menu-menu-parent', 'tools:' . $item
->getPluginId());
$this
->assertNoOption('edit-menu-menu-parent', 'tools:' . $child_item
->getPluginId());
$this
->assertNoOption('edit-menu-menu-parent', 'admin:');
}
public function testMultilingualMenuNodeFormWidget() {
$langcodes = [
'de',
];
foreach ($langcodes as $langcode) {
ConfigurableLanguage::createFromLangcode($langcode)
->save();
}
array_unshift($langcodes, \Drupal::languageManager()
->getDefaultLanguage()
->getId());
$config = \Drupal::service('config.factory')
->getEditable('language.negotiation');
$config
->set('url.source', 'path_prefix');
$config
->set('url.prefixes.' . $langcodes[0], $langcodes[0]);
$config
->save();
$this
->rebuildContainer();
$languages = [];
foreach ($langcodes as $langcode) {
$languages[$langcode] = ConfigurableLanguage::load($langcode);
}
$this
->drupalLogout();
$this
->drupalLogin($this->rootUser);
$edit = [
'entity_types[node]' => TRUE,
'entity_types[menu_link_content]' => TRUE,
'settings[node][page][settings][language][language_alterable]' => TRUE,
'settings[node][page][translatable]' => TRUE,
'settings[node][page][fields][title]' => TRUE,
'settings[menu_link_content][menu_link_content][translatable]' => TRUE,
];
$this
->drupalPostForm('admin/config/regional/content-language', $edit, t('Save configuration'));
$this
->drupalLogout();
$this
->drupalLogin($this->editor);
$node_title = $this
->randomMachineName(8);
$node = Node::create([
'type' => 'page',
'title' => $node_title,
'body' => $this
->randomMachineName(16),
'uid' => $this->editor
->id(),
'status' => 1,
'langcode' => $langcodes[0],
]);
$node
->save();
$translated_node_title = $this
->randomMachineName(8);
$node
->addTranslation($langcodes[1], [
'title' => $translated_node_title,
'body' => $this
->randomMachineName(16),
'status' => 1,
]);
$node
->save();
$edit = [
'menu[enabled]' => 1,
'menu[title]' => $node_title,
'menu[weight]' => 17,
];
$options = [
'language' => $languages[$langcodes[0]],
];
$url = $node
->toUrl('edit-form', $options);
$this
->drupalPostForm($url, $edit, t('Save') . ' ' . t('(this translation)'));
$edit = [
'menu[enabled]' => 1,
'menu[title]' => $translated_node_title,
'menu[weight]' => 17,
];
$options = [
'language' => $languages[$langcodes[1]],
];
$url = $node
->toUrl('edit-form', $options);
$this
->drupalPostForm($url, $edit, t('Save') . ' ' . t('(this translation)'));
$this
->drupalGet('node/' . $node
->id(), [
'language' => $languages[$langcodes[0]],
]);
$this
->assertSession()
->linkExists($node_title);
$this
->drupalGet('node/' . $node
->id(), [
'language' => $languages[$langcodes[1]],
]);
$this
->assertSession()
->linkExists($translated_node_title);
$options = [
'language' => $languages[$langcodes[0]],
];
$url = $node
->toUrl('edit-form', $options);
$this
->drupalGet($url);
$this
->assertFieldById('edit-menu-title', $node_title);
$this
->drupalPostForm(NULL, [], t('Save') . ' ' . t('(this translation)'));
$options = [
'language' => $languages[$langcodes[1]],
];
$url = $node
->toUrl('edit-form', $options);
$this
->drupalGet($url);
$this
->assertFieldById('edit-menu-title', $translated_node_title);
}
}