/* vim: set ts=2 et sw=2 cindent fo=qroca: */
package com.globant.katari.menu.classic.application;
import static org.easymock.EasyMock.createNiceMock;
import java.util.List;
import java.util.LinkedList;
import junit.framework.TestCase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.globant.katari.core.security.MenuAccessFilterer;
import com.globant.katari.core.web.MenuBar;
import com.globant.katari.core.web.MenuNode;
import com.globant.katari.core.security.SecureUrlAccessHelper;
/* Test case for the menu bar component
*/
public class MenuDisplayHelperTest extends TestCase {
private static Logger log = LoggerFactory.getLogger(MenuDisplayHelperTest.class);
private MenuBar menuBar;
private MenuAccessFilterer filterer;
@Override
public void setUp() {
menuBar = new MenuBar("root", "root");
// create child nodes
/* root 0 */
/* / \ */
/* a b 1 */
/* / \ / | \ */
/* a b a bb b 2 */
/* / / | / \ */
/* a a ba b 3 */
MenuNode a = new MenuNode(menuBar, "a", "a", 0, null);
MenuNode b = new MenuNode(menuBar, "b", "b", 0, null);
MenuNode a_a = new MenuNode(a, "a", "a", 0, null);
MenuNode a_b = new MenuNode(a, "b", "b", 0, null);
new MenuNode(b, "a", "a", 0, null, "link_b_a");
MenuNode b_bb = new MenuNode(b, "bb", "bb", 0, null);
MenuNode b_b = new MenuNode(b, "b", "b", 0, null);
new MenuNode(a_a, "a", "a", 0, null, "link_a_a");
new MenuNode(a_b, "a", "a", 0, null, "link_a_b");
new MenuNode(b_bb, "b", "b", 0, null, "link_b_bb_b");
new MenuNode(b_b, "a", "a", 0, null, "link_b_b_a");
new MenuNode(b_b, "b", "b", 0, null, "link_b_b_b");
SecureUrlAccessHelper helper = createNiceMock(SecureUrlAccessHelper.class);
filterer = new MenuAccessFilterer(helper) {
public List<MenuNode> filterMenuNodes(final List<MenuNode> nodes) {
return nodes;
}
};
}
public void testGetMenuNodesForLevel() {
MenuDisplayHelper helper;
helper = new MenuDisplayHelper(menuBar, "/root/a/b/a", filterer);
List<MenuNodeDisplay> nodes;
nodes = helper.getMenuNodesForLevel(2);
assertEquals(2, nodes.size());
assertTrue(!nodes.get(0).isSelected());
assertTrue(nodes.get(1).isSelected());
helper = new MenuDisplayHelper(menuBar, "/root/b/bb/a", filterer);
nodes = helper.getMenuNodesForLevel(2);
assertEquals(3, nodes.size());
assertTrue(!nodes.get(0).isSelected());
assertEquals("a", nodes.get(0).getMenuNode().getName());
assertTrue(nodes.get(1).isSelected());
assertEquals("bb", nodes.get(1).getMenuNode().getName());
assertTrue(!nodes.get(2).isSelected());
assertEquals("b", nodes.get(2).getMenuNode().getName());
helper = new MenuDisplayHelper(menuBar, "/root/a/b/a", filterer);
nodes = helper.getMenuNodesForLevel(3);
assertEquals(1, nodes.size());
assertTrue(nodes.get(0).isSelected());
assertEquals("a", nodes.get(0).getMenuNode().getName());
assertEquals("/root/a/b/a", nodes.get(0).getMenuNode().getPath());
}
public void testGetMenuNodesForLevel_onleaf() {
MenuDisplayHelper helper;
helper = new MenuDisplayHelper(menuBar, "/root/a/b/a", filterer);
helper.getMenuNodesForLevel(4);
}
public void testGetMenuNodesForPath() {
MenuDisplayHelper helper;
helper = new MenuDisplayHelper(menuBar, "/root/b/b", filterer);
List<MenuNodeDisplay> nodes;
nodes = helper.getMenuNodesForCurrentPath();
assertEquals(2, nodes.size());
assertEquals("a", nodes.get(0).getMenuNode().getName());
assertEquals("b", nodes.get(1).getMenuNode().getName());
}
/* Tests what happens if the first child node is not accessible. The link of
* the parent node should not point to the non accesible url.
*/
public void testListPath_firstWithoutPermission() {
// Simulates that the node /b/a is not accessible.
SecureUrlAccessHelper accessHelper;
accessHelper = createNiceMock(SecureUrlAccessHelper.class);
filterer = new MenuAccessFilterer(accessHelper) {
public List<MenuNode> filterMenuNodes(final List<MenuNode> nodes) {
log.trace("Entering filterMenuNodes");
List<MenuNode> result = new LinkedList<MenuNode>();
for (MenuNode node : nodes) {
if (!node.getPath().equals("/root/b/b/a")) {
log.debug("Adding " + node.getPath());
result.add(node);
} else {
log.debug("Skipping " + node.getPath());
}
}
log.trace("Leaving filterMenuNodes");
return result;
}
};
MenuDisplayHelper helper;
helper = new MenuDisplayHelper(menuBar, "/root/b/bb/b", filterer);
List<MenuNodeDisplay> nodes;
nodes = helper.getMenuNodesForLevel(2);
assertEquals(3, nodes.size());
assertTrue(!nodes.get(0).isSelected());
assertEquals("a", nodes.get(0).getMenuNode().getName());
assertTrue(nodes.get(1).isSelected());
assertEquals("bb", nodes.get(1).getMenuNode().getName());
assertTrue(!nodes.get(2).isSelected());
assertEquals("b", nodes.get(2).getMenuNode().getName());
assertEquals("link_b_b_b", nodes.get(2).getLinkPath());
}
/* Tests that a non-leaf nodes with no accessible descendents is eliminated
* from the list of displayable menus.
*/
public void testGetMenuNodesForLevel_noAccessibleDescendants() {
// Simulates that the node /b/a is not accessible.
SecureUrlAccessHelper accessHelper;
accessHelper = createNiceMock(SecureUrlAccessHelper.class);
filterer = new MenuAccessFilterer(accessHelper) {
public List<MenuNode> filterMenuNodes(final List<MenuNode> nodes) {
log.trace("Entering filterMenuNodes");
List<MenuNode> result = new LinkedList<MenuNode>();
for (MenuNode node : nodes) {
if (!node.getPath().equals("/root/b/b/a")
&& !node.getPath().equals("/root/b/b/b")) {
log.debug("Adding " + node.getPath());
result.add(node);
} else {
log.debug("Skipping " + node.getPath());
}
}
log.trace("Leaving filterMenuNodes");
return result;
}
};
MenuDisplayHelper helper;
helper = new MenuDisplayHelper(menuBar, "/root/b/bb/b", filterer);
List<MenuNodeDisplay> nodes;
nodes = helper.getMenuNodesForLevel(2);
assertEquals(3, nodes.size());
assertTrue(!nodes.get(0).isSelected());
assertEquals("a", nodes.get(0).getMenuNode().getName());
assertTrue(nodes.get(1).isSelected());
assertEquals("bb", nodes.get(1).getMenuNode().getName());
assertTrue(!nodes.get(2).isSelected());
assertEquals("b", nodes.get(2).getMenuNode().getName());
// We are testing if the link path is empty here, because the node does not
// have accessible descendants.
assertEquals("/module/classic-menu/menu.do", nodes.get(2).getLinkPath());
}
}