org.amanzi.neo.services.impl.statistics.PropertyStatisticsServiceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.amanzi.neo.services.impl.statistics.PropertyStatisticsServiceTest.java

Source

/* 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.statistics;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.amanzi.neo.nodeproperties.IGeneralNodeProperties;
import org.amanzi.neo.nodeproperties.impl.GeneralNodeProperties;
import org.amanzi.neo.services.INodeService;
import org.amanzi.neo.services.exceptions.ServiceException;
import org.amanzi.neo.services.impl.NodeService.NodeServiceRelationshipType;
import org.amanzi.neo.services.impl.statistics.PropertyStatisticsService.PropertyStatisticsRelationshipType;
import org.amanzi.neo.services.impl.statistics.internal.NodeTypeVault;
import org.amanzi.neo.services.impl.statistics.internal.PropertyVault;
import org.amanzi.neo.services.impl.statistics.internal.StatisticsVault;
import org.amanzi.neo.services.statistics.IPropertyStatisticsNodeProperties;
import org.amanzi.neo.services.util.AbstractServiceTest;
import org.apache.commons.lang3.math.NumberUtils;
import org.junit.Before;
import org.junit.Test;
import org.neo4j.graphdb.Node;

/**
 * TODO Purpose of
 * <p>
 * </p>
 * 
 * @author Nikolay Lagutko (nikolay.lagutko@amanzitel.com)
 * @since 1.0.0
 */
public class PropertyStatisticsServiceTest extends AbstractServiceTest {

    /** int TEST_SIZE_VALUE field */
    private static final int TEST_SIZE_VALUE = 3;

    /** Integer[] DEFAULT_EMPTIED_COUNTS_FOR_VALUES field */
    private static final Integer[] DEFAULT_EMPTIED_COUNTS_FOR_VALUES = { 2, null, null, 5 };

    /** Integer[] DEFAULT_UPDATED_COUNTS_FOR_VALUES field */
    private static final Integer[] DEFAULT_UPDATED_COUNTS_FOR_VALUES = { 2, 3, 4, 5 };

    /** Integer[] DEFAULT_COUNTS_FOR_VALUES field */
    private static final Integer[] DEFAULT_COUNTS_FOR_VALUES = { 2, 3, 4 };

    /** int TEST_COUNT_VAULT field */
    private static final int TEST_COUNT_VALUE = 5;

    private static final IGeneralNodeProperties GENERAL_NODE_PROPERTIES = new GeneralNodeProperties();

    private static final IPropertyStatisticsNodeProperties PROPERTY_STATISTICS_NODE_PROPERTIES = new PropertyStatisticsNodeProperties();

    private static final String PROPERTY_NAME = "property";

    private PropertyStatisticsService service;

    private INodeService nodeService;

    private StatisticsVault vault;

    private NodeTypeVault nodeTypeVault;

    private PropertyVault propertyVault;

    private Node rootNode;

    private Node statNode;

    @Override
    @Before
    public void setUp() {
        super.setUp();

        rootNode = getNodeMock();
        statNode = getNodeMock();

        vault = mock(StatisticsVault.class);
        nodeTypeVault = mock(NodeTypeVault.class);
        propertyVault = mock(PropertyVault.class);

        nodeService = mock(INodeService.class);

        service = spy(new PropertyStatisticsService(getService(), GENERAL_NODE_PROPERTIES, nodeService,
                PROPERTY_STATISTICS_NODE_PROPERTIES));

        setReadOnly(true);
    }

    @Test
    public void testCheckServiceActivityOnLoadWithoutStatistics() throws Exception {
        when(nodeService.getSingleChild(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS)).thenReturn(null);
        when(nodeService.createNode(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS)).thenReturn(statNode);

        doReturn(vault).when(service).loadStatisticsVault(statNode);

        service.loadStatistics(rootNode);

        verify(nodeService).getSingleChild(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS);
        verify(nodeService).createNode(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS);
        verify(service).loadStatisticsVault(statNode);
    }

