You are here

public function MenuLinkContentDeriverTest::testRediscover in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/modules/menu_link_content/src/Tests/MenuLinkContentDeriverTest.php \Drupal\menu_link_content\Tests\MenuLinkContentDeriverTest::testRediscover()

Tests the rediscovering.

File

core/modules/menu_link_content/src/Tests/MenuLinkContentDeriverTest.php, line 42
Contains \Drupal\menu_link_content\Tests\MenuLinkContentDeriverTest.

Class

MenuLinkContentDeriverTest
Tests the menu link content deriver.

Namespace

Drupal\menu_link_content\Tests

Code

public function testRediscover() {
  \Drupal::state()
    ->set('menu_link_content_dynamic_route.routes', [
    'route_name_1' => new Route('/example-path'),
  ]);
  \Drupal::service('router.builder')
    ->rebuild();

  // Set up a custom menu link pointing to a specific path.
  $parent = MenuLinkContent::create([
    'title' => '<script>alert("Welcome to the discovered jungle!")</script>',
    'link' => [
      [
        'uri' => 'internal:/example-path',
      ],
    ],
    'menu_name' => 'tools',
  ]);
  $parent
    ->save();
  $menu_tree = \Drupal::menuTree()
    ->load('tools', new MenuTreeParameters());
  $this
    ->assertEqual(1, count($menu_tree));

  /** @var \Drupal\Core\Menu\MenuLinkTreeElement $tree_element */
  $tree_element = reset($menu_tree);
  $this
    ->assertEqual('route_name_1', $tree_element->link
    ->getRouteName());

  // Change the underlying route and trigger the rediscovering.
  \Drupal::state()
    ->set('menu_link_content_dynamic_route.routes', [
    'route_name_2' => new Route('/example-path'),
  ]);
  \Drupal::service('router.builder')
    ->rebuild();

  // Ensure that the new route name / parameters are captured by the tree.
  $menu_tree = \Drupal::menuTree()
    ->load('tools', new MenuTreeParameters());
  $this
    ->assertEqual(1, count($menu_tree));

  /** @var \Drupal\Core\Menu\MenuLinkTreeElement $tree_element */
  $tree_element = reset($menu_tree);
  $this
    ->assertEqual('route_name_2', $tree_element->link
    ->getRouteName());
  $title = $tree_element->link
    ->getTitle();
  $this
    ->assertFalse($title instanceof TranslatableMarkup);
  $this
    ->assertIdentical('<script>alert("Welcome to the discovered jungle!")</script>', $title);
  $this
    ->assertFalse(SafeMarkup::isSafe($title));

  // Create a hierarchy.
  \Drupal::state()
    ->set('menu_link_content_dynamic_route.routes', [
    'route_name_1' => new Route('/example-path'),
    'route_name_2' => new Route('/example-path/child'),
  ]);
  $child = MenuLinkContent::create([
    'title' => 'Child',
    'link' => [
      [
        'uri' => 'entity:/example-path/child',
      ],
    ],
    'menu_name' => 'tools',
    'parent' => 'menu_link_content:' . $parent
      ->uuid(),
  ]);
  $child
    ->save();
  $parent
    ->set('link', [
    [
      'uri' => 'entity:/example-path',
    ],
  ]);
  $parent
    ->save();
  $menu_tree = \Drupal::menuTree()
    ->load('tools', new MenuTreeParameters());
  $this
    ->assertEqual(1, count($menu_tree));

  /** @var \Drupal\Core\Menu\MenuLinkTreeElement $tree_element */
  $tree_element = reset($menu_tree);
  $this
    ->assertTrue($tree_element->hasChildren);
  $this
    ->assertEqual(1, count($tree_element->subtree));

  // Edit child element link to use 'internal' instead of 'entity'.
  $child
    ->set('link', [
    [
      'uri' => 'internal:/example-path/child',
    ],
  ]);
  $child
    ->save();
  \Drupal::service('plugin.manager.menu.link')
    ->rebuild();
  $menu_tree = \Drupal::menuTree()
    ->load('tools', new MenuTreeParameters());
  $this
    ->assertEqual(1, count($menu_tree));

  /** @var \Drupal\Core\Menu\MenuLinkTreeElement $tree_element */
  $tree_element = reset($menu_tree);
  $this
    ->assertTrue($tree_element->hasChildren);
  $this
    ->assertEqual(1, count($tree_element->subtree));
}