info.magnolia.templating.functions.TemplatingFunctionsTest.java Source code

Java tutorial

Introduction

Here is the source code for info.magnolia.templating.functions.TemplatingFunctionsTest.java

Source

/**
 * This file Copyright (c) 2011-2012 Magnolia International
 * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
 *
 *
 * This file is dual-licensed under both the Magnolia
 * Network Agreement and the GNU General Public License.
 * You may elect to use one or the other of these licenses.
 *
 * This file is distributed in the hope that it will be
 * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
 * Redistribution, except as permitted by whichever of the GPL
 * or MNA you select, is prohibited.
 *
 * 1. For the GPL license (GPL), you can redistribute and/or
 * modify this file under the terms of the GNU General
 * Public License, Version 3, as published by the Free Software
 * Foundation.  You should have received a copy of the GNU
 * General Public License, Version 3 along with this program;
 * if not, write to the Free Software Foundation, Inc., 51
 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * 2. For the Magnolia Network Agreement (MNA), this file
 * and the accompanying materials are made available under the
 * terms of the MNA which accompanies this distribution, and
 * is available at http://www.magnolia-cms.com/mna.html
 *
 * Any modifications to this file must keep this entire header
 * intact.
 *
 */
package info.magnolia.templating.functions;

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 info.magnolia.cms.beans.config.ServerConfiguration;
import info.magnolia.cms.core.AggregationState;
import info.magnolia.cms.i18n.DefaultI18nContentSupport;
import info.magnolia.cms.i18n.I18nContentSupport;
import info.magnolia.cms.util.SiblingsHelper;
import info.magnolia.context.MgnlContext;
import info.magnolia.jcr.inheritance.InheritanceNodeWrapper;
import info.magnolia.jcr.util.ContentMap;
import info.magnolia.jcr.util.NodeTypes;
import info.magnolia.jcr.util.PropertyUtil;
import info.magnolia.link.LinkTransformerManager;
import info.magnolia.rendering.template.configured.ConfiguredInheritance;
import info.magnolia.templating.inheritance.DefaultInheritanceContentDecorator;
import info.magnolia.test.ComponentsTestUtil;
import info.magnolia.test.mock.MockContext;
import info.magnolia.test.mock.MockUtil;
import info.magnolia.test.mock.MockWebContext;
import info.magnolia.test.mock.jcr.MockNode;
import info.magnolia.test.mock.jcr.MockSession;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import javax.inject.Provider;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.Property;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeType;

import org.apache.commons.lang.ArrayUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * Tests.
 *
 * @version $Id$
 */
public class TemplatingFunctionsTest {

    private static final String CONTEXT_PATH = "/manual_set_context_path";

    private static final String DEPTH_1_FIRST_PAGE_NAME = "page-L1-1";
    private static final String DEPTH_2_FIRST_PAGE_NAME = "page-L2-1";
    private static final String DEPTH_2_FIRST_COMPONENT_NAME = "comp-L2-1";
    private static final String DEPTH_3_FIRST_PAGE_NAME = "page-L3-1";
    private static final String DEPTH_3_FIRST_COMPONENT_NAME = "comp-L3-1";

    private static final String[] DEPTH_1_PAGE_NAMES = { DEPTH_1_FIRST_PAGE_NAME, "page-L1-2", "page-L1-3" };
    private static final String[] DEPTH_2_PAGE_NAMES = { DEPTH_2_FIRST_PAGE_NAME, "page-L2-2", "page-L2-3" };
    private static final String[] DEPTH_2_COMPONENT_NAMES = { DEPTH_2_FIRST_COMPONENT_NAME, "comp-L2-2",
            "comp-L2-3" };
    private static final String[] DEPTH_3_PAGE_NAMES = { DEPTH_3_FIRST_PAGE_NAME, "page-L3-2", "page-L3-3" };
    private static final String[] DEPTH_3_COMPONENT_NAMES = { DEPTH_3_FIRST_COMPONENT_NAME, "comp-L3-2",
            "comp-L3-3" };

    private MockNode root;
    private MockNode topPage;
    private MockNode topPageComponent;
    private MockNode childPage;
    private MockNode childPageComponent;
    private MockNode childPageSubPage;

    private ContentMap rootContentMap;
    private ContentMap topPageContentMap;
    private ContentMap topPageComponentContentMap;
    private ContentMap childPageContentMap;
    private ContentMap childPageComponentContentMap;
    private ContentMap childPageSubPageContentMap;

    private TemplatingFunctions functions;

    @Before
    public void setUpNodeHierarchy() throws PathNotFoundException, RepositoryException {
        MockSession session = new MockSession("website");
        root = (MockNode) session.getRootNode();

        topPage = createChildNodes(root, DEPTH_1_PAGE_NAMES, NodeTypes.Page.NAME);
        topPageComponent = createChildNodes(topPage, DEPTH_2_COMPONENT_NAMES, NodeTypes.Component.NAME);
        childPage = createChildNodes(topPage, DEPTH_2_PAGE_NAMES, NodeTypes.Page.NAME);
        childPageComponent = createChildNodes(childPage, DEPTH_3_COMPONENT_NAMES, NodeTypes.Component.NAME);
        childPageSubPage = createChildNodes(childPage, DEPTH_3_PAGE_NAMES, NodeTypes.Page.NAME);

        rootContentMap = new ContentMap(root);
        topPageContentMap = new ContentMap(topPage);
        topPageComponentContentMap = new ContentMap(topPageComponent);
        childPageContentMap = new ContentMap(childPage);
        childPageComponentContentMap = new ContentMap(childPageComponent);
        childPageSubPageContentMap = new ContentMap(childPageSubPage);

        LinkTransformerManager linkTransformerManager = new LinkTransformerManager();
        linkTransformerManager.setAddContextPathToBrowserLinks(true);
        ComponentsTestUtil.setInstance(LinkTransformerManager.class, linkTransformerManager);

        ComponentsTestUtil.setInstance(I18nContentSupport.class, new DefaultI18nContentSupport());
        MockContext ctx = new MockWebContext();
        MgnlContext.setInstance(ctx);
        Provider<AggregationState> aggregationProvider = new Provider<AggregationState>() {
            @Override
            public AggregationState get() {
                return MgnlContext.getAggregationState();
            }
        };
        functions = new TemplatingFunctions(aggregationProvider);
    }

    @After
    public void tearDown() {
        ComponentsTestUtil.clear();
        MgnlContext.setInstance(null);
    }