    @Test
    public void testCheckServiceActivityOnSaveWithoutStatistics() throws Exception {
        when(nodeService.getSingleChild(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS)).thenReturn(null);
        when(nodeService.createNode(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS)).thenReturn(statNode);

        service.saveStatistics(rootNode, vault);

        verify(nodeService).getSingleChild(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS);
        verify(nodeService).createNode(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS);
        verify(service).saveStatisticsVault(statNode, vault);
    }

    @Test
    public void testCheckServiceActivityOnLoadWithStatistics() throws Exception {
        when(nodeService.getSingleChild(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS)).thenReturn(statNode);

        doReturn(vault).when(service).loadStatisticsVault(statNode);

        service.loadStatistics(rootNode);

        verify(nodeService).getSingleChild(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS);
        verify(nodeService, never()).createNode(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS);
        verify(service).loadStatisticsVault(statNode);
    }

    @Test
    public void testCheckServiceActivityOnSaveWithStatistics() throws Exception {
        when(nodeService.getSingleChild(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS)).thenReturn(statNode);

        service.saveStatistics(rootNode, vault);

        verify(nodeService).getSingleChild(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS);
        verify(nodeService, never()).createNode(rootNode, PropertyStatisticsNodeType.PROPERTY_STATISTICS,
                PropertyStatisticsRelationshipType.PROPERTY_STATISTICS);
        verify(service).saveStatisticsVault(statNode, vault);
    }

    @Test
    public void testCheckNoActivityIfVaultNotChanged() throws Exception {
        when(vault.isChanged()).thenReturn(false);

        service.saveStatisticsVault(rootNode, vault);

        verify(service, never()).updateStatisticsInfo(rootNode, vault);
        verify(service, never()).saveNodeTypeVault(any(Node.class), any(NodeTypeVault.class));
    }

    @Test
    public void testCheckActivityIfVaultChanged() throws Exception {
        NodeTypeVault subVault1 = createNodeTypeVault(true);
        NodeTypeVault subVault2 = createNodeTypeVault(true);

        List<NodeTypeVault> subVaults = new ArrayList<NodeTypeVault>();
        subVaults.add(subVault1);
        subVaults.add(subVault2);

        when(vault.isChanged()).thenReturn(true);
        when(vault.getAllNodeTypeVaults()).thenReturn(subVaults);
        doNothing().when(service).saveNodeTypeVault(statNode, subVault1);
        doNothing().when(service).saveNodeTypeVault(statNode, subVault2);

        service.saveStatisticsVault(statNode, vault);

        verify(service).updateStatisticsInfo(statNode, vault);
        verify(service).saveNodeTypeVault(statNode, subVault1);
        verify(service).saveNodeTypeVault(statNode, subVault2);
    }

    @Test
    public void testCheckActivityIfNodeTypeVaultChanged() throws Exception {
        NodeTypeVault subVault1 = createNodeTypeVault(true);
        NodeTypeVault subVault2 = createNodeTypeVault(false);

        List<NodeTypeVault> subVaults = new ArrayList<NodeTypeVault>();
        subVaults.add(subVault1);
        subVaults.add(subVault2);

        when(vault.isChanged()).thenReturn(true);
        when(vault.getAllNodeTypeVaults()).thenReturn(subVaults);
        doNothing().when(service).saveNodeTypeVault(statNode, subVault1);
        doNothing().when(service).saveNodeTypeVault(statNode, subVault2);

        service.saveStatisticsVault(statNode, vault);

        verify(service, never()).saveNodeTypeVault(statNode, subVault2);
        verify(service).saveNodeTypeVault(statNode, subVault1);
    }

    @Test
    public void testCheckActivityOnUpdateStatisticsVault() throws Exception {
        when(vault.getCount()).thenReturn(TEST_COUNT_VALUE);

        service.updateStatisticsInfo(statNode, vault);

        verify(nodeService).updateProperty(statNode, PROPERTY_STATISTICS_NODE_PROPERTIES.getCountProperty(),
                TEST_COUNT_VALUE);
    }

