function MenuUiNodeTest::testMultilingualMenuNodeFormWidget

Same name and namespace in other branches
  1. 9 core/modules/menu_ui/tests/src/Functional/MenuUiNodeTest.php \Drupal\Tests\menu_ui\Functional\MenuUiNodeTest::testMultilingualMenuNodeFormWidget()
  2. 10 core/modules/menu_ui/tests/src/Functional/MenuUiNodeTest.php \Drupal\Tests\menu_ui\Functional\MenuUiNodeTest::testMultilingualMenuNodeFormWidget()
  3. 11.x core/modules/menu_ui/tests/src/Functional/MenuUiNodeTest.php \Drupal\Tests\menu_ui\Functional\MenuUiNodeTest::testMultilingualMenuNodeFormWidget()

Testing correct loading and saving of menu links via node form widget in a multilingual environment.

File

core/modules/menu_ui/tests/src/Functional/MenuUiNodeTest.php, line 264

Class

MenuUiNodeTest
Add, edit, and delete a node with menu link.

Namespace

Drupal\Tests\menu_ui\Functional

Code

public function testMultilingualMenuNodeFormWidget() {
    // Setup languages.
    $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');
    // Ensure path prefix is used to determine the language.
    $config->set('url.source', 'path_prefix');
    // Ensure that there's a path prefix set for english as well.
    $config->set('url.prefixes.' . $langcodes[0], $langcodes[0]);
    $config->save();
    $this->rebuildContainer();
    $languages = [];
    foreach ($langcodes as $langcode) {
        $languages[$langcode] = ConfigurableLanguage::load($langcode);
    }
    // Use a UI form submission to make the node type and menu link content entity translatable.
    $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'));
    // Log out and back in as normal user.
    $this->drupalLogout();
    $this->drupalLogin($this->editor);
    // Create a node.
    $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();
    // Create translation.
    $translated_node_title = $this->randomMachineName(8);
    $node->addTranslation($langcodes[1], [
        'title' => $translated_node_title,
        'body' => $this->randomMachineName(16),
        'status' => 1,
    ]);
    $node->save();
    // Edit the node and create a menu link.
    $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 the node in a different language and translate the menu link.
    $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)'));
    // Assert that the original link exists in the frontend.
    $this->drupalGet('node/' . $node->id(), [
        'language' => $languages[$langcodes[0]],
    ]);
    $this->assertSession()
        ->linkExists($node_title);
    // Assert that the translated link exists in the frontend.
    $this->drupalGet('node/' . $node->id(), [
        'language' => $languages[$langcodes[1]],
    ]);
    $this->assertSession()
        ->linkExists($translated_node_title);
    // Revisit the edit page in original language, check the loaded menu item title and save.
    $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)'));
    // Revisit the edit page of the translation and check the loaded menu item title.
    $options = [
        'language' => $languages[$langcodes[1]],
    ];
    $url = $node->toUrl('edit-form', $options);
    $this->drupalGet($url);
    $this->assertFieldById('edit-menu-title', $translated_node_title);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.