/* AWE - Amanzi Wireless Explorer * http://awe.amanzi.org * (C) 2008-2009, AmanziTel AB * * This library is provided under the terms of the Eclipse Public License * as described at http://www.eclipse.org/legal/epl-v10.html. Any use, * reproduction or distribution of the library constitutes recipient's * acceptance of this agreement. * * This library is distributed WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ package org.amanzi.neo.services.impl; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.amanzi.neo.nodeproperties.IGeneralNodeProperties; import org.amanzi.neo.nodeproperties.impl.GeneralNodeProperties; import org.amanzi.neo.nodetypes.INodeType; import org.amanzi.neo.services.exceptions.DatabaseException; import org.amanzi.neo.services.exceptions.PropertyNotFoundException; import org.amanzi.neo.services.impl.NodeService.NodeServiceRelationshipType; import org.amanzi.neo.services.util.AbstractServiceTest; import org.junit.Before; import org.junit.Test; import org.neo4j.graphdb.Direction; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Relationship; /** * TODO Purpose of * <p> * </p> * * @author Nikolay Lagutko (nikolay.lagutko@amanzitel.com) * @since 1.0.0 */ public class NodeServiceTest extends AbstractServiceTest { /** long TEST_LONG_PROPERTY field */ private static final long TEST_LONG_PROPERTY = 123l; /** String NEW_TEST_NODE_PROPERTY field */ private static final String NEW_TEST_NODE_PROPERTY = "new property"; /** String TEST_NODE_VALUE field */ private static final String TEST_NODE_VALUE = "some value"; private static final String NODE_NAME = "node_name"; private static final String NODE_TYPE_ID = TestNodeType.TEST1.getId(); private static final String TEST_NODE_PROPERTY = "property"; private final IGeneralNodeProperties generalNodeProperties = new GeneralNodeProperties(); private NodeService nodeService = null; @Override @Before public void setUp() { super.setUp(); nodeService = new NodeService(getService(), generalNodeProperties); setReadOnly(true); } @Test(expected = DatabaseException.class) public void testCheckDatabaseExceptionOnGetNodeName() throws Exception { setMethodFailure(); Node node = getNodeMock(); when(node.hasProperty(generalNodeProperties.getNodeNameProperty())).thenThrow(new IllegalArgumentException()); nodeService.getNodeName(node); } @Test(expected = DatabaseException.class) public void testCheckDatabaseExceptionOnGetNodeType() throws Exception { setMethodFailure(); Node node = getNodeMock(); when(node.hasProperty(generalNodeProperties.getNodeTypeProperty())).thenThrow(new IllegalArgumentException()); nodeService.getNodeType(node); } @Test public void testCheckGetNodeNameActivity() throws Exception { Node node = getNodeMock(); // property exists when(node.hasProperty(generalNodeProperties.getNodeNameProperty())).thenReturn(true); // return this property when(node.getProperty(generalNodeProperties.getNodeNameProperty(), null)).thenReturn(NODE_NAME); nodeService.getNodeName(node); verify(node).hasProperty(generalNodeProperties.getNodeNameProperty()); verify(node).getProperty(generalNodeProperties.getNodeNameProperty()); verifyNoMoreInteractions(node); } @Test public void testCheckGetNodeNameResult() throws Exception { Node node = getNodeMock(); // property exists when(node.hasProperty(generalNodeProperties.getNodeNameProperty())).thenReturn(true); // return this property when(node.getProperty(generalNodeProperties.getNodeNameProperty())).thenReturn(NODE_NAME); String result = nodeService.getNodeName(node); assertEquals("Unexpected Name of Node", NODE_NAME, result); } @Test public void testCheckGetNodeTypeActivity() throws Exception { Node node = getNodeMock(); // property exists when(node.hasProperty(generalNodeProperties.getNodeTypeProperty())).thenReturn(true); // return this property when(node.getProperty(generalNodeProperties.getNodeTypeProperty())).thenReturn(NODE_TYPE_ID); nodeService.getNodeType(node); verify(node).hasProperty(generalNodeProperties.getNodeTypeProperty()); verify(node).getProperty(generalNodeProperties.getNodeTypeProperty()); verifyNoMoreInteractions(node); } @Test public void testCheckGetNodeTypeResult() throws Exception { Node node = getNodeMock(); // property exists when(node.hasProperty(generalNodeProperties.getNodeTypeProperty())).thenReturn(true); // return this property when(node.getProperty(generalNodeProperties.getNodeTypeProperty())).thenReturn(NODE_TYPE_ID); INodeType result = nodeService.getNodeType(node); assertEquals("Unepected Type of Node", TestNodeType.TEST1, result); } @Test(expected = PropertyNotFoundException.class) public void testCheckPropertyNotFoundExceptionOnGetNodeName() throws Exception { Node node = getNodeMock(); // property exists when(node.hasProperty(generalNodeProperties.getNodeNameProperty())).thenReturn(false); nodeService.getNodeName(node); } @Test(expected = PropertyNotFoundException.class) public void testCheckPropertyNotFoundExceptionOnGetNodeType() throws Exception { Node node = getNodeMock(); // property exists when(node.hasProperty(generalNodeProperties.getNodeTypeProperty())).thenReturn(false); nodeService.getNodeType(node); } @Test(expected = DatabaseException.class) public void testGetAllChildrentOfNode() throws Exception { setChildTraversalToNull(); nodeService.getChildren(getNodeMock(), TestNodeType.TEST1); } @Test(expected = DatabaseException.class) public void testGetAllChildByName() throws Exception { setChildTraversalToNull(); nodeService.getChildByName(getNodeMock(), "some name", TestNodeType.TEST1); } @Test(expected = DatabaseException.class) public void testCheckExceptionOnGetReferencedNode() throws Exception { setReferencedNode(null); nodeService.getReferencedNode(); } @Test public void testCheckDbActivityOnGetReferencedNode() throws Exception { Node node = getNodeMock(); setReferencedNode(node); nodeService.getReferencedNode(); GraphDatabaseService service = getService(); verify(service).getReferenceNode(); } @Test public void testCheckResultOfGetReferencedNode() throws Exception { Node node = getNodeMock(); setReferencedNode(node); Node result = nodeService.getReferencedNode(); assertEquals("Unexpected referenced node", node, result); } @Test public void testCheckActivityOnGetParent() throws Exception { Node node = getNodeMock(); Node parent = getNodeMock(); Relationship relToParent = mock(Relationship.class); when(relToParent.getStartNode()).thenReturn(parent); when(node.getSingleRelationship(NodeService.NodeServiceRelationshipType.CHILD, Direction.INCOMING)).thenReturn(relToParent); nodeService.getParent(node, NodeService.NodeServiceRelationshipType.CHILD); verify(node).getSingleRelationship(NodeService.NodeServiceRelationshipType.CHILD, Direction.INCOMING); verify(relToParent).getStartNode(); } @Test public void testCheckResultOnGetParent() throws Exception { Node node = getNodeMock(); Node parent = getNodeMock(); Relationship relToParent = mock(Relationship.class); when(relToParent.getStartNode()).thenReturn(parent); when(node.getSingleRelationship(NodeService.NodeServiceRelationshipType.CHILD, Direction.INCOMING)).thenReturn(relToParent); Node result = nodeService.getParent(node, NodeService.NodeServiceRelationshipType.CHILD); assertEquals("unexpected parent", parent, result); } @Test public void testCheckWithoutParent() throws Exception { Node node = getNodeMock(); when(node.getSingleRelationship(NodeService.NodeServiceRelationshipType.CHILD, Direction.INCOMING)).thenReturn(null); Node result = nodeService.getParent(node, NodeService.NodeServiceRelationshipType.CHILD); assertNull("there cannot be a parent", result); } @Test(expected = DatabaseException.class) public void testCheckDatabaseExceptiononGetParent() throws Exception { Node node = getNodeMock(); when(node.getSingleRelationship(NodeService.NodeServiceRelationshipType.CHILD, Direction.INCOMING)).thenThrow( new IllegalArgumentException()); nodeService.getParent(node, NodeService.NodeServiceRelationshipType.CHILD); } @Test public void testCheckCreateNodeCalledByCreateNodeWithOnlyType() throws Exception { nodeService = spy(nodeService); Node parentNode = getNodeMock(); Map<String, Object> properties = new HashMap<String, Object>(); doReturn(null).when(nodeService) .createNode(parentNode, TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION, properties); nodeService.createNode(parentNode, TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION); verify(nodeService).createNode(parentNode, TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION, properties); } @Test public void testCheckCreateNodeCalledByCreateNodeWithTypeAndString() throws Exception { Map<String, Object> properties = new HashMap<String, Object>(); properties.put(generalNodeProperties.getNodeNameProperty(), NODE_NAME); nodeService = spy(nodeService); Node parentNode = getNodeMock(); doReturn(null).when(nodeService) .createNode(parentNode, TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION, properties); nodeService.createNode(parentNode, TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION, NODE_NAME); verify(nodeService).createNode(parentNode, TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION, properties); } @Test public void testCheckCreateNodeCalledByCreateNodeWithTypeAndStringAndMap() throws Exception { Map<String, Object> properties = new HashMap<String, Object>(); properties.put("some property", NODE_NAME); Map<String, Object> rawProperties = new HashMap<String, Object>(properties); rawProperties.put(generalNodeProperties.getNodeNameProperty(), NODE_NAME); nodeService = spy(nodeService); Node parentNode = getNodeMock(); doReturn(null).when(nodeService).createNode(parentNode, TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION, rawProperties); nodeService.createNode(parentNode, TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION, NODE_NAME, properties); verify(nodeService).createNode(parentNode, TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION, rawProperties); } @Test public void testCheckCreateNodeActivity() throws Exception { setReadOnly(false); Node parentNode = getNodeMock(); Node createdNode = getNodeMock(); GraphDatabaseService service = getService(); when(service.createNode()).thenReturn(createdNode); Map<String, Object> properties = getNodeProperties(); nodeService.createNode(parentNode, TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION, properties); verify(service).createNode(); verify(parentNode).createRelationshipTo(createdNode, TestRelationshipTypes.TEST_RELATION); verify(createdNode).setProperty(generalNodeProperties.getNodeTypeProperty(), TestNodeType.TEST1.getId()); for (Entry<String, Object> entry : properties.entrySet()) { verify(createdNode).setProperty(entry.getKey(), entry.getValue()); } } @Test(expected = DatabaseException.class) public void testCheckDatabaseExceptionOnCreatingNewNode() throws Exception { setReadOnly(false); setMethodFailure(); Node parentNode = getNodeMock(); GraphDatabaseService service = getService(); doThrow(new IllegalArgumentException()).when(service).createNode(); Map<String, Object> properties = getNodeProperties(); nodeService.createNode(parentNode, TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION, properties); } @Test public void testCheckUpdateNodePropertyWithoutProperty() throws Exception { setReadOnly(false); Node node = getNodeMock(); when(node.hasProperty(TEST_NODE_PROPERTY)).thenReturn(false); nodeService.updateProperty(node, TEST_NODE_PROPERTY, TEST_NODE_VALUE); verifyNodeProperty(node, TEST_NODE_PROPERTY, TEST_NODE_VALUE, false, false); } @Test public void testCheckUpdateNodePropertyWithEqualProperty() throws Exception { Node node = getNodeMock(); when(node.hasProperty(TEST_NODE_PROPERTY)).thenReturn(true); when(node.getProperty(TEST_NODE_PROPERTY)).thenReturn(TEST_NODE_VALUE); nodeService.updateProperty(node, TEST_NODE_PROPERTY, TEST_NODE_VALUE); verifyNodeProperty(node, TEST_NODE_PROPERTY, TEST_NODE_VALUE, true, true); } @Test public void testCheckUpdateNodePropertyWithNotEqualProperty() throws Exception { setReadOnly(false); Node node = getNodeMock(); when(node.hasProperty(TEST_NODE_PROPERTY)).thenReturn(true); when(node.getProperty(TEST_NODE_PROPERTY)).thenReturn(TEST_NODE_VALUE + 1); nodeService.updateProperty(node, TEST_NODE_PROPERTY, TEST_NODE_VALUE); verifyNodeProperty(node, TEST_NODE_PROPERTY, TEST_NODE_VALUE, true, false); } @Test(expected = DatabaseException.class) public void testCheckExceptionOnUpdateProperty() throws Exception { setReadOnly(false); setMethodFailure(); Node node = getNodeMock(); when(node.hasProperty(TEST_NODE_PROPERTY)).thenReturn(true); when(node.getProperty(TEST_NODE_PROPERTY)).thenReturn(TEST_NODE_VALUE + 1); doThrow(new IllegalArgumentException()).when(node).setProperty(TEST_NODE_PROPERTY, TEST_NODE_VALUE); nodeService.updateProperty(node, TEST_NODE_PROPERTY, TEST_NODE_VALUE); } @Test(expected = DatabaseException.class) public void testCheckExceptionOnGetSingleChild() throws Exception { NodeService nodeServiceImpl = spy(new NodeService(getService(), generalNodeProperties)); doThrow(new IllegalArgumentException()).when(nodeServiceImpl).getDownlinkTraversal(); nodeServiceImpl.getSingleChild(getNodeMock(), TestNodeType.TEST1, TestRelationshipTypes.TEST_RELATION); } @Test public void testCheckGetNodePropertiesWithDefaultValueAndExistingProperty() throws Exception { Node node = getNodeMock(); when(node.getProperty(TEST_NODE_PROPERTY, TEST_NODE_VALUE)).thenReturn(TEST_NODE_VALUE); Object result = nodeService.getNodeProperty(node, TEST_NODE_PROPERTY, TEST_NODE_VALUE, false); verify(node).hasProperty(TEST_NODE_PROPERTY); verify(node).getProperty(TEST_NODE_PROPERTY, TEST_NODE_VALUE); assertEquals("unexpected property", TEST_NODE_VALUE, result); } @Test public void testCheckGetNodePropertiesWithDefaultValueAndExistingPropertyThrowException() throws Exception { Node node = getNodeMock(); when(node.hasProperty(TEST_NODE_PROPERTY)).thenReturn(true); when(node.getProperty(TEST_NODE_PROPERTY)).thenReturn(TEST_NODE_VALUE); Object result = nodeService.getNodeProperty(node, TEST_NODE_PROPERTY, null, true); verify(node).hasProperty(TEST_NODE_PROPERTY); verify(node).getProperty(TEST_NODE_PROPERTY); assertEquals("unexpected property", TEST_NODE_VALUE, result); } @Test public void testCheckGetNodePropertiesWithDefaultValueAndNotExistingProperty() throws Exception { Node node = getNodeMock(); when(node.getProperty(TEST_NODE_PROPERTY, TEST_NODE_VALUE)).thenReturn(TEST_NODE_VALUE); Object result = nodeService.getNodeProperty(node, TEST_NODE_PROPERTY, TEST_NODE_VALUE, false); verify(node).hasProperty(TEST_NODE_PROPERTY); verify(node).getProperty(TEST_NODE_PROPERTY, TEST_NODE_VALUE); assertEquals("unexpected property", TEST_NODE_VALUE, result); } @Test(expected = PropertyNotFoundException.class) public void testCheckGetNodePropertiesWithDefaultValueAndNotExistingPropertyThrowException() throws Exception { Node node = getNodeMock(); when(node.hasProperty(TEST_NODE_PROPERTY)).thenReturn(false); nodeService.getNodeProperty(node, TEST_NODE_PROPERTY, null, true); } @Test(expected = DatabaseException.class) public void testCheckExceptionOnRemoveProperty() throws Exception { setReadOnly(false); setMethodFailure(); Node node = getNodeMock(); when(node.hasProperty(TEST_NODE_PROPERTY)).thenReturn(true); when(node.removeProperty(TEST_NODE_PROPERTY)).thenThrow(new IllegalArgumentException()); nodeService.removeNodeProperty(node, TEST_NODE_PROPERTY, false); } @Test(expected = PropertyNotFoundException.class) public void testCheckExceptionOnRemoveNotExistingProperty() throws Exception { Node node = getNodeMock(); when(node.hasProperty(TEST_NODE_PROPERTY)).thenReturn(false); nodeService.removeNodeProperty(node, TEST_NODE_PROPERTY, true); } @Test public void testCheckActivityOnRemoveExistingProperty() throws Exception { setReadOnly(false); Node node = getNodeMock(); when(node.hasProperty(TEST_NODE_PROPERTY)).thenReturn(true); nodeService.removeNodeProperty(node, TEST_NODE_PROPERTY, true); verify(node).hasProperty(TEST_NODE_PROPERTY); verify(node).removeProperty(TEST_NODE_PROPERTY); } @Test public void testCheckActivityOnRemoveNotExistingProperty() throws Exception { Node node = getNodeMock(); when(node.hasProperty(TEST_NODE_PROPERTY)).thenReturn(false); nodeService.removeNodeProperty(node, TEST_NODE_PROPERTY, false); verify(node).hasProperty(TEST_NODE_PROPERTY); verify(node, never()).removeProperty(TEST_NODE_PROPERTY); } @Test public void testCheckActivityOnRenamePropertyWithThrow() throws Exception { Node node = getNodeMock(); nodeService = spy(nodeService); doReturn(TEST_NODE_VALUE).when(nodeService).getNodeProperty(node, TEST_NODE_PROPERTY, null, false); doNothing().when(nodeService).removeNodeProperty(node, TEST_NODE_PROPERTY, true); doNothing().when(nodeService).updateProperty(node, NEW_TEST_NODE_PROPERTY, TEST_NODE_VALUE); nodeService.renameNodeProperty(node, TEST_NODE_PROPERTY, NEW_TEST_NODE_PROPERTY, true); verify(nodeService).removeNodeProperty(node, TEST_NODE_PROPERTY, false); verify(nodeService).getNodeProperty(node, TEST_NODE_PROPERTY, null, false); verify(nodeService).updateProperty(node, NEW_TEST_NODE_PROPERTY, TEST_NODE_VALUE); } @Test public void testCheckActivityOnRenamePropertyWithoutThrow() throws Exception { Node node = getNodeMock(); nodeService = spy(nodeService); doReturn(TEST_NODE_VALUE).when(nodeService).getNodeProperty(node, TEST_NODE_PROPERTY, null, false); doNothing().when(nodeService).removeNodeProperty(node, TEST_NODE_PROPERTY, false); doNothing().when(nodeService).updateProperty(node, NEW_TEST_NODE_PROPERTY, TEST_NODE_VALUE); nodeService.renameNodeProperty(node, TEST_NODE_PROPERTY, NEW_TEST_NODE_PROPERTY, false); verify(nodeService).removeNodeProperty(node, TEST_NODE_PROPERTY, false); verify(nodeService).getNodeProperty(node, TEST_NODE_PROPERTY, null, false); verify(nodeService).updateProperty(node, NEW_TEST_NODE_PROPERTY, TEST_NODE_VALUE); } @Test public void testCheckActivityOnRenamePropertyWithNotExistingProperty() throws Exception { Node node = getNodeMock(); nodeService = spy(nodeService); doReturn(null).when(nodeService).getNodeProperty(node, TEST_NODE_PROPERTY, null, true); nodeService.renameNodeProperty(node, TEST_NODE_PROPERTY, NEW_TEST_NODE_PROPERTY, false); verify(nodeService, never()).removeNodeProperty(node, TEST_NODE_PROPERTY, false); verify(nodeService).getNodeProperty(node, TEST_NODE_PROPERTY, null, false); verify(nodeService, never()).updateProperty(node, NEW_TEST_NODE_PROPERTY, TEST_NODE_VALUE); } @Test(expected = PropertyNotFoundException.class) public void testCheckActivityOnRenamePropertyWithNotExistingPropertyWithThrow() throws Exception { Node node = getNodeMock(); nodeService = spy(nodeService); doReturn(null).when(nodeService).getNodeProperty(node, TEST_NODE_PROPERTY, null, true); nodeService.renameNodeProperty(node, TEST_NODE_PROPERTY, NEW_TEST_NODE_PROPERTY, true); } private void verifyNodeProperty(final Node node, final String name, final Object value, final boolean exists, final boolean equal) { verify(node).hasProperty(name); if (exists) { verify(node).getProperty(name); } else { verify(node, never()).getProperty(name); } if (exists && equal) { verify(node, never()).setProperty(name, value); } else { verify(node).setProperty(name, value); } verifyNoMoreInteractions(node); } private Map<String, Object> getNodeProperties() { Map<String, Object> result = new HashMap<String, Object>(); result.put("string", "string"); result.put("long", TEST_LONG_PROPERTY); return result; } private void setReferencedNode(final Node node) { GraphDatabaseService service = getService(); if (node == null) { when(service.getReferenceNode()).thenThrow(new IllegalArgumentException()); } else { when(service.getReferenceNode()).thenReturn(node); } } private void setChildTraversalToNull() { NodeService spyService = spy(new NodeService(getService(), generalNodeProperties)); when(spyService.getChildrenTraversal(TestNodeType.TEST1, NodeServiceRelationshipType.CHILD)).thenReturn(null); nodeService = spyService; } }