/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.gatein.api.navigation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import org.gatein.api.AbstractApiTest;
import org.gatein.api.EntityAlreadyExistsException;
import org.gatein.api.EntityNotFoundException;
import org.gatein.api.SerializationUtils;
import org.gatein.api.common.i18n.LocalizedString;
import org.gatein.api.site.SiteId;
import org.junit.Before;
import org.junit.Test;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/
public class NavigationImplTest extends AbstractApiTest {
private Navigation navigation;
@Test
public void addChild() {
createNavigationChildren();
Node root = navigation.getRootNode(Nodes.visitAll());
Node node = root.addChild("parent2");
assertNotNull(root.getChild("parent2"));
navigation.saveNode(node);
root = navigation.getRootNode(Nodes.visitAll());
assertNotNull(root.getChild("parent2"));
}
@Test(expected = EntityAlreadyExistsException.class)
public void addChildExisting() {
createNavigationChildren();
Node node = navigation.getRootNode(Nodes.visitAll());
node.getChild("parent").addChild("child");
}
@Test(expected = IllegalStateException.class)
public void addChildNotExpanded() {
createNavigationChildren();
Node node = navigation.getRootNode(Nodes.visitChildren());
node.getChild("parent").addChild("child");
}
@Before
public void before() throws Exception {
super.before();
createSite(defaultSiteId);
navigation = portal.getNavigation(defaultSiteId);
}
@Test
public void createNavigationChildren() {
Node node = navigation.getRootNode(Nodes.visitAll());
Node parent = node.addChild("parent");
parent.addChild("child");
navigation.saveNode(node);
navigation = portal.getNavigation(defaultSiteId);
node = navigation.getRootNode(Nodes.visitAll());
assertEquals(1, node.getChildCount());
assertEquals(1, node.getChild("parent").getChildCount());
assertEquals(0, node.getChild("parent").getChild("child").getChildCount());
}
@Test
public void createNavigationEmpty() {
navigation.setPriority(10);
navigation = portal.getNavigation(defaultSiteId);
assertEquals(10, navigation.getPriority());
assertEquals(defaultSiteId, navigation.getSiteId());
assertEquals(0, navigation.getRootNode(Nodes.visitAll()).getChildCount());
}
@Test
public void displayName_extended() {
Node node = navigation.getRootNode(Nodes.visitAll());
Node n = node.addChild("parent");
Map<Locale, String> m = new HashMap<Locale, String>();
m.put(Locale.ENGLISH, "extended");
m.put(Locale.FRENCH, "prolongé");
n.setDisplayNames(new LocalizedString(m));
navigation.saveNode(node);
n = navigation.getRootNode(Nodes.visitChildren()).getChild("parent");
assertNotNull(n.getDisplayNames());
assertTrue(n.getDisplayNames().isLocalized());
assertEquals("extended", n.getDisplayNames().getValue(Locale.ENGLISH));
assertEquals("prolongé", n.getDisplayNames().getValue(Locale.FRENCH));
}
@Test
public void displayName_simple() {
Node node = navigation.getRootNode(Nodes.visitAll());
Node n = node.addChild("parent");
n.setDisplayName("simple");
navigation.saveNode(n);
assertEquals("simple", n.getDisplayNames().getValue());
n = navigation.getRootNode(Nodes.visitChildren()).getChild("parent");
assertNotNull(n.getDisplayNames());
assertEquals("simple", n.getDisplayNames().getValue());
assertFalse(n.getDisplayNames().isLocalized());
}
@Test
public void displayNames() throws Exception {
Node node = navigation.getRootNode(Nodes.visitAll());
node.addChild("simple");
node.addChild("expression");
node.addChild("extended");
node.getChild("simple").setDisplayName("simple");
node.getChild("expression").setDisplayName("#{my.test.key}");
LocalizedString localizedString = new LocalizedString(Locale.ENGLISH, "english");
localizedString.setLocalizedValue(Locale.CHINA, "chinese");
node.getChild("extended").setDisplayNames(localizedString);
navigation.saveNode(node);
Node saved = navigation.getRootNode(Nodes.visitAll());
assertEquals("simple", saved.getChild("simple").getDisplayName());
Node savedExpression = saved.getChild("expression");
assertEquals("My English value", savedExpression.getDisplayName());
assertEquals(4, savedExpression.getDisplayNames().getLocalizedValues().size());
assertEquals("My English value", savedExpression.getDisplayNames().getLocalizedValue(Locale.ENGLISH).getValue());
assertEquals("My French value", savedExpression.getDisplayNames().getLocalizedValue(Locale.FRENCH).getValue());
assertEquals("My Arabic value", savedExpression.getDisplayNames().getLocalizedValue(new Locale("ar")).getValue());
assertEquals("My Vietnamese value", savedExpression.getDisplayNames().getLocalizedValue(new Locale("vi")).getValue());
assertNotNull(saved.getChild("extended").getDisplayNames());
assertEquals("english", saved.getChild("extended").getDisplayNames().getLocalizedValue(Locale.ENGLISH).getValue());
assertEquals("chinese", saved.getChild("extended").getDisplayNames().getLocalizedValue(Locale.CHINA).getValue());
}
@Test
public void getChild() {
createNavigationChildren();
Node node = navigation.getRootNode(Nodes.visitAll());
assertNotNull(node);
assertTrue(node.isChildrenLoaded());
assertTrue(node.getChild("parent").getChild("child").isChildrenLoaded());
node = navigation.getRootNode(Nodes.visitChildren());
assertNotNull(node);
assertTrue(node.isChildrenLoaded());
assertFalse(node.getChild("parent").isChildrenLoaded());
}
@Test
public void getNavigation() {
portal.getNavigation(defaultSiteId).getRootNode(Nodes.visitAll());
}
@Test
public void getNavigation_InvalidSite() {
Navigation nav = portal.getNavigation(new SiteId("invalid"));
assertNull(nav);
}
@Test(expected = IllegalArgumentException.class)
public void getNavigation_NullSiteId() {
portal.getNavigation(null);
}
@Test
public void getNode() {
createNavigationChildren();
Node node = navigation.getNode("parent", "child");
assertNotNull(node);
assertEquals("child", node.getName());
}
@Test(expected = IllegalArgumentException.class)
public void getNode_EmptyPath() {
String[] path = new String[0];
navigation.getNode(path);
}
@Test
public void getNode_Invalid_Path() {
createNavigationChildren();
Node node = navigation.getNode("foo", "child");
assertNull(node);
}
@Test(expected = IllegalArgumentException.class)
public void getNode_NullNodePath() {
navigation.getNode((NodePath) null);
}
@Test(expected = IllegalArgumentException.class)
public void getNode_NullVisitor() {
navigation.getNode(NodePath.path("parent"), null);
}
@Test
public void getNode_With_Visitor() {
createNavigationChildren();
Node node = navigation.getNode(NodePath.path("parent"), Nodes.visitNone());
assertNotNull(node);
assertFalse(node.isChildrenLoaded());
node = navigation.getNode(NodePath.path("parent"), Nodes.visitChildren());
assertTrue(node.isChildrenLoaded());
assertNotNull(node.getChild("child"));
}
@Test(expected = IllegalArgumentException.class)
public void loadNodes_NullVisitor() {
navigation.getRootNode(null);
}
@Test
public void moveNode() {
Node root = navigation.getRootNode(Nodes.visitChildren());
root.addChild("a").addChild("b").addChild("c").addChild("d");
root.addChild("e").addChild("f").addChild("g").addChild("h");
navigation.saveNode(root);
root = navigation.getRootNode(Nodes.visitAll());
Node d = root.getNode("a", "b", "c", "d");
Node h = root.getNode("e", "f", "g", "h");
navigation.refreshNode(h, Nodes.visitChildren());
d.moveTo(h);
navigation.saveNode(root);
root = navigation.getRootNode(Nodes.visitAll());
assertNull(root.getNode("a", "b", "c", "d"));
assertNotNull(root.getNode("e", "f", "g", "h", "d"));
}
@Test
public void moveNode_ReorderSaved() {
Node root = navigation.getRootNode(Nodes.visitChildren());
root.addChild("c");
root.addChild("b");
root.addChild("a");
navigation.saveNode(root);
root = navigation.getRootNode(Nodes.visitChildren());
root.getChild("a").moveTo(0);
root.getChild("c").moveTo(2);
navigation.saveNode(root);
root = navigation.getRootNode(Nodes.visitChildren());
assertEquals("a", root.getChild(0).getName());
assertEquals("b", root.getChild(1).getName());
assertEquals("c", root.getChild(2).getName());
}
@Test
public void moveNode_ReorderUnsaved() {
Node root = navigation.getRootNode(Nodes.visitChildren());
root.addChild("c");
root.addChild("b");
root.addChild("a");
root.getChild("a").moveTo(0);
root.getChild("c").moveTo(2);
navigation.saveNode(root);
root = navigation.getRootNode(Nodes.visitChildren());
assertEquals("a", root.getChild(0).getName());
assertEquals("b", root.getChild(1).getName());
assertEquals("c", root.getChild(2).getName());
}
@Test
public void refreshNode() {
createNavigationChildren();
Node nodeA = navigation.getRootNode(Nodes.visitAll());
Node nodeB = navigation.getRootNode(Nodes.visitAll());
nodeA.addChild("childA");
navigation.saveNode(nodeA);
assertNull(nodeB.getChild("childA"));
navigation.refreshNode(nodeB);
assertNotNull(nodeB.getChild("childA"));
}
@Test
public void refreshNode_LoadChildren() {
createNavigationChildren();
Node n = navigation.getRootNode(Nodes.visitChildren());
Node p = n.getChild("parent");
assertTrue(n.isChildrenLoaded());
assertFalse(p.isChildrenLoaded());
navigation.refreshNode(p, Nodes.visitChildren());
assertTrue(p.isChildrenLoaded());
}
@Test(expected = IllegalArgumentException.class)
public void refreshNode_NullNode() {
navigation.refreshNode(null);
}
@Test(expected = IllegalArgumentException.class)
public void refreshNode_NullVisitor() {
navigation.refreshNode(navigation.getNode(NodePath.path("parent"), null));
}
@Test
public void refreshNode_WithVisitor() {
createNavigationChildren();
Node nodeA = navigation.getRootNode(Nodes.visitAll());
Node nodeB = navigation.getRootNode(Nodes.visitAll());
nodeA.addChild("childA").addChild("childA-1").addChild("childA-1-1");
navigation.saveNode(nodeA);
assertNull(nodeB.getChild("childA"));
navigation.refreshNode(nodeB, Nodes.visitNodes(3));
assertNotNull(nodeB.getChild("childA"));
assertNotNull(nodeB.getChild("childA").getChild("childA-1"));
assertNotNull(nodeB.getChild("childA").getChild("childA-1").getChild("childA-1-1"));
}
@Test
public void removeNode() {
createNavigationChildren();
assertTrue(navigation.removeNode(NodePath.path("parent", "child")));
Node node = navigation.getRootNode(Nodes.visitAll());
assertEquals(0, node.getChild("parent").getChildCount());
}
@Test(expected = EntityNotFoundException.class)
public void removeNode_NodeNotFound() {
navigation.removeNode(NodePath.path("nosuch"));
}
@Test(expected = IllegalArgumentException.class)
public void removeNode_NullNode() {
navigation.removeNode(null);
}
@Test
public void saveNode() throws InterruptedException {
createNavigationChildren();
Node node = navigation.getRootNode(Nodes.visitAll());
Node parent = node.getChild("parent");
parent.addChild("child2");
assertNull(navigation.getRootNode(Nodes.visitAll()).getChild("parent").getChild("child2"));
navigation.saveNode(parent);
assertNotNull(navigation.getRootNode(Nodes.visitAll()).getChild("parent").getChild("child2"));
}
@Test
public void saveNode_Merge() {
createNavigationChildren();
Node nodeA = navigation.getRootNode(Nodes.visitAll());
Node nodeB = navigation.getRootNode(Nodes.visitAll());
nodeA.addChild("childA");
navigation.saveNode(nodeA);
nodeB.addChild("childB");
navigation.saveNode(nodeB);
Node nodeC = navigation.getRootNode(Nodes.visitAll());
assertNotNull(nodeC.getChild("childA"));
assertNotNull(nodeC.getChild("childB"));
}
@Test(expected = IllegalArgumentException.class)
public void saveNode_NullNode() {
navigation.saveNode(null);
}
@Test
public void saveNode_SaveChildSavesParent() {
createNavigationChildren();
Node node = navigation.getRootNode(Nodes.visitAll());
Node parent = node.getChild("parent");
parent.setIconName("new");
Node child = parent.getNode("child");
child.setIconName("new");
parent.addChild("child2");
navigation.saveNode(child);
node = navigation.getRootNode(Nodes.visitAll());
assertEquals("new", node.getChild("parent").getIconName());
assertEquals(2, node.getChild("parent").getChildCount());
assertEquals("new", node.getChild("parent").getChild("child").getIconName());
}
@Test
public void serialization() throws Exception {
createNavigationChildren();
Node parent = navigation.getNode(NodePath.path("parent"), Nodes.visitChildren());
Node child = parent.getChild("child");
navigation.refreshNode(child, Nodes.visitChildren());
// transient changes
child.addChild("foo");
child.setIconName("iconName");
Node parentNode = SerializationUtils.serializeDeserialize(parent);
// test deserialized node
assertEquals("parent", parentNode.getName());
assertEquals(((ApiNode) parent).context.getState(), ((ApiNode) parentNode).context.getState());
assertTrue(parentNode.isChildrenLoaded());
Node childNode = parentNode.getChild("child");
assertNotNull(childNode);
assertEquals(((ApiNode) child).context.getState(), ((ApiNode) childNode).context.getState());
// test parent relationship
assertNotNull(childNode.getParent());
assertEquals("parent", childNode.getParent().getName());
// test transient changes
Node fooNode = childNode.getChild("foo");
assertNotNull(fooNode);
assertEquals(((ApiNode) child.getChild("foo")).context.getState(), ((ApiNode) fooNode).context.getState());
// test object identities
assertTrue(childNode == fooNode.getParent());
assertTrue(parentNode.getParent() == childNode.getParent().getParent());
}
@Test
public void serialization_DisplayName() throws Exception {
Node node = navigation.getRootNode(Nodes.visitAll()).addChild("parent");
node.addChild("simple");
node.addChild("extended");
node.setDisplayName("parent");
node.getChild("simple").setDisplayName("simple");
LocalizedString localizedString = new LocalizedString(Locale.ENGLISH, "english");
localizedString.setLocalizedValue(Locale.CHINA, "chinese");
node.getChild("extended").setDisplayNames(localizedString);
Node serialized = SerializationUtils.serializeDeserialize(node);
assertEquals("parent", serialized.getDisplayName());
assertEquals("simple", serialized.getChild("simple").getDisplayName());
assertNotNull(serialized.getChild("extended").getDisplayNames());
assertEquals("english", serialized.getChild("extended").getDisplayNames().getLocalizedValue(Locale.ENGLISH).getValue());
assertEquals("chinese", serialized.getChild("extended").getDisplayNames().getLocalizedValue(Locale.CHINA).getValue());
navigation.saveNode(node);
Node saved = navigation.getRootNode(Nodes.visitAll());
serialized = SerializationUtils.serializeDeserialize(saved).getChild("parent");
assertEquals("simple", serialized.getChild("simple").getDisplayName());
assertNotNull(serialized.getChild("extended").getDisplayNames());
assertEquals("english", serialized.getChild("extended").getDisplayNames().getLocalizedValue(Locale.ENGLISH).getValue());
assertEquals("chinese", serialized.getChild("extended").getDisplayNames().getLocalizedValue(Locale.CHINA).getValue());
}
@Test
public void serialization_Move() throws Exception {
createNavigationChildren();
Node root = navigation.getRootNode(Nodes.visitAll());
Node parent = root.getChild("parent");
Node child = parent.getChild("child");
child.moveTo(root);
assertEquals(0, parent.getChildCount());
assertEquals(2, root.getChildCount());
Node serialized = SerializationUtils.serializeDeserialize(root);
assertEquals(0, serialized.getChild("parent").getChildCount());
assertEquals(2, serialized.getChildCount());
}
@Test
public void serialization_multipath() throws Exception {
createNavigationChildren();
Node root = navigation.getRootNode(Nodes.visitAll());
Node parent = root.getChild("parent");
Node foo = parent.addChild("foo");
foo.addChild("bar");
Node child = parent.getChild("child");
child.addChild("another-child");
navigation.saveNode(root);
Node rootNode = SerializationUtils.serializeDeserialize(root);
assertNotNull(rootNode.getNode("parent", "foo", "bar"));
assertNotNull(rootNode.getNode("parent", "child", "another-child"));
}
@Test
public void serialization_Remove() throws Exception {
createNavigationChildren();
Node parent = navigation.getNode(NodePath.path("parent"), Nodes.visitAll());
parent.removeChild("child");
assertEquals(0, parent.getChildCount());
Node parentNode = SerializationUtils.serializeDeserialize(parent);
assertEquals(0, parentNode.getChildCount());
}
@Test
public void serialization_Reorder() throws Exception {
createNavigationChildren();
Node parent = navigation.getNode(NodePath.path("parent"), Nodes.visitAll());
parent.addChild("child2");
parent.addChild("child3");
navigation.saveNode(parent);
navigation.getNode(parent.getNodePath(), Nodes.visitAll());
Node child = parent.getChild("child3");
child.moveTo(0);
Node parentNode = SerializationUtils.serializeDeserialize(parent);
assertEquals("child3", parentNode.getChild(0).getName());
assertEquals("child", parentNode.getChild(1).getName());
assertEquals("child2", parentNode.getChild(2).getName());
}
@Test
public void serialization_Add() throws Exception {
createNavigationChildren();
Node parent = navigation.getNode(NodePath.path("parent"), Nodes.visitAll());
parent.addChild("child2");
Node parentNode = SerializationUtils.serializeDeserialize(parent);
assertEquals("child", parentNode.getChild(0).getName());
assertEquals("child2", parentNode.getChild(1).getName());
}
}