1<?php 2 3namespace Drupal\KernelTests\Core\Menu; 4 5use Drupal\Core\Menu\MenuLinkTreeElement; 6use Drupal\Core\Menu\MenuTreeParameters; 7use Drupal\KernelTests\KernelTestBase; 8use Drupal\Tests\Core\Menu\MenuLinkMock; 9 10/** 11 * Tests the menu link tree. 12 * 13 * @group Menu 14 * 15 * @see \Drupal\Core\Menu\MenuLinkTree 16 */ 17class MenuLinkTreeTest extends KernelTestBase { 18 19 /** 20 * The tested menu link tree. 21 * 22 * @var \Drupal\Core\Menu\MenuLinkTree 23 */ 24 protected $linkTree; 25 26 /** 27 * The menu link plugin manager. 28 * 29 * @var \Drupal\Core\Menu\MenuLinkManagerInterface 30 */ 31 protected $menuLinkManager; 32 33 /** 34 * Modules to enable. 35 * 36 * @var array 37 */ 38 public static $modules = [ 39 'system', 40 'menu_test', 41 'menu_link_content', 42 'field', 43 'link', 44 'user', 45 ]; 46 47 /** 48 * {@inheritdoc} 49 */ 50 protected function setUp() { 51 parent::setUp(); 52 \Drupal::service('router.builder')->rebuild(); 53 $this->installEntitySchema('user'); 54 $this->installEntitySchema('menu_link_content'); 55 56 $this->linkTree = $this->container->get('menu.link_tree'); 57 $this->menuLinkManager = $this->container->get('plugin.manager.menu.link'); 58 } 59 60 /** 61 * Tests deleting all the links in a menu. 62 */ 63 public function testDeleteLinksInMenu() { 64 \Drupal::entityTypeManager()->getStorage('menu')->create(['id' => 'menu1'])->save(); 65 \Drupal::entityTypeManager()->getStorage('menu')->create(['id' => 'menu2'])->save(); 66 67 \Drupal::entityTypeManager()->getStorage('menu_link_content')->create(['link' => ['uri' => 'internal:/menu_name_test'], 'menu_name' => 'menu1', 'bundle' => 'menu_link_content', 'title' => 'Link test'])->save(); 68 \Drupal::entityTypeManager()->getStorage('menu_link_content')->create(['link' => ['uri' => 'internal:/menu_name_test'], 'menu_name' => 'menu1', 'bundle' => 'menu_link_content', 'title' => 'Link test'])->save(); 69 \Drupal::entityTypeManager()->getStorage('menu_link_content')->create(['link' => ['uri' => 'internal:/menu_name_test'], 'menu_name' => 'menu2', 'bundle' => 'menu_link_content', 'title' => 'Link test'])->save(); 70 71 $output = $this->linkTree->load('menu1', new MenuTreeParameters()); 72 $this->assertCount(2, $output); 73 $output = $this->linkTree->load('menu2', new MenuTreeParameters()); 74 $this->assertCount(1, $output); 75 76 $this->menuLinkManager->deleteLinksInMenu('menu1'); 77 78 $output = $this->linkTree->load('menu1', new MenuTreeParameters()); 79 $this->assertCount(0, $output); 80 81 $output = $this->linkTree->load('menu2', new MenuTreeParameters()); 82 $this->assertCount(1, $output); 83 } 84 85 /** 86 * Tests creating links with an expected tree structure. 87 */ 88 public function testCreateLinksInMenu() { 89 // This creates a tree with the following structure: 90 // - 1 91 // - 2 92 // - 3 93 // - 4 94 // - 5 95 // - 7 96 // - 6 97 // - 8 98 // With link 6 being the only external link. 99 100 $links = [ 101 1 => MenuLinkMock::create(['id' => 'test.example1', 'route_name' => 'example1', 'title' => 'foo', 'parent' => '']), 102 2 => MenuLinkMock::create(['id' => 'test.example2', 'route_name' => 'example2', 'title' => 'bar', 'parent' => 'test.example1', 'route_parameters' => ['foo' => 'bar']]), 103 3 => MenuLinkMock::create(['id' => 'test.example3', 'route_name' => 'example3', 'title' => 'baz', 'parent' => 'test.example2', 'route_parameters' => ['baz' => 'qux']]), 104 4 => MenuLinkMock::create(['id' => 'test.example4', 'route_name' => 'example4', 'title' => 'qux', 'parent' => 'test.example3']), 105 5 => MenuLinkMock::create(['id' => 'test.example5', 'route_name' => 'example5', 'title' => 'foofoo', 'parent' => '']), 106 6 => MenuLinkMock::create(['id' => 'test.example6', 'route_name' => '', 'url' => 'https://www.drupal.org/', 'title' => 'barbar', 'parent' => '']), 107 7 => MenuLinkMock::create(['id' => 'test.example7', 'route_name' => 'example7', 'title' => 'bazbaz', 'parent' => '']), 108 8 => MenuLinkMock::create(['id' => 'test.example8', 'route_name' => 'example8', 'title' => 'quxqux', 'parent' => '']), 109 ]; 110 foreach ($links as $instance) { 111 $this->menuLinkManager->addDefinition($instance->getPluginId(), $instance->getPluginDefinition()); 112 } 113 $parameters = new MenuTreeParameters(); 114 $tree = $this->linkTree->load('mock', $parameters); 115 116 $count = function (array $tree) { 117 $sum = function ($carry, MenuLinkTreeElement $item) { 118 return $carry + $item->count(); 119 }; 120 return array_reduce($tree, $sum); 121 }; 122 123 $this->assertEqual($count($tree), 8); 124 $parameters = new MenuTreeParameters(); 125 $parameters->setRoot('test.example2'); 126 $tree = $this->linkTree->load($instance->getMenuName(), $parameters); 127 $top_link = reset($tree); 128 $this->assertCount(1, $top_link->subtree); 129 $child = reset($top_link->subtree); 130 $this->assertEqual($child->link->getPluginId(), $links[3]->getPluginId()); 131 $height = $this->linkTree->getSubtreeHeight('test.example2'); 132 $this->assertEqual($height, 3); 133 } 134 135} 136