/**
  * Responds to GET requests.
  *
  * Returns a menu tree for the specified menu name.
  *
  * @param int $menu_name
  *   The machine name of the Drupal menu.
  *
  * @return \Drupal\rest\ResourceResponse
  *   The response containing the menu tree.
  *
  * @throws \Symfony\Component\HttpKernel\Exception\HttpException
  */
 public function get($menu_name = NULL)
 {
     if ($menu_name) {
         // Get menu tree resource config, set at /admin/config/services/menutree.
         $config = \Drupal::config('menutree_resource.services_settings');
         $services_menus = $config->get('services_menus');
         // Only allow a response if the menu is in config
         if (in_array($menu_name, array_filter(array_values($services_menus)))) {
             $menu_tree = \Drupal::menuTree();
             $parameters = new MenuTreeParameters();
             $parameters->onlyEnabledLinks();
             $tree = $menu_tree->load($menu_name, $parameters);
             if (!empty($tree)) {
                 $manipulators = array(array('callable' => 'menu.default_tree_manipulators:checkAccess'), array('callable' => 'menu.default_tree_manipulators:generateIndexAndSort'));
                 $tree = $menu_tree->transform($tree, $manipulators);
                 $build = $menu_tree->build($tree);
                 // Clean the menu tree so it's ready for serialisation in a resource response.
                 $items = $this->clean_tree($build['#items']);
                 return new ResourceResponse($items);
             }
             throw new NotFoundHttpException(t('Menu with name @menu_name was not found', array('@menu_name' => $menu_name)));
         }
         throw new NotFoundHttpException(t('Menu tree @menu_name not allowed.', array('@menu_name' => $menu_name)));
     }
     throw new HttpException(t('No menu name was provided'));
 }
 /**
  * Tests the loadTreeData method.
  */
 public function testLoadTree()
 {
     $this->addMenuLink('test1', '');
     $this->addMenuLink('test2', 'test1');
     $this->addMenuLink('test3', 'test2');
     $this->addMenuLink('test4');
     $this->addMenuLink('test5', 'test4');
     $data = $this->treeStorage->loadTreeData('tools', new MenuTreeParameters());
     $tree = $data['tree'];
     $this->assertEqual(count($tree['test1']['subtree']), 1);
     $this->assertEqual(count($tree['test1']['subtree']['test2']['subtree']), 1);
     $this->assertEqual(count($tree['test1']['subtree']['test2']['subtree']['test3']['subtree']), 0);
     $this->assertEqual(count($tree['test4']['subtree']), 1);
     $this->assertEqual(count($tree['test4']['subtree']['test5']['subtree']), 0);
     $parameters = new MenuTreeParameters();
     $parameters->setActiveTrail(array('test4', 'test5'));
     $data = $this->treeStorage->loadTreeData('tools', $parameters);
     $tree = $data['tree'];
     $this->assertEqual(count($tree['test1']['subtree']), 1);
     $this->assertFalse($tree['test1']['in_active_trail']);
     $this->assertEqual(count($tree['test1']['subtree']['test2']['subtree']), 1);
     $this->assertFalse($tree['test1']['subtree']['test2']['in_active_trail']);
     $this->assertEqual(count($tree['test1']['subtree']['test2']['subtree']['test3']['subtree']), 0);
     $this->assertFalse($tree['test1']['subtree']['test2']['subtree']['test3']['in_active_trail']);
     $this->assertEqual(count($tree['test4']['subtree']), 1);
     $this->assertTrue($tree['test4']['in_active_trail']);
     $this->assertEqual(count($tree['test4']['subtree']['test5']['subtree']), 0);
     $this->assertTrue($tree['test4']['subtree']['test5']['in_active_trail']);
     // Add some conditions to ensure that conditions work as expected.
     $parameters = new MenuTreeParameters();
     $parameters->addCondition('parent', 'test1');
     $data = $this->treeStorage->loadTreeData('tools', $parameters);
     $this->assertEqual(count($data['tree']), 1);
     $this->assertEqual($data['tree']['test2']['definition']['id'], 'test2');
     $this->assertEqual($data['tree']['test2']['subtree'], []);
     // Test for only enabled links.
     $link = $this->treeStorage->load('test3');
     $link['enabled'] = FALSE;
     $this->treeStorage->save($link);
     $link = $this->treeStorage->load('test4');
     $link['enabled'] = FALSE;
     $this->treeStorage->save($link);
     $link = $this->treeStorage->load('test5');
     $link['enabled'] = FALSE;
     $this->treeStorage->save($link);
     $parameters = new MenuTreeParameters();
     $parameters->onlyEnabledLinks();
     $data = $this->treeStorage->loadTreeData('tools', $parameters);
     $this->assertEqual(count($data['tree']), 1);
     $this->assertEqual($data['tree']['test1']['definition']['id'], 'test1');
     $this->assertEqual(count($data['tree']['test1']['subtree']), 1);
     $this->assertEqual($data['tree']['test1']['subtree']['test2']['definition']['id'], 'test2');
     $this->assertEqual($data['tree']['test1']['subtree']['test2']['subtree'], []);
 }
 /**
  * Tests onlyEnabledLinks().
  *
  * @covers ::onlyEnabledLinks
  */
 public function testOnlyEnabledLinks()
 {
     $parameters = new MenuTreeParameters();
     $parameters->onlyEnabledLinks();
     $this->assertEquals(1, $parameters->conditions['enabled']);
 }