    @Test
    public void testCheckActivityOnUpdateNodeTypeVault() throws Exception {
        Node nodeTypeNode = getNodeMock();

        when(nodeTypeVault.getCount()).thenReturn(TEST_COUNT_VALUE);
        when(nodeTypeVault.getNodeType()).thenReturn(TestNodeType.TEST1);
        when(nodeService.getChildByName(statNode, TestNodeType.TEST1.getId(),
                PropertyStatisticsNodeType.STATISTICS_VAULT)).thenReturn(null);
        when(nodeService.createNode(statNode, PropertyStatisticsNodeType.STATISTICS_VAULT,
                NodeServiceRelationshipType.CHILD, TestNodeType.TEST1.getId())).thenReturn(nodeTypeNode);

        service.saveNodeTypeVault(statNode, nodeTypeVault);

        verify(nodeService).updateProperty(nodeTypeNode, PROPERTY_STATISTICS_NODE_PROPERTIES.getCountProperty(),
                TEST_COUNT_VALUE);
        verify(nodeTypeVault, times(2)).getNodeType();
        verify(nodeService).getChildByName(statNode, TestNodeType.TEST1.getId(),
                PropertyStatisticsNodeType.STATISTICS_VAULT);
        verify(nodeService).createNode(statNode, PropertyStatisticsNodeType.STATISTICS_VAULT,
                NodeServiceRelationshipType.CHILD, TestNodeType.TEST1.getId());
    }

    @Test
    public void testCheckActivityOnUpdateNodeTypeVaultWithExistingNode() throws Exception {
        Node nodeTypeNode = getNodeMock();

        when(nodeTypeVault.getNodeType()).thenReturn(TestNodeType.TEST1);
        when(nodeService.getChildByName(statNode, TestNodeType.TEST1.getId(),
                PropertyStatisticsNodeType.STATISTICS_VAULT)).thenReturn(nodeTypeNode);
        doReturn(null).when(nodeService).createNode(eq(statNode), eq(PropertyStatisticsNodeType.STATISTICS_VAULT),
                eq(NodeServiceRelationshipType.CHILD), eq(TestNodeType.TEST1.getId()));

        service.saveNodeTypeVault(statNode, nodeTypeVault);

        verify(nodeTypeVault).getNodeType();
        verify(nodeService).getChildByName(statNode, TestNodeType.TEST1.getId(),
                PropertyStatisticsNodeType.STATISTICS_VAULT);
        verify(nodeService, never()).createNode(statNode, PropertyStatisticsNodeType.STATISTICS_VAULT,
                NodeServiceRelationshipType.CHILD, TestNodeType.TEST1.getId());
    }

    @Test
    public void testCheckNoActivityIfNodeVaultChanged() throws Exception {
        Node nodeTypeNode = getNodeMock();

        PropertyVault subVault1 = createPropertyVault(true);
        PropertyVault subVault2 = createPropertyVault(true);

        List<PropertyVault> subVaults = new ArrayList<PropertyVault>();
        subVaults.add(subVault1);
        subVaults.add(subVault2);

        when(nodeTypeVault.getNodeType()).thenReturn(TestNodeType.TEST1);
        when(nodeTypeVault.getAllPropertyVaults()).thenReturn(subVaults);
        doReturn(nodeTypeNode).when(service).updateNodeTypeVault(statNode, nodeTypeVault);
        doNothing().when(service).savePropertyStatistics(nodeTypeNode, subVault1);
        doNothing().when(service).savePropertyStatistics(nodeTypeNode, subVault2);

        service.saveNodeTypeVault(statNode, nodeTypeVault);

        verify(nodeTypeVault).getAllPropertyVaults();
        verify(service).savePropertyStatistics(nodeTypeNode, subVault1);
        verify(service).savePropertyStatistics(nodeTypeNode, subVault2);
    }