    @Test
    public void testAsContentMapfromNode() throws RepositoryException {
        // GIVEN

        // WHEN
        ContentMap result = functions.asContentMap(topPage);

        // THEN
        assertMapEqualsNode(topPage, result);
    }

    @Test
    public void testAsJCRNodeFromContentMap() throws RepositoryException {
        // GIVEN

        // WHEN
        Node resultContenMap = functions.asJCRNode(topPageContentMap);

        // THEN
        assertNodeEqualsMap(topPageContentMap, resultContenMap);
    }

    @Test
    public void testChildrenFromNode() throws RepositoryException {
        // GIVEN
        String[] expectedNamesDepth1 = (String[]) ArrayUtils.addAll(DEPTH_2_COMPONENT_NAMES, DEPTH_2_PAGE_NAMES);

        // WHEN
        List<Node> resultChildNodes = functions.children(topPage);

        // THEN
        assertNodesListEqualStringDefinitions(expectedNamesDepth1, resultChildNodes);
    }

    @Test
    public void testChildrenFromNodeAndTypePage() throws RepositoryException {
        // GIVEN

        // WHEN
        List<Node> resultChildPages = functions.children(topPage, NodeTypes.Page.NAME);

        // THEN
        assertNodesListEqualStringDefinitions(DEPTH_2_PAGE_NAMES, resultChildPages);
    }

    @Test
    public void testChildrenFromNodeAndTypeComponent() throws RepositoryException {
        // GIVEN

        // WHEN
        List<Node> resultChildComponents = functions.children(topPage, NodeTypes.Component.NAME);

        // THEN
        assertNodesListEqualStringDefinitions(DEPTH_2_COMPONENT_NAMES, resultChildComponents);
    }

    @Test
    public void testChildrenFromContentMap() throws RepositoryException {
        // GIVEN
        String[] expectedNamesDepth1 = (String[]) ArrayUtils.addAll(DEPTH_2_COMPONENT_NAMES, DEPTH_2_PAGE_NAMES);

        // WHEN
        List<ContentMap> resultChildNodes = functions.children(topPageContentMap);

        // THEN
        assertContentMapListEqualStringDefinitions(expectedNamesDepth1, resultChildNodes);
    }

    @Test
    public void testChildrenFromContentMapAndTypePage() throws RepositoryException {
        // GIVEN

        // WHEN
        List<ContentMap> resultChildPages = functions.children(topPageContentMap, NodeTypes.Page.NAME);

        // THEN
        assertContentMapListEqualStringDefinitions(DEPTH_2_PAGE_NAMES, resultChildPages);
    }

    @Test
    public void testChildrenFromContentMapAndTypeComponent() throws RepositoryException {
        // GIVEN

        // WHEN
        List<ContentMap> resultChildComponents = functions.children(topPageContentMap, NodeTypes.Component.NAME);

        // THEN
        assertContentMapListEqualStringDefinitions(DEPTH_2_COMPONENT_NAMES, resultChildComponents);
    }

    @Test
    public void testRootFromPageNodeDepth1() throws RepositoryException {
        // GIVEN

        // WHEN
        Node resultNode = functions.root(topPage);

        // THEN
        assertNodeEqualsNode(root, resultNode);
    }

    @Test
    public void testRootFromPageNodeDepth2() throws RepositoryException {
        // GIVEN

        // WHEN
        Node resultNode = functions.root(childPage);

        // THEN
        assertNodeEqualsNode(root, resultNode);
    }

    @Test
    public void testRootFromPageNodeDepth3() throws RepositoryException {
        // GIVEN

        // WHEN
        Node resultNode = functions.root(childPageSubPage);

        // THEN
        assertNodeEqualsNode(root, resultNode);
    }

    @Test
    public void testRootFromComponentNodeDepth1() throws RepositoryException {
        // GIVEN

        // WHEN
        Node resultNode = functions.root(topPageComponent);

        // THEN
        assertNodeEqualsNode(root, resultNode);
    }

    @Test
    public void testRootFromComponentNodeDepth2() throws RepositoryException {
        // GIVEN

        // WHEN
        Node resultNode = functions.root(childPageComponent);

        // THEN
        assertNodeEqualsNode(root, resultNode);
    }

    @Test
    public void testRootPageFromPageNodeDepth1() throws RepositoryException {
        // GIVEN

        // WHEN
        Node resultNode = functions.root(topPage, NodeTypes.Page.NAME);

        // THEN
        assertNull(resultNode);
    }

    @Test
    public void testRootPageFromPageNodeDepth2() throws RepositoryException {
        // GIVEN

        // WHEN
        Node resultNode = functions.root(childPage, NodeTypes.Page.NAME);

        // THEN
        assertNodeEqualsNode(topPage, resultNode);
    }

    @Test
    public void testRootPageFromPageNodeDepth3() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.root(childPageSubPage, NodeTypes.Page.NAME);

