treeStorage = new MenuTreeStorage($this->container->get('database'), $this->container->get('cache.menu'), $this->container->get('cache_tags.invalidator'), 'menu_tree'); $this->connection = $this->container->get('database'); } /** * Tests the tree storage when no tree was built yet. */ public function testBasicMethods() { $this->doTestEmptyStorage(); $this->doTestTable(); } /** * Ensures that there are no menu links by default. */ protected function doTestEmptyStorage() { $this->assertEqual(0, $this->treeStorage->countMenuLinks()); } /** * Ensures that table gets created on the fly. */ protected function doTestTable() { // Test that we can create a tree storage with an arbitrary table name and // that selecting from the storage creates the table. $tree_storage = new MenuTreeStorage($this->container->get('database'), $this->container->get('cache.menu'), $this->container->get('cache_tags.invalidator'), 'test_menu_tree'); $this->assertFalse($this->connection->schema()->tableExists('test_menu_tree'), 'Test table is not yet created'); $tree_storage->countMenuLinks(); $this->assertTrue($this->connection->schema()->tableExists('test_menu_tree'), 'Test table was created'); } /** * Tests with a simple linear hierarchy. */ public function testSimpleHierarchy() { // Add some links with parent on the previous one and test some values. // // - test1 // -- test2 // --- test3 $this->addMenuLink('test1', ''); $this->assertMenuLink('test1', ['has_children' => 0, 'depth' => 1]); $this->addMenuLink('test2', 'test1'); $this->assertMenuLink('test1', ['has_children' => 1, 'depth' => 1], [], ['test2']); $this->assertMenuLink('test2', ['has_children' => 0, 'depth' => 2], ['test1']); $this->addMenuLink('test3', 'test2'); $this->assertMenuLink('test1', ['has_children' => 1, 'depth' => 1], [], ['test2', 'test3']); $this->assertMenuLink('test2', ['has_children' => 1, 'depth' => 2], ['test1'], ['test3']); $this->assertMenuLink('test3', ['has_children' => 0, 'depth' => 3], ['test2', 'test1']); } /** * Tests the tree with moving links inside the hierarchy. */ public function testMenuLinkMoving() { // Before the move. // // - test1 // -- test2 // --- test3 // - test4 // -- test5 // --- test6 $this->addMenuLink('test1', ''); $this->addMenuLink('test2', 'test1'); $this->addMenuLink('test3', 'test2'); $this->addMenuLink('test4', ''); $this->addMenuLink('test5', 'test4'); $this->addMenuLink('test6', 'test5'); $this->assertMenuLink('test1', ['has_children' => 1, 'depth' => 1], [], ['test2', 'test3']); $this->assertMenuLink('test2', ['has_children' => 1, 'depth' => 2], ['test1'], ['test3']); $this->assertMenuLink('test4', ['has_children' => 1, 'depth' => 1], [], ['test5', 'test6']); $this->assertMenuLink('test5', ['has_children' => 1, 'depth' => 2], ['test4'], ['test6']); $this->assertMenuLink('test6', ['has_children' => 0, 'depth' => 3], ['test5', 'test4']); $this->moveMenuLink('test2', 'test5'); // After the 1st move. // // - test1 // - test4 // -- test5 // --- test2 // ---- test3 // --- test6 $this->assertMenuLink('test1', ['has_children' => 0, 'depth' => 1]); $this->assertMenuLink('test2', ['has_children' => 1, 'depth' => 3], ['test5', 'test4'], ['test3']); $this->assertMenuLink('test3', ['has_children' => 0, 'depth' => 4], ['test2', 'test5', 'test4']); $this->assertMenuLink('test4', ['has_children' => 1, 'depth' => 1], [], ['test5', 'test2', 'test3', 'test6']); $this->assertMenuLink('test5', ['has_children' => 1, 'depth' => 2], ['test4'], ['test2', 'test3', 'test6']); $this->assertMenuLink('test6', ['has_children' => 0, 'depth' => 3], ['test5', 'test4']); $this->moveMenuLink('test4', 'test1'); $this->moveMenuLink('test3', 'test1'); // After the next 2 moves. // // - test1 // -- test3 // -- test4 // --- test5 // ---- test2 // ---- test6 $this->assertMenuLink('test1', ['has_children' => 1, 'depth' => 1], [], ['test4', 'test5', 'test2', 'test3', 'test6']); $this->assertMenuLink('test2', ['has_children' => 0, 'depth' => 4], ['test5', 'test4', 'test1']); $this->assertMenuLink('test3', ['has_children' => 0, 'depth' => 2], ['test1']); $this->assertMenuLink('test4', ['has_children' => 1, 'depth' => 2], ['test1'], ['test2', 'test5', 'test6']); $this->assertMenuLink('test5', ['has_children' => 1, 'depth' => 3], ['test4', 'test1'], ['test2', 'test6']); $this->assertMenuLink('test6', ['has_children' => 0, 'depth' => 4], ['test5', 'test4', 'test1']); // Deleting a link in the middle should re-attach child links to the parent. $this->treeStorage->delete('test4'); // After the delete. // // - test1 // -- test3 // -- test5 // --- test2 // --- test6 $this->assertMenuLink('test1', ['has_children' => 1, 'depth' => 1], [], ['test5', 'test2', 'test3', 'test6']); $this->assertMenuLink('test2', ['has_children' => 0, 'depth' => 3], ['test5', 'test1']); $this->assertMenuLink('test3', ['has_children' => 0, 'depth' => 2], ['test1']); $this->assertFalse($this->treeStorage->load('test4')); $this->assertMenuLink('test5', ['has_children' => 1, 'depth' => 2], ['test1'], ['test2', 'test6']); $this->assertMenuLink('test6', ['has_children' => 0, 'depth' => 3], ['test5', 'test1']); } /** * Tests with disabled child links. */ public function testMenuDisabledChildLinks() { // Add some links with parent on the previous one and test some values. // // - test1 // -- test2 (disabled) $this->addMenuLink('test1', ''); $this->assertMenuLink('test1', ['has_children' => 0, 'depth' => 1]); $this->addMenuLink('test2', 'test1', '', [], 'tools', ['enabled' => 0]); // The 1st link does not have any visible children, so has_children is 0. $this->assertMenuLink('test1', ['has_children' => 0, 'depth' => 1]); $this->assertMenuLink('test2', ['has_children' => 0, 'depth' => 2, 'enabled' => 0], ['test1']); // Add more links with parent on the previous one. //