    @Test
    public void testCheckNoActivityIfNodeVaultChangedWithNotChangedProperties() throws Exception {
        Node nodeTypeNode = getNodeMock();

        PropertyVault subVault1 = createPropertyVault(true);
        PropertyVault subVault2 = createPropertyVault(false);

        List<PropertyVault> subVaults = new ArrayList<PropertyVault>();
        subVaults.add(subVault1);
        subVaults.add(subVault2);

        when(nodeTypeVault.getNodeType()).thenReturn(TestNodeType.TEST1);
        when(nodeTypeVault.getAllPropertyVaults()).thenReturn(subVaults);
        doReturn(nodeTypeNode).when(service).updateNodeTypeVault(statNode, nodeTypeVault);
        doNothing().when(service).savePropertyStatistics(nodeTypeNode, subVault1);
        doNothing().when(service).savePropertyStatistics(nodeTypeNode, subVault2);

        service.saveNodeTypeVault(statNode, nodeTypeVault);

        verify(nodeTypeVault).getAllPropertyVaults();
        verify(service).savePropertyStatistics(nodeTypeNode, subVault1);
        verify(service, never()).savePropertyStatistics(nodeTypeNode, subVault2);
    }

    @Test
    public void testCheckServiceActivityOnSavingPropertyToNewNode() throws Exception {
        Node nodeTypeVaultNode = getNodeMock();
        Node propertyVaultNode = getNodeMock();

        when(propertyVault.getPropertyName()).thenReturn(PROPERTY_NAME);
        when(nodeService.getChildByName(nodeTypeVaultNode, PROPERTY_NAME,
                PropertyStatisticsNodeType.STATISTICS_VAULT)).thenReturn(null);
        when(nodeService.createNode(nodeTypeVaultNode, PropertyStatisticsNodeType.STATISTICS_VAULT,
                NodeServiceRelationshipType.CHILD, PROPERTY_NAME)).thenReturn(propertyVaultNode);

        doNothing().when(service).updatePropertyVault(propertyVaultNode, propertyVault);

        service.savePropertyStatistics(nodeTypeVaultNode, propertyVault);

        verify(propertyVault, times(2)).getPropertyName();
        verify(nodeService).getChildByName(nodeTypeVaultNode, PROPERTY_NAME,
                PropertyStatisticsNodeType.STATISTICS_VAULT);
        verify(nodeService).createNode(nodeTypeVaultNode, PropertyStatisticsNodeType.STATISTICS_VAULT,
                NodeServiceRelationshipType.CHILD, PROPERTY_NAME);
        verify(service).updatePropertyVault(propertyVaultNode, propertyVault);
    }

    @Test
    public void testCheckServiceActivityOnSavingPropertyToExistingNode() throws Exception {
        Node nodeTypeVaultNode = getNodeMock();
        Node propertyVaultNode = getNodeMock();

        when(propertyVault.getPropertyName()).thenReturn(PROPERTY_NAME);
        when(nodeService.getChildByName(nodeTypeVaultNode, PROPERTY_NAME,
                PropertyStatisticsNodeType.STATISTICS_VAULT)).thenReturn(propertyVaultNode);
        doNothing().when(service).updatePropertyVault(propertyVaultNode, propertyVault);

        service.savePropertyStatistics(nodeTypeVaultNode, propertyVault);

        verify(propertyVault).getPropertyName();
        verify(nodeService).getChildByName(nodeTypeVaultNode, PROPERTY_NAME,
                PropertyStatisticsNodeType.STATISTICS_VAULT);
        verify(nodeService, never()).createNode(nodeTypeVaultNode, PropertyStatisticsNodeType.STATISTICS_VAULT,
                NodeServiceRelationshipType.CHILD, PROPERTY_NAME);
        verify(service).updatePropertyVault(propertyVaultNode, propertyVault);
    }

