View source  
  <?php
namespace Drupal\Tests\menu_ui\FunctionalJavascript;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\system\Entity\Menu;
use Drupal\system\MenuStorage;
use Drupal\Tests\contextual\FunctionalJavascript\ContextualLinkClickTrait;
use Drupal\Tests\menu_ui\Traits\MenuUiTrait;
class MenuUiJavascriptTest extends WebDriverTestBase {
  use ContextualLinkClickTrait;
  use MenuUiTrait;
  
  protected static $modules = [
    'block',
    'contextual',
    'menu_link_content',
    'menu_ui',
    'test_page_test',
  ];
  
  protected $defaultTheme = 'stark';
  
  public function testBlockContextualLinks() {
    $this
      ->drupalLogin($this
      ->drupalCreateUser([
      'administer menu',
      'access contextual links',
      'administer blocks',
    ]));
    $menu = $this
      ->addCustomMenu();
    $block = $this
      ->drupalPlaceBlock('system_menu_block:' . $menu
      ->id(), [
      'label' => 'Custom menu',
      'provider' => 'system',
    ]);
    $this
      ->addMenuLink('', '/', $menu
      ->id());
    $this
      ->drupalGet('test-page');
    
    $this
      ->clickContextualLink("#block-{$block->id()}", 'Configure block');
    
    $this
      ->assertNotEmpty($this
      ->getSession()
      ->getPage()
      ->findLink('Remove block'));
    $this
      ->drupalGet('test-page');
    
    $this
      ->clickContextualLink("#block-{$block->id()}", 'Edit menu');
    
    $this
      ->assertSession()
      ->pageTextContains("Machine name: {$menu->id()}");
  }
  
  protected function addCustomMenu() {
    
    $label = $this
      ->randomMachineName(16);
    $menu_id = strtolower($this
      ->randomMachineName(MenuStorage::MAX_ID_LENGTH + 1));
    $this
      ->drupalGet('admin/structure/menu/add');
    $page = $this
      ->getSession()
      ->getPage();
    
    $page
      ->fillField('Title', $label);
    
    $this
      ->assertSession()
      ->waitForElementVisible('css', 'button[type=button].link:contains(Edit)');
    
    $page
      ->pressButton('Edit');
    
    $page
      ->fillField('Menu name', $menu_id);
    $page
      ->pressButton('Save');
    
    $menu = Menu::load(substr($menu_id, 0, MenuStorage::MAX_ID_LENGTH));
    $this
      ->assertEquals($label, $menu
      ->label());
    
    $this
      ->drupalGet('admin/structure/menu');
    $this
      ->assertSession()
      ->pageTextContains($label);
    
    $this
      ->drupalGet('admin/structure/block/list/' . $this
      ->config('system.theme')
      ->get('default'));
    $this
      ->clickLink('Place block');
    
    $this
      ->assertSession()
      ->waitForElement('css', "div[aria-describedby=drupal-modal]");
    
    $this
      ->assertSession()
      ->pageTextContains($label);
    return $menu;
  }
  
  protected function addMenuLink($parent = '', $path = '/', $menu_id = 'tools', $expanded = FALSE, $weight = '0') {
    
    $this
      ->drupalGet("admin/structure/menu/manage/{$menu_id}/add");
    $title = '!link_' . $this
      ->randomMachineName(16);
    $edit = [
      'link[0][uri]' => $path,
      'title[0][value]' => $title,
      'description[0][value]' => '',
      'enabled[value]' => 1,
      'expanded[value]' => $expanded,
      'menu_parent' => $menu_id . ':' . $parent,
      'weight[0][value]' => $weight,
    ];
    
    $this
      ->drupalPostForm(NULL, $edit, 'Save');
    $this
      ->assertSession()
      ->pageTextContains('The menu link has been saved.');
    $storage = $this->container
      ->get('entity_type.manager')
      ->getStorage('menu_link_content');
    $menu_links = $storage
      ->loadByProperties([
      'title' => $title,
    ]);
    $menu_link = reset($menu_links);
    
    $this
      ->assertNotNull($menu_link);
    $this
      ->assertMenuLink([
      'menu_name' => $menu_id,
      'children' => [],
      'parent' => $parent,
    ], $menu_link
      ->getPluginId());
    return $menu_link;
  }
}