        // THEN
        assertNodeEqualsNode(topPage, resultNode);
    }

    @Test
    public void testRootPageFromComponentNodeDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.root(topPageComponent, NodeTypes.Page.NAME);

        // THEN
        assertNodeEqualsNode(topPage, resultNode);
    }

    @Test
    public void testRootPageFromComponentNodeDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.root(childPageComponent, NodeTypes.Page.NAME);

        // THEN
        assertNodeEqualsNode(topPage, resultNode);
    }

    @Test
    public void testRootFromPageContentMapDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.root(topPageContentMap);

        // THEN
        assertMapEqualsMap(rootContentMap, resultContentMap);
    }

    @Test
    public void testRootFromPageContentMapDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.root(childPageContentMap);

        // THEN
        assertMapEqualsMap(rootContentMap, resultContentMap);
    }

    @Test
    public void testRootFromPageContentMapDepth3() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.root(childPageSubPageContentMap);

        // THEN
        assertMapEqualsMap(rootContentMap, resultContentMap);
    }

    @Test
    public void testRootFromComponentContentMapDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.root(topPageComponentContentMap);

        // THEN
        assertMapEqualsMap(rootContentMap, resultContentMap);
    }

    @Test
    public void testRootFromComponentContentMapDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.root(childPageComponentContentMap);

        // THEN
        assertMapEqualsMap(rootContentMap, resultContentMap);
    }

    @Test
    public void testRootPageFromPageContentMapDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.root(topPageContentMap, NodeTypes.Page.NAME);

        // THEN
        assertNull(resultContentMap);
    }

    @Test
    public void testRootPageFromPageContentMapDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.root(childPageContentMap, NodeTypes.Page.NAME);

        // THEN
        assertMapEqualsMap(topPageContentMap, resultContentMap);
    }

    @Test
    public void testRootPageFromPageContentMapDepth3() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.root(childPageSubPageContentMap, NodeTypes.Page.NAME);

        // THEN
        assertMapEqualsMap(topPageContentMap, resultContentMap);
    }

    @Test
    public void testRootPageFromComponentContentMapDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.root(topPageComponentContentMap, NodeTypes.Page.NAME);

        // THEN
        assertMapEqualsMap(topPageContentMap, resultContentMap);
    }

    @Test
    public void testRootPageFromComponentContentMapDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.root(childPageComponentContentMap, NodeTypes.Page.NAME);

        // THEN
        assertMapEqualsMap(topPageContentMap, resultContentMap);
    }

    @Test
    public void testParentFromRootNodeShouldBeNull() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.parent(root);

        // THEN
        assertNull(resultNode);
    }

    @Test
    public void testParentFromNodeDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.parent(topPage);

        // THEN
        assertNodeEqualsNode(root, resultNode);
    }

    @Test
    public void testParentFromNodeDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.parent(childPage);

        // THEN
        assertNodeEqualsNode(topPage, resultNode);
    }

    @Test
    public void testParentFromRootContentMapShouldBeNull() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.parent(root);

        // THEN
        assertNull(resultNode);
    }

    @Test
    public void testParentFromContentMapDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.parent(topPageContentMap);

        // THEN
        assertMapEqualsMap(rootContentMap, resultContentMap);
    }

    @Test
    public void testParentFromContentMapDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.parent(childPageContentMap);

        // THEN
        assertMapEqualsMap(topPageContentMap, resultContentMap);
    }

    @Test
    public void testParentPageFromPageNode() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.parent(childPage, NodeTypes.Page.NAME);

        // THEN
        assertNodeEqualsNode(topPage, resultNode);
    }

    @Test
    public void testParentComponentFromPageNode() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.parent(childPage, NodeTypes.Component.NAME);

        // THEN
        assertNull(resultNode);
    }

    @Test
    public void testParentPageFromNodeDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.parent(topPage, NodeTypes.Page.NAME);

        // THEN
        assertNull(resultNode);
    }

    @Test
    public void testParentPageFromComponentNodeDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.parent(topPageComponent, NodeTypes.Page.NAME);

        // THEN
        assertEquals(topPage, resultNode);
    }

    @Test
    public void testParentPageFromComponentNodeDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.parent(childPageComponent, NodeTypes.Page.NAME);

        // THEN
        assertEquals(childPage, resultNode);
    }

    @Test
    public void testParentPageFromComponentNodeDepth3() throws RepositoryException {
        // GIVEN
        Node childPageSubSubComponent = childPageComponent.addNode("subSubComponent", NodeTypes.Component.NAME);

        // WHEN
        Node resultNode = functions.parent(childPageSubSubComponent, NodeTypes.Page.NAME);

        // THEN
        assertNodeEqualsNode(childPage, resultNode);
    }

    @Test
    public void testParentPageFromPageContentMap() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.parent(childPageContentMap, NodeTypes.Page.NAME);

        // THEN
        assertMapEqualsMap(topPageContentMap, resultContentMap);
    }

    @Test
    public void testParentComponentFromPageContentMap() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultNode = functions.parent(childPageContentMap, NodeTypes.Component.NAME);

        // THEN
        assertNull(resultNode);
    }

    @Test
    public void testParentPageFromContentMapDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultNode = functions.parent(topPageContentMap, NodeTypes.Page.NAME);

        // THEN
        assertNull(resultNode);
    }

    @Test
    public void testParentPageFromComponentContentMapDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.parent(topPageComponentContentMap, NodeTypes.Page.NAME);

        // THEN
        assertMapEqualsMap(topPageContentMap, resultContentMap);
    }

    @Test
    public void testParentPageFromComponentContentMapDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.parent(childPageComponentContentMap, NodeTypes.Page.NAME);

        // THEN
        assertMapEqualsMap(childPageContentMap, resultContentMap);
    }

    @Test
    public void testParentPageFromComponentContentMapDepth3() throws RepositoryException {
        // GIVEN
        ContentMap childPageSubSubComponentContentMap = new ContentMap(
                childPageComponent.addNode("subSubComponent", NodeTypes.Component.NAME));

        // WHEN
        ContentMap resultContentMap = functions.parent(childPageSubSubComponentContentMap, NodeTypes.Page.NAME);

        // THEN
        assertMapEqualsMap(childPageContentMap, resultContentMap);
    }

    @Test
    public void testPageFromRootShouldBeNull() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.page(root);

        // THEN
        assertNull(resultNode);
    }

    @Test
    public void testPageHavingNoParentPageShouldBeNull() throws RepositoryException {
        // GIVEN
        Node componentWithoutPage = root.addNode("onlyComponent", NodeTypes.Component.NAME);

        // WHEN
        Node resultNode = functions.page(componentWithoutPage);

        // THEN
        assertNull(resultNode);
    }

    @Test
    public void testPageFromNodeDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.page(topPage);

        // THEN
        assertNodeEqualsNode(topPage, resultNode);
    }

    @Test
    public void testPageFromNodeDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.page(childPage);

        // THEN
        assertNodeEqualsNode(childPage, resultNode);
    }

    @Test
    public void testPageFromComponentNodeDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        Node resultNode = functions.page(childPageComponent);

        // THEN
        assertNodeEqualsNode(childPage, resultNode);
    }

    @Test
    public void testPageFromComponentNodeDepth3() throws RepositoryException {
        // GIVEN
        Node subSubComponent = childPageComponent.addNode("subSubCompoent", NodeTypes.Component.NAME);

        // WHEN
        Node resultNode = functions.page(subSubComponent);

        // THEN
        assertNodeEqualsNode(childPage, resultNode);
    }

    @Test
    public void testPageContentMapFromRootShouldBeNull() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultNode = functions.page(rootContentMap);

        // THEN
        assertNull(resultNode);
    }

    @Test
    public void testPageContentMapHavingNoParentPageShouldBeNull() throws RepositoryException {
        // GIVEN
        Node componentWithoutPage = root.addNode("onlyComponent", NodeTypes.Component.NAME);

        // WHEN
        ContentMap resultContentMap = functions.page(new ContentMap(componentWithoutPage));

        // THEN
        assertNull(resultContentMap);
    }

    @Test
    public void testPageFromContentMapDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.page(topPageContentMap);

        // THEN
        assertMapEqualsMap(topPageContentMap, resultContentMap);
    }

    @Test
    public void testPageFromContentMapDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.page(childPageContentMap);

        // THEN
        assertMapEqualsMap(childPageContentMap, resultContentMap);
    }

    @Test
    public void testPageFromComponentContentMapDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.page(childPageComponentContentMap);

        // THEN
        assertMapEqualsMap(childPageContentMap, resultContentMap);
    }

    @Test
    public void testPageFromComponentContentMapDepth3() throws RepositoryException {
        // GIVEN
        Node subSubComponent = childPageComponent.addNode("subSubCompoent", NodeTypes.Component.NAME);

        // WHEN
        ContentMap resultContentMap = functions.page(new ContentMap(subSubComponent));

        // THEN
        assertMapEqualsMap(childPageContentMap, resultContentMap);
    }

    @Test
    public void testAncestorsFromNodeDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        List<Node> resultList = functions.ancestors(topPage);

        // THEN
        assertEquals(resultList.size(), 0);
    }

    @Test
    public void testAncestorPagesFromNodeDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        List<Node> resultList = functions.ancestors(topPage, NodeTypes.Page.NAME);

        // THEN
        assertEquals(resultList.size(), 0);
    }

    @Test
    public void testAncestorsFromComponentNodeDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        List<Node> resultList = functions.ancestors(topPageComponent);

        // THEN
        assertEquals(resultList.size(), 1);
        assertNodeEqualsNode(topPage, resultList.get(0));
    }

    @Test
    public void testAncestorPagesFromComponentNodeDepth4() throws RepositoryException {
        // GIVEN
        List<Node> compareList = new ArrayList<Node>();
        compareList.add(topPage);
        compareList.add(childPage);
        Iterator<Node> itCompare = compareList.iterator();

        // WHEN
        List<Node> resultList = functions.ancestors(childPageComponent, NodeTypes.Page.NAME);

        // THEN
        assertEquals(compareList.size(), resultList.size());
        for (Iterator<Node> itResult = resultList.iterator(); itResult.hasNext();) {
            assertNodeEqualsNode(itResult.next(), itCompare.next());
        }
    }

    @Test
    public void testAncestorsFromSubComponentNodeDepth5() throws RepositoryException {
        // GIVEN
        Node subSubComponent = childPageComponent.addNode("subSubComponent", NodeTypes.Component.NAME);

        List<Node> compareList = new ArrayList<Node>();
        compareList.add(topPage);
        compareList.add(childPage);
        compareList.add(childPageComponent);
        Iterator<Node> itCompare = compareList.iterator();

        // WHEN
        List<Node> resultList = functions.ancestors(subSubComponent);

        // THEN
        assertEquals(compareList.size(), resultList.size());
        for (Iterator<Node> itResult = resultList.iterator(); itResult.hasNext();) {
            assertNodeEqualsNode(itResult.next(), itCompare.next());
        }
    }

    @Test
    public void testAncestorPagesFromSubComponentNodeDepth5() throws RepositoryException {
        // GIVEN
        Node subSubComponent = childPageComponent.addNode("subSubComponent", NodeTypes.Component.NAME);

        List<Node> compareList = new ArrayList<Node>();
        compareList.add(topPage);
        compareList.add(childPage);
        Iterator<Node> itCompare = compareList.iterator();

        // WHEN
        List<Node> resultList = functions.ancestors(subSubComponent, NodeTypes.Page.NAME);

        // THEN
        assertEquals(compareList.size(), resultList.size());
        for (Iterator<Node> itResult = resultList.iterator(); itResult.hasNext();) {
            assertNodeEqualsNode(itResult.next(), itCompare.next());
        }
    }

    @Test
    public void testAncestorsFromContentMapDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        List<ContentMap> resultList = functions.ancestors(topPageContentMap);

        // THEN
        assertEquals(resultList.size(), 0);
    }

    @Test
    public void testAncestorPagesFromContentMapDepth1() throws RepositoryException {
        // GIVEN
        // WHEN
        List<ContentMap> resultList = functions.ancestors(topPageContentMap, NodeTypes.Page.NAME);

        // THEN
        assertEquals(resultList.size(), 0);
    }

    @Test
    public void testAncestorsFromComponentContentMapDepth2() throws RepositoryException {
        // GIVEN
        // WHEN
        List<ContentMap> resultList = functions.ancestors(topPageComponentContentMap);

        // THEN
        assertEquals(resultList.size(), 1);
        assertMapEqualsNode(topPage, resultList.get(0));
    }

    @Test
    public void testAncestorPagesFromComponentContentMapDepth4() throws RepositoryException {
        // GIVEN
        List<Node> compareList = new ArrayList<Node>();
        compareList.add(topPage);
        compareList.add(childPage);
        Iterator<Node> itCompare = compareList.iterator();

        // WHEN
        List<ContentMap> resultList = functions.ancestors(childPageComponentContentMap, NodeTypes.Page.NAME);

        // THEN
        assertEquals(compareList.size(), resultList.size());
        for (Iterator<ContentMap> itResult = resultList.iterator(); itResult.hasNext();) {
            assertMapEqualsNode(itCompare.next(), itResult.next());
        }
    }

    @Test
    public void testAncestorsFromSubComponentConentMapDepth5() throws RepositoryException {
        // GIVEN
        ContentMap subComponentContentMap = new ContentMap(
                childPageComponent.addNode("subSubComponent", NodeTypes.Component.NAME));

        List<Node> compareList = new ArrayList<Node>();
        compareList.add(topPage);
        compareList.add(childPage);
        compareList.add(childPageComponent);
        Iterator<Node> itCompare = compareList.iterator();

        // WHEN
        List<ContentMap> resultList = functions.ancestors(subComponentContentMap);

        // THEN
        assertEquals(compareList.size(), resultList.size());
        for (Iterator<ContentMap> itResult = resultList.iterator(); itResult.hasNext();) {
            assertMapEqualsNode(itCompare.next(), itResult.next());
        }
    }

    @Test
    public void testAncestorPagesFromSubComponentConentMapDepth5() throws RepositoryException {
        // GIVEN
        ContentMap subComponentContentMap = new ContentMap(
                childPageComponent.addNode("subSubComponent", NodeTypes.Component.NAME));

        List<Node> compareList = new ArrayList<Node>();
        compareList.add(topPage);
        compareList.add(childPage);
        Iterator<Node> itCompare = compareList.iterator();

        // WHEN
        List<ContentMap> resultList = functions.ancestors(subComponentContentMap, NodeTypes.Page.NAME);

        // THEN
        assertEquals(compareList.size(), resultList.size());
        for (Iterator<ContentMap> itResult = resultList.iterator(); itResult.hasNext();) {
            assertMapEqualsNode(itCompare.next(), itResult.next());
        }
    }

    @Test
    public void testNodeIsInherited() throws RepositoryException {
        // GIVEN
        // WHEN
        InheritanceNodeWrapper inheritedNode = wrapNodeForInheritance(childPageSubPage);

        // THEN
        assertTrue(functions.isInherited(inheritedNode.getNode("comp-L2-1")));
        assertTrue(functions.isInherited(inheritedNode.getNode("comp-L2-2")));
        assertTrue(functions.isInherited(inheritedNode.getNode("comp-L2-3")));
    }

    @Test
    public void testNodeIsFromCurrentPage() throws RepositoryException {
        // GIVEN
        // WHEN
        InheritanceNodeWrapper inheritedNode = wrapNodeForInheritance(childPage);

        // THEN
        assertTrue(functions.isFromCurrentPage(inheritedNode.getNode("comp-L3-1")));
    }

    @Test
    public void testContentMapIsInherited() throws RepositoryException {
        // GIVEN
        // WHEN
        InheritanceNodeWrapper inheritedNode = wrapNodeForInheritance(childPageSubPage);

        // THEN
        assertTrue(functions.isInherited(new ContentMap(inheritedNode.getNode("comp-L2-1"))));
        assertTrue(functions.isInherited(new ContentMap(inheritedNode.getNode("comp-L2-2"))));
        assertTrue(functions.isInherited(new ContentMap(inheritedNode.getNode("comp-L2-3"))));
    }

    @Test
    public void testContentMapIsFromCurrentPage() throws RepositoryException {
        // GIVEN
        // WHEN
        InheritanceNodeWrapper inheritedNode = wrapNodeForInheritance(childPage);

        // THEN
        assertTrue(functions.isFromCurrentPage(new ContentMap(inheritedNode.getNode("comp-L3-1"))));
    }

    @Test
    public void testInheritFromNode() throws RepositoryException {
        // GIVEN
        // WHEN
        Node node = functions.inherit(childPage, "comp-L3-1");

        // THEN
        assertNodeEqualsNode(childPageComponent, node);
    }

    @Test
    public void testInheritFromNodeNoContent() throws RepositoryException {
        // GIVEN
        Node content = null;

        // WHEN
        Node node = functions.inherit(content, "comp-L3-1");

        // THEN
        assertEquals(node, null);
    }

    @Test
    public void testInheritFromNodeOnlyContent() throws RepositoryException {
        // GIVEN
        // WHEN
        Node node = functions.inherit(childPage);

        // THEN
        assertEquals(node.getPath(), childPage.getPath());
        assertEquals(node.getIdentifier(), childPage.getIdentifier());
    }

    @Test
    public void testInheritedNodeIsUnwrapped() throws RepositoryException {
        // GIVEN
        // WHEN
        Node node = functions.inherit(childPage, "comp-L3-1");

        // THEN
        assertFalse(node instanceof InheritanceNodeWrapper);
    }

    @Test
    public void testInheritFromContentMap() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap contentMap = functions.inherit(childPageContentMap, "comp-L3-1");

        // THEN
        assertMapEqualsMap(childPageComponentContentMap, contentMap);
    }

    @Test
    public void testInheritFromContentMapOnlyContentMap() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap contentMap = functions.inherit(childPageContentMap);

        // THEN
        assertEquals(childPageContentMap.getJCRNode().getParent().getPath(),
                contentMap.getJCRNode().getParent().getPath());
        assertEquals(childPageContentMap.getJCRNode().getPath(), contentMap.getJCRNode().getPath());
        assertEquals(childPageContentMap.getJCRNode().getIdentifier(), contentMap.getJCRNode().getIdentifier());
    }

    @Test
    public void testNonExistingInheritedRelPathShouldReturnNull() throws RepositoryException {
        // GIVEN
        // WHEN
        ContentMap resultContentMap = functions.inherit(childPageContentMap, "iMaybeExistSomewhereElseButNotHere");
        Node node = functions.inherit(childPage, "iMaybeExistSomewhereElseButNotHere");

        // THEN
        assertNull(resultContentMap);
        assertNull(node);
    }

    @Test
    public void testNonExistingInheritedPropertyShouldReturnNull() throws RepositoryException {
        // GIVEN
        // WHEN
        Property property = functions.inheritProperty(topPage, "iMaybeExistSomewhereElseButNotHere");
        Property property2 = functions.inheritProperty(topPageComponent, "iMaybeExistSomewhereElseButNotHere");

        // THEN
        assertNull(property);
        assertNull(property2);
    }

    @Test
    public void testLinkForPropertyFromNodeDepth1() throws RepositoryException {
        // GIVEN
        String value = "value";
        String name = "myProperty";
        topPage.setProperty(name, value);

        MockWebContext context = new MockWebContext();
        context.setContextPath(CONTEXT_PATH);
        MgnlContext.setInstance(context);

        // WHEN
        String resultLink = functions.link(PropertyUtil.getPropertyOrNull(topPage, name));

        // THEN
        assertEquals(CONTEXT_PATH + topPage.getPath() + "/" + name, resultLink);
    }

    @Test
    public void testLinkForPropertyFromNodeDepth2() throws RepositoryException {
        // GIVEN
        String value = "value";
        String name = "myProperty";
        childPage.setProperty(name, value);

        MockWebContext context = new MockWebContext();
        context.setContextPath(CONTEXT_PATH);
        MgnlContext.setInstance(context);

        // WHEN
        String resultLink = functions.link(PropertyUtil.getPropertyOrNull(childPage, name));

        // THEN
        assertEquals(CONTEXT_PATH + childPage.getPath() + "/" + name, resultLink);
    }

    @Test
    public void testLanguage() throws RepositoryException {
        // GIVEN
        String langue = "fr";
        MockWebContext context = new MockWebContext();
        context.setContextPath(CONTEXT_PATH);
        Locale locale = new Locale(langue);
        context.setLocale(locale);
        MgnlContext.setInstance(context);

        // WHEN
        String langueRes = functions.language();

        // THEN
        assertEquals(langue, langueRes);
    }

    @Test
    public void testLinkForIdentifierFromNodeDepth1() throws RepositoryException {
        // GIVEN
        // TemplatingFunctions functions = new TemplatingFunctions();
        //
        // String identifier = NodeUtil.getNodeIdentifierIfPossible(topPage);
        //
        // // WHEN
        // String resultLink = functions.link(REPOSITORY,identifier);
        //
        // // THEN
        // assertEquals(CONTEXT_PATH + topPage.getPath(), resultLink);

        // FIXME To be implemented when core will commit the new Test Utility
    }

    @Test
    public void testLinkForIdentifierFromNodeDepth2() throws RepositoryException {
        // GIVEN
        // TemplatingFunctions functions = new TemplatingFunctions();
        //
        // String identifier = NodeUtil.getNodeIdentifierIfPossible(topPage);
        //
        // // WHEN
        // String resultLink = functions.link(REPOSITORY,identifier);
        //
        // // THEN
        // assertEquals(CONTEXT_PATH + topPage.getPath(), resultLink);

        // FIXME To be implemented when core will commit the new Test Utility
    }

    @Test
    public void testLinkFromNodeDepth1() throws RepositoryException {
        // GIVEN
        MockWebContext context = new MockWebContext();
        context.setContextPath(CONTEXT_PATH);
        MgnlContext.setInstance(context);

        // WHEN
        String resultLink = functions.link(topPage);

        // THEN
        assertEquals(CONTEXT_PATH + topPage.getPath(), resultLink);
    }

    @Test
    public void testLinkFromNodeDepth2() throws RepositoryException {
        // GIVEN
        MockWebContext context = new MockWebContext();
        context.setContextPath(CONTEXT_PATH);
        MgnlContext.setInstance(context);

        // WHEN
        String resultLink = functions.link(childPage);

        // THEN
        assertEquals(CONTEXT_PATH + childPage.getPath(), resultLink);
    }

    @Test
    public void testLinkFromContentMapDepth1() throws RepositoryException {
        // GIVEN
        MockWebContext context = new MockWebContext();
        context.setContextPath(CONTEXT_PATH);
        MgnlContext.setInstance(context);

        // WHEN
        String resultLink = functions.link(topPageContentMap);

        // THEN
        assertEquals(CONTEXT_PATH + topPageContentMap.get("@path"), resultLink);
    }

    @Test
    public void testLinkFromContentMapDepth2() throws RepositoryException {
        // GIVEN
        MockWebContext context = new MockWebContext();
        context.setContextPath(CONTEXT_PATH);
        MgnlContext.setInstance(context);

        // WHEN
        String resultLink = functions.link(childPageContentMap);

        // THEN
        assertEquals(CONTEXT_PATH + childPageContentMap.get("@path"), resultLink);
    }

    @Test
    public void testExternalLinkFromNodeNoProtocol() {
        // GIVEN
        topPage.setProperty("link", "www.external.ch");
        // WHEN
        String link = functions.externalLink(topPage, "link");

        // THEN
        assertEquals("http://www.external.ch", link);
    }

    @Test
    public void testExternalLinkFromNodeWithProtocol() {
        // GIVEN
        topPage.setProperty("link", "http://www.external.ch");
        // WHEN
        String link = functions.externalLink(topPage, "link");

        // THEN
        assertEquals("http://www.external.ch", link);
    }

    @Test
    public void testExternalLinkTitleFromNodeWithTitle() {
        // GIVEN
        topPage.setProperty("link", "www.external.ch");
        topPage.setProperty("linkTitle", "Link Title");
        // WHEN
        String linkTitle = functions.externalLinkTitle(topPage, "link", "linkTitle");

        // THEN
        assertEquals("Link Title", linkTitle);
    }

    @Test
    public void testExternalLinkTitleFromNodeNoTitleSet() {
        // GIVEN
        topPage.setProperty("link", "www.external.ch");
        // WHEN
        String linkTitle = functions.externalLinkTitle(topPage, "link", "linkTitle");

        // THEN
        assertEquals("http://www.external.ch", linkTitle);
    }

    @Test
    public void testExternalLinkFromContentMapNoProtocol() {
        // GIVEN
        topPage.setProperty("link", "www.external.ch");
        // WHEN
        String link = functions.externalLink(new ContentMap(topPage), "link");

        // THEN
        assertEquals("http://www.external.ch", link);
    }

    @Test
    public void testExternalLinkFromContentMapWithProtocol() {
        // GIVEN
        topPage.setProperty("link", "http://www.external.ch");
        // WHEN
        String link = functions.externalLink(new ContentMap(topPage), "link");

        // THEN
        assertEquals("http://www.external.ch", link);
    }

    @Test
    public void testExternalLinkTitleFromContentMapWithTitle() {
        // GIVEN
        topPage.setProperty("link", "www.external.ch");
        topPage.setProperty("linkTitle", "Link Title");
        // WHEN
        String linkTitle = functions.externalLinkTitle(new ContentMap(topPage), "link", "linkTitle");

        // THEN
        assertEquals("Link Title", linkTitle);
    }

    @Test
    public void testExternalLinkTitleFromContentMapNoTitleSet() {
        // GIVEN
        topPage.setProperty("link", "www.external.ch");
        // WHEN
        String linkTitle = functions.externalLinkTitle(new ContentMap(topPage), "link", "linkTitle");

        // THEN
        assertEquals("http://www.external.ch", linkTitle);
    }

    @Test
    public void testAsNodeList() throws RepositoryException {
        // GIVEN
        List<Node> compareNodeList = new ArrayList<Node>();
        compareNodeList.add(topPage);
        compareNodeList.add(childPage);
        compareNodeList.add(childPageSubPage);
        Iterator<Node> itCompare = compareNodeList.iterator();

        // WHEN
        List<ContentMap> resultMapList = functions.asContentMapList(compareNodeList);

        // THEN
        assertEquals(compareNodeList.size(), resultMapList.size());
        for (Iterator<ContentMap> itResult = resultMapList.iterator(); itResult.hasNext();) {
            assertMapEqualsNode(itCompare.next(), itResult.next());
        }
    }

    @Test
    public void testAsContentMapList() throws RepositoryException {
        // GIVEN
        List<ContentMap> compareNodeList = new ArrayList<ContentMap>();
        compareNodeList.add(topPageContentMap);
        compareNodeList.add(childPageContentMap);
        compareNodeList.add(childPageSubPageContentMap);
        Iterator<ContentMap> itCompare = compareNodeList.iterator();

        // WHEN
        List<Node> resultMapList = functions.asNodeList(compareNodeList);

        // THEN
        assertEquals(compareNodeList.size(), resultMapList.size());
        for (Iterator<Node> itResult = resultMapList.iterator(); itResult.hasNext();) {
            assertNodeEqualsMap(itCompare.next(), itResult.next());
        }
    }

    @Test
    public void testIsEditModeAuthorAndPreview() {
        // GIVEN
        boolean res = false;
        setAdminMode(true);
        setEditMode(true);

        // WHEN
        res = functions.isEditMode();

        // THEN
        assertFalse("Should not be in Edit Mode ", res);
    }

    @Test
    public void testIsEditModeNotAuthorAndPreview() {
        // GIVEN
        boolean res = false;
        setAdminMode(false);
        setEditMode(true);
        // WHEN

        res = functions.isEditMode();

        // THEN
        assertFalse("Should not be in Edit Mode ", res);
    }

    @Test
    public void testIsEditModeAuthorAndNotPreview() {
        // GIVEN
        boolean res = false;
        setAdminMode(true);
        setEditMode(false);
        // WHEN

        res = functions.isEditMode();

        // THEN
        assertTrue("Should be in Edit Mode ", res);
    }

    @Test
    public void testIsEditModeNotAuthorAndNotPreview() {
        // GIVEN
        boolean res = false;
        setAdminMode(false);
        setEditMode(false);
        // WHEN

        res = functions.isEditMode();

        // THEN
        assertFalse("Should not be in Edit Mode ", res);
    }

    @Test
    public void testIsPreviewModeTrue() {
        // GIVEN
        boolean res = false;
        setEditMode(true);
        // WHEN
        res = functions.isPreviewMode();

        // THEN
        assertTrue("Should be in Preview Mode ", res);
    }

    @Test
    public void testIsPreviewModeFalse() {
        // GIVEN
        boolean res = false;
        setEditMode(false);

        // WHEN
        res = functions.isPreviewMode();

        // THEN
        assertFalse("Should Not be in Preview Mode ", res);
    }

    @Test
    public void testIsAuthorInstanceTrue() {
        // GIVEN
        boolean res = false;
        setAdminMode(true);

        // WHEN
        res = functions.isAuthorInstance();
        // THEN
        assertTrue("should be Author ", res);
    }

    @Test
    public void testIsAuthorInstanceFalse() {
        // GIVEN
        boolean res = true;
        setAdminMode(false);

        // WHEN
        res = functions.isAuthorInstance();
        // THEN
        assertFalse("should not be Author ", res);
    }

    @Test
    public void testIsPublicInstanceTrue() {
        // GIVEN
        boolean res = true;
        setAdminMode(true);

        // WHEN
        res = functions.isPublicInstance();
        // THEN
        assertFalse("should be Public ", res);
    }

    @Test
    public void testIsPublicInstanceFalse() {
        // GIVEN
        boolean res = false;
        setAdminMode(false);

        // WHEN
        res = functions.isPublicInstance();
        // THEN
        assertTrue("should not be Public ", res);
    }

    @Test
    public void testCreateHtmlAttribute() {
        // GIVEN
        String value = " value ";
        String name = "name";

        // WHEN
        String res = functions.createHtmlAttribute(name, value);
        // THEN
        assertEquals(name + "=\"" + value.trim() + "\"", res);
    }

    @Test
    public void testCreateHtmlAttributeNoValue() {
        // GIVEN
        String value = "";
        String name = "name";

        // WHEN
        String res = functions.createHtmlAttribute(name, value);
        // THEN
        assertEquals("", res);
    }

    @Test
    public void testSiblings() throws RepositoryException {
        // GIVEN

        // WHEN
        SiblingsHelper s = functions.siblings(topPage);
        assertEquals("Indexes are 0-based ", 0, s.getIndex());
        s.next();
        s.next();
        assertEquals("Should have skipped nodes of different type.", 2, s.getIndex());
    }

    @Test
    public void testSiblingsContentMap() throws RepositoryException {
        // GIVEN

        // WHEN
        SiblingsHelper s = functions.siblings(topPageContentMap);
        assertEquals("Indexes are 0-based ", 0, s.getIndex());
        s.next();
        s.next();
        assertEquals("Should have skipped nodes of different type.", 2, s.getIndex());
    }

    @Test
    public void testGetContentByIdentifier() throws RepositoryException {
        // GIVEN
        String id = childPage.getIdentifier();
        Session session = childPage.getSession();
        MockUtil.setSessionAndHierarchyManager(session);
        String repository = session.getWorkspace().getName();

        //THEN

        //get content by identifier when repository was provided
        Node returnedNode1 = functions.contentByIdentifier(repository, id);
        assertEquals(childPage, returnedNode1);

        //get content by identifier when repository wasn't provided -> will taken the default (website)
        Node returnedNode2 = functions.contentByIdentifier(id);
        assertEquals(childPage, returnedNode2);
    }

    /**
     * Set the Server to Admin Mode
     */
    private void setAdminMode(boolean isAdmin) {
        ServerConfiguration serverConfiguration = new ServerConfiguration();
        ComponentsTestUtil.setInstance(ServerConfiguration.class, serverConfiguration);
        if (isAdmin) {
            serverConfiguration.setAdmin(true);
        }
    }

    /**
     * Set the WebContext in Edit Mode
     */
    private void setEditMode(boolean isInEditMode) {
        if (isInEditMode) {
            MgnlContext.getAggregationState().setPreviewMode(true);
        }
    }

    /**
     * Checks each {@link Node} of the @param actualNodeList {@link List} with the names in @param expectedNames {@link String} array.
     * Compares also the size of @param expectedNames {@link String} array compared to the size of the @param actualNodeList {@link List}.
     *
     * @param expectedNames {@link String} array of {@link Node} names compared the names defined in @param actualNodeList {@link List}
     * @param actualNodeList {@link List} containing the {@link ContentMap} names to compare to @param expectedNames {@link String} array
     * @throws RepositoryException
     */
    private void assertNodesListEqualStringDefinitions(String[] expectedNames, List<Node> actualNodeList)
            throws RepositoryException {
        int i = 0;
        for (Iterator<Node> it = actualNodeList.iterator(); it.hasNext(); i++) {
            Node node = it.next();
            assertEquals(expectedNames[i], node.getName());
        }
    }

    /**
     * Checks each {@link ContentMap} of the @param actualMapList {@link List} with the names in @param expectedNames {@link String} array.
     * Compares also the size of @param expectedNames {@link String} array compared to the size of the @actualMapList {@link List}.
     *
     * @param expectedNames {@link String} array of {@link ContentMap} names compared the names defined in @param actualMapList {@link List}
     * @param actualMapList {@link List} containing the {@link ContentMap} names to compare to @param expectedNames {@link String} array
     * @throws RepositoryException
     */
    private void assertContentMapListEqualStringDefinitions(String[] expectedNames, List<ContentMap> actualMapList)
            throws RepositoryException {
        int i = 0;
        for (Iterator<ContentMap> it = actualMapList.iterator(); it.hasNext(); i++) {
            ContentMap actualMap = it.next();
            assertEquals(expectedNames[i], actualMap.get("@name"));
        }
    }

    /**
     * Checks all mandatory {@link info.magnolia.nodebuilder.NodeOperationException} values. None should be null and all values should equal.
     *
     * @param expected {@link Node} to compare with @param actual {@link Node}
     * @param actual {@link Node} to compare with @param expected {@link Node}
     * @throws RepositoryException
     */
    private void assertNodeEqualsNode(Node expected, Node actual) throws RepositoryException {
        assertNotNull(actual.getName());
        assertEquals(expected.getName(), actual.getName());
        assertNotNull(actual.getIdentifier());
        assertEquals(expected.getIdentifier(), actual.getIdentifier());
        assertNotNull(actual.getPath());
        assertEquals(expected.getPath(), actual.getPath());
        assertNotNull(actual.getDepth());
        assertEquals(expected.getDepth(), actual.getDepth());
        assertNotNull(actual.getPrimaryNodeType().getName());
        assertEquals(expected.getPrimaryNodeType().getName(), actual.getPrimaryNodeType().getName());
    }

    /**
     * Checks all mandatory {@link ContentMap} values. None should be null and all values should equal.
     *
     * @param expected {@link ContentMap} to compare with @param actual {@link ContentMap}
     * @param actual {@link ContentMap} to compare with @param expected {@link ContentMap}
     */
    private void assertMapEqualsMap(ContentMap expected, ContentMap actual) {
        assertNotNull(actual.get("@name"));
        assertEquals(expected.get("@name"), actual.get("@name"));
        assertNotNull(actual.get("@id"));
        assertEquals(expected.get("@id"), actual.get("@id"));
        assertNotNull(actual.get("@uuid"));
        assertEquals(expected.get("@uuid"), actual.get("@uuid"));
        assertNotNull(actual.get("@path"));
        assertEquals(expected.get("@path"), actual.get("@path"));
        assertNotNull(actual.get("@handle"));
        assertEquals(expected.get("@handle"), actual.get("@handle"));
        assertNotNull(actual.get("@depth"));
        assertEquals(expected.get("@depth"), actual.get("@depth"));
        // TODO cringele: change when SCRUM-303 is solved
        assertNotNull(((NodeType) actual.get("@nodeType")).getName());
        assertEquals(((NodeType) expected.get("@nodeType")).getName(),
                ((NodeType) actual.get("@nodeType")).getName());
        // TODO cringele: correct code when SCRUM-303 is solved
        // assertNotNull(map1.get("@nodeType"));
        // assertEquals(map1.get("@nodeType"), map2.get("@nodeType"));

    }

    /**
     * Checks all mandatory {@link Node} values. None should be null and all values should equal.
     *
     * @param actual {@link Node} to compare with @param expected {@link ContentMap}
     * @param expected {@link ContentMap} to compare with @param actual {@link Node}
     * @throws RepositoryException
     */
    private void assertNodeEqualsMap(ContentMap expected, Node actual) throws RepositoryException {
        assertNotNull(actual.getName());
        assertEquals(expected.get("@name"), actual.getName());
        assertNotNull(actual.getIdentifier());
        assertEquals(expected.get("@uuid"), actual.getIdentifier());
        assertEquals(expected.get("@id"), actual.getIdentifier());
        assertNotNull(actual.getPath());
        assertEquals(expected.get("@path"), actual.getPath());
        assertEquals(expected.get("@handle"), actual.getPath());
        assertNotNull(actual.getDepth());
        assertEquals(expected.get("@depth"), actual.getDepth());
        assertNotNull(actual.getPrimaryNodeType().getName());
        assertEquals(((NodeType) expected.get("@nodeType")).getName(), actual.getPrimaryNodeType().getName());
    }

    /**
     * Checks all mandatory {@link ContentMap} values. No values should be null and all values should equal.
     *
     * @param expected Expected {@link Node} to compare with @param actual {@link ContentMap}
     * @param actual {@link ContentMap} to compare with @param expected {@link Node}
     * @throws RepositoryException
     */
    private void assertMapEqualsNode(Node expected, ContentMap actual) throws RepositoryException {
        assertNotNull(actual.get("@name"));
        assertEquals(expected.getName(), actual.get("@name"));
        assertNotNull(actual.get("@uuid"));
        assertEquals(expected.getIdentifier(), actual.get("@uuid"));
        assertNotNull(actual.get("@id"));
        assertEquals(expected.getIdentifier(), actual.get("@id"));
        assertNotNull(actual.get("@path"));
        assertEquals(expected.getPath(), actual.get("@path"));
        assertNotNull(actual.get("@handle"));
        assertEquals(expected.getPath(), actual.get("@handle"));
        assertNotNull(actual.get("@depth"));
        assertEquals(expected.getDepth(), actual.get("@depth"));
        assertNotNull(((NodeType) actual.get("@nodeType")).getName());
        assertEquals(expected.getPrimaryNodeType().getName(), ((NodeType) actual.get("@nodeType")).getName());
    }

    /**
     * Add to the give node child nodes by the name and type passed. Returns first created child node.
     *
     * @param parent Node where child nodes are added to
     * @param childNodeNames names of the child nodes to create
     * @param nodeTypeName primary type of the child nodes to create
     * @return first created child node
     * @throws RepositoryException
     * @throws PathNotFoundException
     */
    private MockNode createChildNodes(MockNode parent, String[] childNodeNames, String nodeTypeName)
            throws PathNotFoundException, RepositoryException {
        for (String nodeName : childNodeNames) {
            MockNode child = new MockNode(nodeName, nodeTypeName);
            parent.addNode(child);
        }
        return childNodeNames.length == 0 ? null : (MockNode) parent.getNode(childNodeNames[0]);
    }

    private InheritanceNodeWrapper wrapNodeForInheritance(Node destination) throws RepositoryException {
        ConfiguredInheritance configuration = new ConfiguredInheritance();
        configuration.setEnabled(true);
        configuration.setProperties(ConfiguredInheritance.PROPERTIES_ALL);
        configuration.setComponents(ConfiguredInheritance.COMPONENTS_ALL);
        return (InheritanceNodeWrapper) new DefaultInheritanceContentDecorator(destination, configuration)
                .wrapNode(destination);
    }
}