    @Test
    public void testCheckServiceActivityOnUpdatingPropertyVault() throws Exception {
        Node propertyVaultNode = initializeMockedPropertyVaultNode(0);

        when(nodeService.getNodeProperty(propertyVaultNode, GENERAL_NODE_PROPERTIES.getSizeProperty(), 0, false))
                .thenReturn(0);

        service.updatePropertyVault(propertyVaultNode, propertyVault);

        verify(nodeService).updateProperty(propertyVaultNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getClassProperty(), "some class");
        verify(nodeService).updateProperty(propertyVaultNode, GENERAL_NODE_PROPERTIES.getSizeProperty(), 0);
    }

    @Test
    public void testCheckServiceActivityOnUpdatingPropertyVaultWithValues() throws Exception {
        Integer[] counts = DEFAULT_COUNTS_FOR_VALUES;

        Node propertyVaultNode = initializeMockedPropertyVaultNode(0, counts);

        service.updatePropertyVault(propertyVaultNode, propertyVault);

        verify(nodeService).getNodeProperty(propertyVaultNode, GENERAL_NODE_PROPERTIES.getSizeProperty(),
                NumberUtils.INTEGER_ZERO, false);

        verify(nodeService).updateProperty(propertyVaultNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getClassProperty(), "some class");

        for (int i = 0; i < counts.length; i++) {
            verify(nodeService).updateProperty(eq(propertyVaultNode),
                    eq(PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + i), contains(PROPERTY_NAME));

            verify(nodeService).updateProperty(eq(propertyVaultNode),
                    eq(PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix() + i), any(Integer.class));
        }
    }

    @Test
    public void testCheckServiceActivityOnUpdatingPropertyVaultWithUnchangedValues() throws Exception {
        Integer[] counts = DEFAULT_COUNTS_FOR_VALUES;

        Node propertyVaultNode = initializeMockedPropertyVaultNode(counts.length, counts);

        for (int i = 0; i < counts.length; i++) {
            when(nodeService.getNodeProperty(propertyVaultNode,
                    PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + i, null, true))
                            .thenReturn(PROPERTY_NAME + i);
        }

        service.updatePropertyVault(propertyVaultNode, propertyVault);

        for (int i = 0; i < counts.length; i++) {
            verify(nodeService).updateProperty(eq(propertyVaultNode),
                    eq(PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix() + i), any(Integer.class));
        }
    }

    @Test
    public void testCheckServiceActivityOnUpdatingPropertyVaultWithAddedValues() throws Exception {
        Integer[] counts = DEFAULT_UPDATED_COUNTS_FOR_VALUES;

        Node propertyVaultNode = initializeMockedPropertyVaultNode(counts.length - 1, counts);

        for (int i = 0; i < counts.length; i++) {
            when(nodeService.getNodeProperty(propertyVaultNode,
                    PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + i, null, true))
                            .thenReturn(PROPERTY_NAME + i);
        }

        service.updatePropertyVault(propertyVaultNode, propertyVault);

        for (int i = 0; i < counts.length; i++) {
            verify(nodeService).updateProperty(eq(propertyVaultNode),
                    eq(PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix() + i), any(Integer.class));
        }

        verify(nodeService).updateProperty(propertyVaultNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + (counts.length - 1),
                PROPERTY_NAME + (counts.length - 1));
    }

    @Test
    public void testCheckServiceActivityOnUpdatingPropertyVaultWithRemovedValues() throws Exception {
        Integer[] counts = DEFAULT_UPDATED_COUNTS_FOR_VALUES;

        Node propertyVaultNode = initializeMockedPropertyVaultNode(counts.length, counts);

        for (int i = 0; i < (counts.length - 1); i++) {
            when(nodeService.getNodeProperty(propertyVaultNode,
                    PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + i, null, true))
                            .thenReturn(PROPERTY_NAME + i);
        }

        service.updatePropertyVault(propertyVaultNode, propertyVault);

        for (int i = 0; i < (counts.length - 1); i++) {
            verify(nodeService).updateProperty(eq(propertyVaultNode),
                    eq(PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix() + i), any(Integer.class));
        }

        verify(nodeService).removeNodeProperty(propertyVaultNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + (counts.length - 1), false);
        verify(nodeService).removeNodeProperty(propertyVaultNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix() + (counts.length - 1), false);
    }

