/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.itest.portal.datasource.service;
import org.jdom.Document;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import com.enonic.cms.framework.xml.XMLDocument;
import com.enonic.cms.framework.xml.XMLDocumentFactory;
import com.enonic.cms.core.content.ContentKey;
import com.enonic.cms.core.content.ContentService;
import com.enonic.cms.core.content.ContentStatus;
import com.enonic.cms.core.content.command.CreateContentCommand;
import com.enonic.cms.core.content.contentdata.ContentData;
import com.enonic.cms.core.content.contentdata.custom.CustomContentData;
import com.enonic.cms.core.content.contentdata.custom.contentkeybased.RelatedContentDataEntry;
import com.enonic.cms.core.content.contentdata.custom.stringbased.TextDataEntry;
import com.enonic.cms.core.content.contenttype.ContentHandlerName;
import com.enonic.cms.core.content.contenttype.ContentTypeConfigBuilder;
import com.enonic.cms.core.content.contenttype.ContentTypeEntity;
import com.enonic.cms.core.portal.datasource.DataSourceContext;
import com.enonic.cms.core.security.user.User;
import com.enonic.cms.core.portal.datasource.service.DataSourceServiceImpl;
import com.enonic.cms.core.servlet.ServletRequestAccessor;
import com.enonic.cms.core.time.MockTimeService;
import com.enonic.cms.itest.AbstractSpringTest;
import com.enonic.cms.itest.util.DomainFactory;
import com.enonic.cms.itest.util.DomainFixture;
import com.enonic.cms.store.dao.ContentDao;
import com.enonic.cms.store.dao.UserDao;
import static com.enonic.cms.itest.util.AssertTool.assertXPathEquals;
import static com.enonic.cms.itest.util.AssertTool.assertXPathExist;
public class DatasourceServiceImpl_getIndexValuesTest
extends AbstractSpringTest
{
private static final DateTime DATE_TIME_2010_07_01_12_00_00_0 = new DateTime( 2010, 7, 1, 12, 0, 0, 0 );
private DomainFactory factory;
@Autowired
private DomainFixture fixture;
private DataSourceServiceImpl dataSourceService;
@Autowired
private ContentService contentService;
@Autowired
private ContentDao contentDao;
@Autowired
private UserDao userDao;
private Document personConfigAsXmlBytes;
private MockHttpServletRequest httpRequest;
@Before
public void setUp()
{
factory = fixture.getFactory();
// setup needed common data for each test
fixture.initSystemData();
fixture.save( factory.createContentHandler( "Custom content", ContentHandlerName.CUSTOM.getHandlerClassShortName() ) );
httpRequest = new MockHttpServletRequest( "GET", "/" );
ServletRequestAccessor.setRequest( httpRequest );
fixture.save( factory.createUnit( "MyUnit", "en" ) );
fixture.createAndStoreNormalUserWithUserGroup( "content-creator", "Creator", "testuserstore" );
fixture.createAndStoreNormalUserWithUserGroup( "content-querier", "Querier", "testuserstore" );
// setup content type: Person
ContentTypeConfigBuilder ctyconf = new ContentTypeConfigBuilder( "Person", "name" );
ctyconf.startBlock( "Person" );
ctyconf.addInput( "name", "text", "contentdata/name", "Name", true );
ctyconf.addRelatedContentInput( "my-relatedcontent", "contentdata/my-relatedcontent", "My relatedcontent", false, false );
ctyconf.addRelatedContentInput( "my-relatedcontents", "contentdata/my-relatedcontents", "My relatedcontents", false, true );
ctyconf.endBlock();
personConfigAsXmlBytes = XMLDocumentFactory.create( ctyconf.toString() ).getAsJDOMDocument();
fixture.save(
factory.createContentType( "MyPersonType", ContentHandlerName.CUSTOM.getHandlerClassShortName(), personConfigAsXmlBytes ) );
fixture.save(
factory.createCategory( "MyPersonCategory", null, "MyPersonType", "MyUnit", User.ANONYMOUS_UID, User.ANONYMOUS_UID, false ) );
fixture.save( factory.createCategoryAccessForUser( "MyPersonCategory", "content-creator", "read, create, approve, admin_browse" ) );
fixture.save( factory.createCategoryAccessForUser( "MyPersonCategory", "content-querier", "read, admin_browse" ) );
// setup content type: Related
ContentTypeConfigBuilder ctyconfMyRelated = new ContentTypeConfigBuilder( "MyRelatedType", "title" );
ctyconfMyRelated.startBlock( "General" );
ctyconfMyRelated.addInput( "title", "text", "contentdata/title", "Title", true );
ctyconfMyRelated.addRelatedContentInput( "myRelatedContent", "contentdata/myRelatedContent", "My related content", false, true );
ctyconfMyRelated.endBlock();
Document myRelatedconfigAsXmlBytes = XMLDocumentFactory.create( ctyconfMyRelated.toString() ).getAsJDOMDocument();
fixture.save(
factory.createContentType( "MyRelatedType", ContentHandlerName.CUSTOM.getHandlerClassShortName(), myRelatedconfigAsXmlBytes ) );
fixture.save(
factory.createCategory( "MyRelatedCategory", null, "MyRelatedType", "MyUnit", User.ANONYMOUS_UID, User.ANONYMOUS_UID, false ) );
fixture.save(
factory.createCategoryAccessForUser( "MyRelatedCategory", "content-creator", "read, create, approve, admin_browse" ) );
fixture.save( factory.createCategoryAccessForUser( "MyRelatedCategory", "content-querier", "read, admin_browse" ) );
dataSourceService = new DataSourceServiceImpl();
dataSourceService.setUserDao( userDao );
dataSourceService.setContentDao( contentDao );
dataSourceService.setContentService( contentService );
dataSourceService.setTimeService( new MockTimeService( DATE_TIME_2010_07_01_12_00_00_0 ) );
fixture.flushIndexTransaction();
}
@Test
public void getIndexValuesOrder_ASC_Test()
{
ContentKey requested1Grandchild1 = createPersonContent( "Grandchild of 1" );
ContentKey requested1Child1 = createPersonContentWithRelatedContent( "Child of 1", requested1Grandchild1 );
ContentKey requested2Child1 = createPersonContent( "Child of 2" );
ContentKey requested1 = createPersonContentWithRelatedContent( "Requested content 1", requested1Child1 );
ContentKey requested2 = createPersonContentWithRelatedContent( "Requested content 2", requested2Child1 );
// Exercise
final String indexPath = "title";
final String order = "ASC";
XMLDocument resultAsXMLDocument = getIndexValues( order, indexPath );
// verify
Document docResult = resultAsXMLDocument.getAsJDOMDocument();
assertXPathExist( "/index", docResult );
assertXPathExist( "/index/values", docResult );
assertXPathExist( "/index/values/value", docResult );
assertXPathEquals( "/index/@path", docResult, indexPath );
assertXPathEquals( "/index/values/@count", docResult, 5 );
assertXPathEquals( "/index/values/@totalcount", docResult, 5 );
assertXPathEquals( "/index/values/@index", docResult, 0 );
assertXPathEquals( "/index/values/value[1]/@contentkey", docResult, requested1Child1.toInt() );
assertXPathEquals( "/index/values/value[2]/@contentkey", docResult, requested2Child1.toInt() );
assertXPathEquals( "/index/values/value[3]/@contentkey", docResult, requested1Grandchild1.toInt() );
assertXPathEquals( "/index/values/value[4]/@contentkey", docResult, requested1.toInt() );
assertXPathEquals( "/index/values/value[5]/@contentkey", docResult, requested2.toInt() );
assertXPathEquals( "/index/values/value[1]/text()", docResult, "child of 1" );
assertXPathEquals( "/index/values/value[5]/text()", docResult, "requested content 2" );
}
@Test
public void getIndexValuesOrder_DESC_Test()
{
ContentKey requested1Grandchild1 = createPersonContent( "Grandchild of 1" );
ContentKey requested1Child1 = createPersonContentWithRelatedContent( "Child of 1", requested1Grandchild1 );
ContentKey requested2Child1 = createPersonContent( "Child of 2" );
ContentKey requested1 = createPersonContentWithRelatedContent( "Requested content 1", requested1Child1 );
ContentKey requested2 = createPersonContentWithRelatedContent( "Requested content 2", requested2Child1 );
// Exercise
final String indexPath = "title";
final String order = "DESC";
XMLDocument resultAsXMLDocument = getIndexValues( order, indexPath );
// verify
Document docResult = resultAsXMLDocument.getAsJDOMDocument();
assertXPathExist( "/index", docResult );
assertXPathExist( "/index/values", docResult );
assertXPathExist( "/index/values/value", docResult );
assertXPathEquals( "/index/@path", docResult, indexPath );
assertXPathEquals( "/index/values/@count", docResult, 5 );
assertXPathEquals( "/index/values/@totalcount", docResult, 5 );
assertXPathEquals( "/index/values/@index", docResult, 0 );
assertXPathEquals( "/index/values/value[5]/@contentkey", docResult, requested1Child1.toInt() );
assertXPathEquals( "/index/values/value[4]/@contentkey", docResult, requested2Child1.toInt() );
assertXPathEquals( "/index/values/value[3]/@contentkey", docResult, requested1Grandchild1.toInt() );
assertXPathEquals( "/index/values/value[2]/@contentkey", docResult, requested1.toInt() );
assertXPathEquals( "/index/values/value[1]/@contentkey", docResult, requested2.toInt() );
assertXPathEquals( "/index/values/value[5]/text()", docResult, "child of 1" );
assertXPathEquals( "/index/values/value[1]/text()", docResult, "requested content 2" );
}
private XMLDocument getIndexValues( final String order, final String indexPath )
{
final DataSourceContext context = new DataSourceContext();
context.setUser( fixture.findUserByName( "content-querier" ) );
final int[] categories = new int[]{fixture.findCategoryByName( "MyPersonCategory" ).getKey().toInt()};
final boolean includeSubCategories = true;
final int index = 0;
final int count = 10;
final boolean distinct = false;
final ContentTypeEntity personContentType = fixture.findContentTypeByName( "MyPersonType" );
final int[] contentTypes = new int[]{personContentType.getKey()};
return dataSourceService.getIndexValues( context, indexPath, categories, includeSubCategories, contentTypes, index, count, distinct,
order );
}
private ContentKey createPersonContent( String name )
{
return createPersonContentWithRelatedContent( name, ContentStatus.APPROVED, null );
}
private ContentKey createPersonContentWithRelatedContent( String name, ContentKey relatedContent )
{
return createPersonContentWithRelatedContent( name, ContentStatus.APPROVED, relatedContent );
}
private ContentKey createPersonContentWithRelatedContent( String name, ContentStatus status, ContentKey relatedContent )
{
CustomContentData contentData = new CustomContentData( fixture.findContentTypeByName( "MyPersonType" ).getContentTypeConfig() );
contentData.add( new TextDataEntry( contentData.getInputConfig( "name" ), name ) );
if ( relatedContent != null )
{
contentData.add( new RelatedContentDataEntry( contentData.getInputConfig( "my-relatedcontent" ), relatedContent ) );
}
ContentKey expectedContentKey = contentService.createContent(
createCreateContentCommand( "MyPersonCategory", "content-creator", status, contentData, new DateTime( 2010, 1, 1, 0, 0, 0, 0 ),
null ) );
fixture.flushIndexTransaction();
return expectedContentKey;
}
private CreateContentCommand createCreateContentCommand( String categoryName, String creatorUid, ContentStatus contentStatus,
ContentData contentData, DateTime availableFrom, DateTime availableTo )
{
CreateContentCommand createContentCommand = new CreateContentCommand();
createContentCommand.setCategory( fixture.findCategoryByName( categoryName ) );
createContentCommand.setCreator( fixture.findUserByName( creatorUid ).getKey() );
createContentCommand.setLanguage( fixture.findLanguageByCode( "en" ) );
createContentCommand.setStatus( contentStatus );
createContentCommand.setPriority( 0 );
createContentCommand.setAccessRightsStrategy( CreateContentCommand.AccessRightsStrategy.INHERIT_FROM_CATEGORY );
createContentCommand.setContentData( contentData );
createContentCommand.setContentName( "testcontent" );
if ( availableFrom != null )
{
createContentCommand.setAvailableFrom( availableFrom.toDate() );
}
if ( availableTo != null )
{
createContentCommand.setAvailableTo( availableTo.toDate() );
}
return createContentCommand;
}
}