/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.structure.menuitem;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.jdom.JDOMException;
import junit.framework.TestCase;
import com.enonic.cms.framework.util.JDOMUtil;
import com.enonic.cms.core.structure.menuitem.section.SectionContentEntity;
import com.enonic.cms.core.structure.menuitem.section.SectionContentKey;
import static org.junit.Assert.*;
public class MenuItemEntityTest
extends TestCase
{
public void testGetRequestParameterValue()
throws IOException, JDOMException
{
MenuItemEntity menuItem = new MenuItemEntity();
menuItem.setXmlData( null );
assertNull( menuItem.getRequestParameterValue( "does-not-exist" ) );
String xmlData = "";
xmlData += "<data>";
xmlData += "</data>";
menuItem.setXmlData( JDOMUtil.parseDocument( xmlData ) );
assertNull( menuItem.getRequestParameterValue( "does-not-exist" ) );
xmlData = "";
xmlData += "<data>";
xmlData += "<parameters>";
xmlData += "</parameters>";
xmlData += "</data>";
menuItem.setXmlData( JDOMUtil.parseDocument( xmlData ) );
assertNull( menuItem.getRequestParameterValue( "does-not-exist" ) );
xmlData = "";
xmlData += "<data>";
xmlData += "<parameters>";
xmlData += " <parameter name='exists'>value</parameter>";
xmlData += "</parameters>";
xmlData += "</data>";
menuItem.setXmlData( JDOMUtil.parseDocument( xmlData ) );
assertNull( menuItem.getRequestParameterValue( "does-not-exist" ) );
assertEquals( "value", menuItem.getRequestParameterValue( "exists" ) );
}
public void testAddRequestParameter()
{
// override = url
MenuItemEntity menuItem = new MenuItemEntity();
menuItem.addRequestParameter( "p1", "v1", "url" );
assertEquals( "p1", menuItem.getRequestParameter( "p1" ).getName() );
assertEquals( "v1", menuItem.getRequestParameter( "p1" ).getValue() );
assertEquals( true, menuItem.getRequestParameter( "p1" ).isOverridableByRequest() );
// override = true
menuItem = new MenuItemEntity();
menuItem.addRequestParameter( "p1", "v1", "true" );
assertEquals( "p1", menuItem.getRequestParameter( "p1" ).getName() );
assertEquals( "v1", menuItem.getRequestParameter( "p1" ).getValue() );
assertEquals( true, menuItem.getRequestParameter( "p1" ).isOverridableByRequest() );
// override = false or null
menuItem = new MenuItemEntity();
menuItem.addRequestParameter( "p1", "v1", null );
menuItem.addRequestParameter( "p2", "v2", "false" );
assertEquals( "v1", menuItem.getRequestParameter( "p1" ).getValue() );
assertEquals( false, menuItem.getRequestParameter( "p1" ).isOverridableByRequest() );
assertEquals( "v2", menuItem.getRequestParameter( "p2" ).getValue() );
assertEquals( false, menuItem.getRequestParameter( "p2" ).isOverridableByRequest() );
}
public void testRemoveRequestParameters()
{
MenuItemEntity menuItem = new MenuItemEntity();
menuItem.addRequestParameter( "p1", "v1", "url" );
assertEquals( "p1", menuItem.getRequestParameter( "p1" ).getName() );
assertEquals( "v1", menuItem.getRequestParameter( "p1" ).getValue() );
assertEquals( true, menuItem.getRequestParameter( "p1" ).isOverridableByRequest() );
menuItem.removeRequestParameters();
assertEquals( 0, menuItem.getRequestParameters().size() );
assertEquals( null, menuItem.getRequestParameter( "p1" ) );
assertEquals( null, menuItem.getRequestParameterValue( "p1" ) );
}
public void testXmlDataIsUpdatedAfterAddRequestParameter()
{
MenuItemEntity menuItem = new MenuItemEntity();
menuItem.addRequestParameter( "p1", "v1", "url" );
assertEquals( "p1", menuItem.getRequestParameter( "p1" ).getName() );
assertEquals( "v1", menuItem.getRequestParameter( "p1" ).getValue() );
assertEquals( true, menuItem.getRequestParameter( "p1" ).isOverridableByRequest() );
assertEquals( "v1", JDOMUtil.evaluateSingleXPathValueAsString( "/data/parameters/parameter[ @name = 'p1' ]",
menuItem.getXmlDataAsClonedJDomDocument() ) );
}
public void testXmlDataIsUpdatedAfterRemovedRequestParameters()
{
MenuItemEntity menuItem = new MenuItemEntity();
menuItem.addRequestParameter( "p1", "v1", "url" );
assertEquals( "p1", menuItem.getRequestParameter( "p1" ).getName() );
assertEquals( "v1", menuItem.getRequestParameter( "p1" ).getValue() );
assertEquals( true, menuItem.getRequestParameter( "p1" ).isOverridableByRequest() );
assertEquals( "v1", JDOMUtil.evaluateSingleXPathValueAsString( "/data/parameters/parameter[ @name = 'p1' ]",
menuItem.getXmlDataAsClonedJDomDocument() ) );
menuItem.removeRequestParameters();
assertEquals( null, JDOMUtil.evaluateSingleXPathValueAsString( "/data/parameters/parameter[ @name = 'p1' ]",
menuItem.getXmlDataAsClonedJDomDocument() ) );
}
public void testGetChildByName()
{
MenuItemEntity parent = createMenuItem( "1", "parent", null );
MenuItemEntity child2 = createMenuItem( "3", "child2", parent );
assertEquals( child2, parent.getChildByName( "child2" ) );
}
public void testGetMenuItemPath()
{
MenuItemEntity child0 = createMenuItem( "0", "1", null );
MenuItemEntity child1 = createMenuItem( "1", "2", child0 );
MenuItemEntity child2 = createMenuItem( "2", "3", child1 );
MenuItemEntity child3 = createMenuItem( "3", "4", child2 );
List<MenuItemEntity> expectedPath = new ArrayList<MenuItemEntity>();
expectedPath.add( child0 );
expectedPath.add( child1 );
expectedPath.add( child2 );
expectedPath.add( child3 );
assertListEquals( expectedPath, child3.getMenuItemPath() );
}
public void testGetPathAsString()
{
MenuItemEntity child0 = createMenuItem( "0", "1", null );
MenuItemEntity child1 = createMenuItem( "1", "2", child0 );
MenuItemEntity child2 = createMenuItem( "2", "3", child1 );
MenuItemEntity child3 = createMenuItem( "3", "4", child2 );
assertEquals( "/1", child0.getPathAsString() );
assertEquals( "/1/2", child1.getPathAsString() );
assertEquals( "/1/2/3", child2.getPathAsString() );
assertEquals( "/1/2/3/4", child3.getPathAsString() );
}
public void testGetPath()
{
MenuItemEntity child0 = createMenuItem( "0", "1", null );
MenuItemEntity child1 = createMenuItem( "1", "2", child0 );
MenuItemEntity child2 = createMenuItem( "2", "3", child1 );
MenuItemEntity child3 = createMenuItem( "3", "4", child2 );
assertEquals( "/1", child0.getPath().toString() );
assertEquals( "/1/2", child1.getPath().toString() );
assertEquals( "/1/2/3", child2.getPath().toString() );
assertEquals( "/1/2/3/4", child3.getPath().toString() );
}
public void testGetLevel()
{
MenuItemEntity child0 = createMenuItem( "0", "1", null );
MenuItemEntity child1 = createMenuItem( "1", "2", child0 );
MenuItemEntity child2 = createMenuItem( "2", "3", child1 );
MenuItemEntity child3 = createMenuItem( "3", "4", child2 );
assertEquals( 0, child0.getLevel() );
assertEquals( 1, child1.getLevel() );
assertEquals( 2, child2.getLevel() );
assertEquals( 3, child3.getLevel() );
}
public void testGetParentAtLevel()
{
MenuItemEntity child0 = createMenuItem( "0", "1", null );
MenuItemEntity child1 = createMenuItem( "1", "2", child0 );
MenuItemEntity child2 = createMenuItem( "2", "3", child1 );
MenuItemEntity child3 = createMenuItem( "3", "4", child2 );
assertEquals( child0, child3.getParentAtLevel( 0 ) );
assertEquals( child1, child3.getParentAtLevel( 1 ) );
assertEquals( child2, child3.getParentAtLevel( 2 ) );
try
{
assertEquals( child3, child3.getParentAtLevel( 3 ) );
fail( "Expected IllegalArgumentException" );
}
catch ( IllegalArgumentException e )
{
// OK
}
}
public void testGetChildren()
{
MenuItemEntity child0 = createMenuItem( "0", "1", null );
MenuItemEntity child1 = createMenuItem( "1", "2", child0 );
MenuItemEntity child2 = createMenuItem( "2", "3", child0 );
MenuItemEntity child3 = createMenuItem( "3", "4", child0 );
List<MenuItemEntity> expectedChildren = new ArrayList<MenuItemEntity>();
expectedChildren.add( child1 );
expectedChildren.add( child2 );
expectedChildren.add( child3 );
Collection<MenuItemEntity> actualChildren = child0.getChildren();
assertNotNull( actualChildren );
assertArrayEquals( expectedChildren.toArray( new MenuItemEntity[expectedChildren.size()] ),
actualChildren.toArray( new MenuItemEntity[actualChildren.size()] ) );
}
public void testGetChildrenWithLevel()
{
// setup data
MenuItemEntity root = createMenuItem( "0", "root", null );
MenuItemEntity mi_1 = createMenuItem( "1", "0.1", root );
MenuItemEntity mi_1_1 = createMenuItem( "2", "0.1.1", mi_1 );
MenuItemEntity mi_1_2 = createMenuItem( "3", "0.1.2", mi_1 );
MenuItemEntity mi_1_2_1 = createMenuItem( "4", "0.1.2.1", mi_1_2 );
MenuItemEntity mi_2 = createMenuItem( "5", "0.2", root );
MenuItemEntity mi_2_1 = createMenuItem( "6", "0.2", mi_2 );
// Test many levels deeper
List<MenuItemEntity> expectedChildren = new ArrayList<MenuItemEntity>();
expectedChildren.add( mi_1 );
expectedChildren.add( mi_1_1 );
expectedChildren.add( mi_1_2 );
expectedChildren.add( mi_1_2_1 );
expectedChildren.add( mi_2 );
expectedChildren.add( mi_2_1 );
Collection<MenuItemEntity> actualChildren = root.getDescendants( 100 );
assertNotNull( actualChildren );
assertArrayEquals( expectedChildren.toArray( new MenuItemEntity[expectedChildren.size()] ),
actualChildren.toArray( new MenuItemEntity[actualChildren.size()] ) );
// Test level 1
expectedChildren = new ArrayList<MenuItemEntity>();
expectedChildren.add( mi_1 );
expectedChildren.add( mi_2 );
actualChildren = root.getDescendants( 1 );
assertNotNull( actualChildren );
assertArrayEquals( expectedChildren.toArray( new MenuItemEntity[expectedChildren.size()] ),
actualChildren.toArray( new MenuItemEntity[actualChildren.size()] ) );
// Test level 0
expectedChildren = new ArrayList<MenuItemEntity>();
actualChildren = root.getDescendants( 0 );
assertNotNull( actualChildren );
assertArrayEquals( expectedChildren.toArray( new MenuItemEntity[expectedChildren.size()] ),
actualChildren.toArray( new MenuItemEntity[actualChildren.size()] ) );
// Test level 2
expectedChildren = new ArrayList<MenuItemEntity>();
expectedChildren.add( mi_1 );
expectedChildren.add( mi_1_1 );
expectedChildren.add( mi_1_2 );
expectedChildren.add( mi_2 );
expectedChildren.add( mi_2_1 );
actualChildren = root.getDescendants( 2 );
assertNotNull( actualChildren );
assertArrayEquals( expectedChildren.toArray( new MenuItemEntity[expectedChildren.size()] ),
actualChildren.toArray( new MenuItemEntity[actualChildren.size()] ) );
// Test level 3
expectedChildren = new ArrayList<MenuItemEntity>();
expectedChildren.add( mi_1 );
expectedChildren.add( mi_1_1 );
expectedChildren.add( mi_1_2 );
expectedChildren.add( mi_1_2_1 );
expectedChildren.add( mi_2 );
expectedChildren.add( mi_2_1 );
actualChildren = root.getDescendants( 3 );
assertNotNull( actualChildren );
assertArrayEquals( expectedChildren.toArray( new MenuItemEntity[expectedChildren.size()] ),
actualChildren.toArray( new MenuItemEntity[actualChildren.size()] ) );
}
public void testGetLastUpdatedSectionContentTimestamp()
{
MenuItemEntity sectionMenuItem = new MenuItemEntity();
sectionMenuItem.setType( MenuItemType.SECTION );
sectionMenuItem.setSection( true );
sectionMenuItem.setOrderedSection( false );
SectionContentEntity sectionContent1 = createSectionContent( "1", sectionMenuItem, new Date( 3000 ), 0 );
SectionContentEntity sectionContent2 = createSectionContent( "2", sectionMenuItem, new Date( 5000 ), 0 );
SectionContentEntity sectionContent3 = createSectionContent( "3", sectionMenuItem, new Date( 2000 ), 0 );
Set<SectionContentEntity> secCon = new HashSet<SectionContentEntity>();
secCon.add( sectionContent1 );
secCon.add( sectionContent2 );
secCon.add( sectionContent3 );
sectionMenuItem.setSectionContent( secCon );
Date newestTimestamp = sectionMenuItem.getLastUpdatedSectionContentTimestamp();
assertEquals( new Date( 5000 ), newestTimestamp );
}
private SectionContentEntity createSectionContent( String sectionContentKey, MenuItemEntity menuItem, Date timestamp, int order )
{
SectionContentEntity entity = new SectionContentEntity();
entity.setKey( new SectionContentKey( sectionContentKey ) );
entity.setMenuItem( menuItem );
entity.setTimestamp( timestamp );
entity.setOrder( order );
return entity;
}
private MenuItemEntity createMenuItem( String key, String name, MenuItemEntity parent )
{
MenuItemEntity mi = new MenuItemEntity();
mi.setKey( new MenuItemKey( key ) );
mi.setName( name );
if ( parent != null )
{
mi.setParent( parent );
parent.addChild( mi );
}
return mi;
}
private void assertListEquals( List a, List b )
{
assertEquals( a.size(), b.size() );
for ( int i = 0; i < a.size(); i++ )
{
Object oa = a.get( i );
Object ob = b.get( i );
assertEquals( oa, ob );
}
}
}