    @Test
    public void testCheckServiceActivityOnUpdatingPropertyVaultWithRemovedInMiddleValues() throws Exception {
        Integer[] counts = DEFAULT_UPDATED_COUNTS_FOR_VALUES;

        Node propertyVaultNode = initializeMockedPropertyVaultNode(counts.length, counts);

        for (int i = 0; i < counts.length; i++) {
            if (i != 1) {
                when(nodeService.getNodeProperty(propertyVaultNode,
                        PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + i, null, true))
                                .thenReturn(PROPERTY_NAME + i);
            }
        }

        service.updatePropertyVault(propertyVaultNode, propertyVault);

        for (int i = 0; i < (counts.length - 1); i++) {
            verify(nodeService).updateProperty(eq(propertyVaultNode),
                    eq(PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix() + i), any(Integer.class));
        }

        verify(nodeService).removeNodeProperty(propertyVaultNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + 1, false);
        verify(nodeService).removeNodeProperty(propertyVaultNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix() + 1, false);
    }

    @Test
    public void testCheckServiceActivityOnUpdatingPropertyVaultWithRemovedInMiddleValuesWithRenaming()
            throws Exception {
        Integer[] counts = DEFAULT_EMPTIED_COUNTS_FOR_VALUES;

        Node propertyVaultNode = initializeMockedPropertyVaultNode(counts.length, counts);

        for (int i = 0; i < counts.length; i++) {
            when(nodeService.getNodeProperty(propertyVaultNode,
                    PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + i, null, true))
                            .thenReturn(PROPERTY_NAME + i);

        }

        service.updatePropertyVault(propertyVaultNode, propertyVault);

        verify(nodeService, times(counts.length - 1)).updateProperty(eq(propertyVaultNode),
                contains(PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix()), any(Integer.class));

        verify(nodeService, times(2)).removeNodeProperty(eq(propertyVaultNode),
                contains(PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix()), eq(Boolean.FALSE));
        verify(nodeService, times(2)).removeNodeProperty(eq(propertyVaultNode),
                contains(PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix()), eq(Boolean.FALSE));
        verify(nodeService).renameNodeProperty(propertyVaultNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix()
                        + (DEFAULT_EMPTIED_COUNTS_FOR_VALUES.length - 1),
                PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + 1, false);
        verify(nodeService).renameNodeProperty(propertyVaultNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix()
                        + (DEFAULT_EMPTIED_COUNTS_FOR_VALUES.length - 1),
                PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix() + 1, false);
    }

    @Test
    public void testCheckResultOfLoadStatisticsVault() throws Exception {
        doReturn(vault).when(service).loadStatisticsVault(statNode);

        StatisticsVault result = service.loadStatisticsVault(statNode);

        assertNotNull("statistics cannot be null", result);
    }

    @Test
    public void testCheckServiceActivityOnLoadStatistics() throws Exception {
        doReturn(vault).when(service).loadStatisticsVault(statNode);
        doReturn(statNode).when(service).getStatisticsNode(rootNode);

        StatisticsVault result = service.loadStatistics(rootNode);

        assertEquals("Unexpected statistics", vault, result);

        verify(service).loadStatisticsVault(statNode);
        verify(service).getStatisticsNode(rootNode);
    }

    @Test
    public void testCheckServiceActivityOnLoadStatisticsVault() throws Exception {
        when(nodeTypeVault.getNodeType()).thenReturn(TestNodeType.TEST1);
        when(nodeService.getChildren(statNode, PropertyStatisticsNodeType.STATISTICS_VAULT))
                .thenReturn(Arrays.asList(getNodeMock(), getNodeMock()).iterator());
        doReturn(TEST_COUNT_VALUE).when(nodeService).getNodeProperty(statNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getCountProperty(), 0, false);
        doReturn(nodeTypeVault).when(service).loadNodeTypeVault(any(Node.class));

        vault = service.loadStatisticsVault(statNode);

        verify(nodeService).getNodeProperty(statNode, PROPERTY_STATISTICS_NODE_PROPERTIES.getCountProperty(), 0,
                false);
        verify(service, times(2)).loadNodeTypeVault(any(Node.class));

        assertEquals("Unexpected count of vault", TEST_COUNT_VALUE, vault.getCount());
    }

    @Test
    public void testCheckServiceActivityOnLoadNodeTypeVault() throws Exception {
        Node nodeTypeVaultNode = getNodeMock();

        when(nodeService.getChildren(nodeTypeVaultNode, PropertyStatisticsNodeType.STATISTICS_VAULT))
                .thenReturn(Arrays.asList(getNodeMock(), getNodeMock()).iterator());

        when(nodeService.getNodeName(nodeTypeVaultNode))
                .thenReturn(PropertyStatisticsNodeType.STATISTICS_VAULT.getId());
        when(nodeService.getNodeProperty(nodeTypeVaultNode, PROPERTY_STATISTICS_NODE_PROPERTIES.getCountProperty(),
                null, true)).thenReturn(TEST_COUNT_VALUE);
        doReturn(PROPERTY_NAME).when(propertyVault).getPropertyName();
        doReturn(propertyVault).when(service).loadPropertyVault(any(Node.class));

        nodeTypeVault = service.loadNodeTypeVault(nodeTypeVaultNode);

        verify(nodeService).getNodeName(nodeTypeVaultNode);
        verify(nodeService).getNodeProperty(nodeTypeVaultNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getCountProperty(), null, true);
        verify(service, times(2)).loadPropertyVault(any(Node.class));
    }

    @Test
    public void testCheckServiceResultOnLoadNodeTypeVault() throws Exception {
        Node nodeTypeVaultNode = getNodeMock();

        when(nodeService.getChildren(nodeTypeVaultNode, PropertyStatisticsNodeType.STATISTICS_VAULT))
                .thenReturn(Arrays.asList(getNodeMock(), getNodeMock()).iterator());

        when(nodeService.getNodeName(nodeTypeVaultNode))
                .thenReturn(PropertyStatisticsNodeType.STATISTICS_VAULT.getId());
        when(nodeService.getNodeProperty(nodeTypeVaultNode, PROPERTY_STATISTICS_NODE_PROPERTIES.getCountProperty(),
                null, true)).thenReturn(TEST_COUNT_VALUE);
        doReturn(PROPERTY_NAME).when(propertyVault).getPropertyName();
        doReturn(propertyVault).when(service).loadPropertyVault(any(Node.class));

        NodeTypeVault result = service.loadNodeTypeVault(nodeTypeVaultNode);

        assertNotNull("result cannot be null", result);
        assertEquals("Unexpected node type", PropertyStatisticsNodeType.STATISTICS_VAULT, result.getNodeType());
        assertEquals("Unexpected count", TEST_COUNT_VALUE, result.getCount());
    }

    @Test
    public void testCheckServiceActivityOnLoadPropertyVault() throws Exception {
        Node propertyVaultNode = getNodeMock();

        when(nodeService.getNodeProperty(propertyVaultNode, GENERAL_NODE_PROPERTIES.getSizeProperty(), null, true))
                .thenReturn(TEST_SIZE_VALUE);
        when(nodeService.getNodeProperty(propertyVaultNode, PROPERTY_STATISTICS_NODE_PROPERTIES.getClassProperty(),
                null, true)).thenReturn("java.lang.Integer");

        for (int i = 0; i < TEST_SIZE_VALUE; i++) {
            when(nodeService.getNodeProperty(propertyVaultNode,
                    PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + i, null, true))
                            .thenReturn(PROPERTY_NAME + i);
            when(nodeService.getNodeProperty(propertyVaultNode,
                    PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix() + i, null, true)).thenReturn(i);
        }

        service.loadPropertyVault(propertyVaultNode);

        verify(nodeService).getNodeName(propertyVaultNode);
        verify(nodeService).getNodeProperty(propertyVaultNode, GENERAL_NODE_PROPERTIES.getSizeProperty(), null,
                true);
        verify(nodeService).getNodeProperty(propertyVaultNode,
                PROPERTY_STATISTICS_NODE_PROPERTIES.getClassProperty(), null, true);
        verify(nodeService, times(TEST_SIZE_VALUE)).getNodeProperty(eq(propertyVaultNode),
                contains(PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix()), eq(null), eq(true));

        for (int i = 0; i < TEST_SIZE_VALUE; i++) {
            verify(nodeService).getNodeProperty(eq(propertyVaultNode),
                    eq(PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix() + i), eq(null), eq(true));
        }
    }

    @Test
    public void testCheckResultOnLoadPropertyVault() throws Exception {
        Node propertyVaultNode = getNodeMock();

        when(nodeService.getNodeProperty(propertyVaultNode, GENERAL_NODE_PROPERTIES.getSizeProperty(), null, true))
                .thenReturn(TEST_SIZE_VALUE);
        when(nodeService.getNodeProperty(propertyVaultNode, PROPERTY_STATISTICS_NODE_PROPERTIES.getClassProperty(),
                null, true)).thenReturn("java.lang.Integer");

        for (int i = 0; i < TEST_SIZE_VALUE; i++) {
            when(nodeService.getNodeProperty(propertyVaultNode,
                    PROPERTY_STATISTICS_NODE_PROPERTIES.getValuePrefix() + i, null, true))
                            .thenReturn(PROPERTY_NAME + i);
            when(nodeService.getNodeProperty(propertyVaultNode,
                    PROPERTY_STATISTICS_NODE_PROPERTIES.getCountPrefix() + i, null, true)).thenReturn(i);
        }

        PropertyVault result = service.loadPropertyVault(propertyVaultNode);

        assertNotNull("loaded property vault cannot be null", result);
        assertEquals("unexpected class", "java.lang.Integer", result.getClassName());
        Map<Object, Integer> values = result.getValuesMap();

        assertEquals("unexpected size", TEST_SIZE_VALUE, values.size());

        for (int i = 0; i < values.size(); i++) {
            assertTrue("value should exist", values.containsKey(PROPERTY_NAME + i));
            assertEquals("unexpected count of value", i, values.get(PROPERTY_NAME + i));

        }
    }

    private Node initializeMockedPropertyVaultNode(final int size, final Integer... counts)
            throws ServiceException {
        Node propertyVaultNode = getNodeMock();
        Map<Object, Integer> values = getValuesMap(counts);

        when(propertyVault.getClassName()).thenReturn("some class");
        when(propertyVault.getValuesMap()).thenReturn(values);

        when(nodeService.getNodeProperty(propertyVaultNode, GENERAL_NODE_PROPERTIES.getSizeProperty(), 0, false))
                .thenReturn(size);

        return propertyVaultNode;
    }

    private Map<Object, Integer> getValuesMap(final Integer... counts) {
        Map<Object, Integer> result = new HashMap<Object, Integer>();

        int j = 0;
        for (Integer i : counts) {
            result.put(PROPERTY_NAME + j++, i);
        }

        return result;
    }

    private PropertyVault createPropertyVault(final boolean isChanged) {
        PropertyVault result = mock(PropertyVault.class);

        when(result.isChanged()).thenReturn(isChanged);

        return result;
    }

    private NodeTypeVault createNodeTypeVault(final boolean isChanged) {
        NodeTypeVault result = mock(NodeTypeVault.class);

        when(result.isChanged()).thenReturn(isChanged);

        return result;
    }
}