/*
* 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.AssignContentCommand;
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.stringbased.TextDataEntry;
import com.enonic.cms.core.content.contenttype.ContentHandlerName;
import com.enonic.cms.core.content.contenttype.ContentTypeConfigBuilder;
import com.enonic.cms.core.portal.datasource.DataSourceContext;
import com.enonic.cms.core.portal.datasource.DataSourceException;
import com.enonic.cms.core.portal.datasource.service.DataSourceServiceImpl;
import com.enonic.cms.core.security.user.User;
import com.enonic.cms.core.security.user.UserEntity;
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.AssertTool;
import com.enonic.cms.itest.util.DomainFactory;
import com.enonic.cms.itest.util.DomainFixture;
import com.enonic.cms.store.dao.UserDao;
import static org.junit.Assert.*;
public class DataSourceServiceImpl_getContentByCategory_queryTest
extends AbstractSpringTest
{
private DomainFactory factory;
@Autowired
private DomainFixture fixture;
@Autowired
private UserDao userDao;
private DataSourceServiceImpl dataSourceService;
@Autowired
private ContentService contentService;
@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() ) );
MockHttpServletRequest httpRequest = new MockHttpServletRequest( "GET", "/" );
ServletRequestAccessor.setRequest( httpRequest );
dataSourceService = new DataSourceServiceImpl();
dataSourceService.setContentService( contentService );
dataSourceService.setTimeService( new MockTimeService( new DateTime( 2010, 7, 1, 12, 0, 0, 0 ) ) );
dataSourceService.setUserDao( userDao );
}
@Test
public void query_content_on_qualifiedName()
{
// setup content type
ContentTypeConfigBuilder ctyconf = new ContentTypeConfigBuilder( "Person", "name" );
ctyconf.startBlock( "Person" );
ctyconf.addInput( "name", "text", "contentdata/name", "Name", true );
ctyconf.endBlock();
Document configAsXmlBytes = XMLDocumentFactory.create( ctyconf.toString() ).getAsJDOMDocument();
// setup content type, unit category, users, and rights
fixture.save(
factory.createContentType( "MyContentType", ContentHandlerName.CUSTOM.getHandlerClassShortName(), configAsXmlBytes ) );
fixture.save( factory.createUnit( "MyUnit", "en" ) );
fixture.save(
factory.createCategory( "MyCategory", null, "MyContentType", "MyUnit", User.ANONYMOUS_UID, User.ANONYMOUS_UID, false ) );
fixture.createAndStoreNormalUserWithUserGroup( "content-creator", "Creator", "testuserstore" );
fixture.createAndStoreNormalUserWithUserGroup( "content-querier", "Creator", "testuserstore" );
fixture.save( factory.createCategoryAccessForUser( "MyCategory", "content-creator", "read, create, approve, admin_browse" ) );
fixture.save( factory.createCategoryAccessForUser( "MyCategory", "content-querier", "read, admin_browse" ) );
fixture.flushAndClearHibernateSession();
fixture.flushIndexTransaction();
// setup content assigned to content-creator
CustomContentData contentData = new CustomContentData( fixture.findContentTypeByName( "MyContentType" ).getContentTypeConfig() );
contentData.add( new TextDataEntry( contentData.getInputConfig( "name" ), "Test Dummy" ) );
ContentKey expectedContentKey = contentService.createContent(
createCreateContentCommand( "MyCategory", "content-creator", ContentStatus.APPROVED, new DateTime( 2020, 1, 1, 0, 0, 0, 0 ),
"content-creator", contentData, new DateTime( 2010, 1, 1, 0, 0, 0, 0 ), null ) );
fixture.flushIndexTransaction();
UserEntity contentCreator = fixture.findUserByName( "content-creator" );
AssignContentCommand assignCommand = new AssignContentCommand();
assignCommand.setAssigneeKey( contentCreator.getKey() );
assignCommand.setAssignerKey( contentCreator.getKey() );
assignCommand.setContentKey( expectedContentKey );
contentService.assignContent( assignCommand );
fixture.flushIndexTransaction();
// setup another content assigned to some one else
contentService.createContent(
createCreateContentCommand( "MyCategory", User.ROOT_UID, ContentStatus.APPROVED, new DateTime( 2020, 1, 1, 0, 0, 0, 0 ),
User.ROOT_UID, contentData, new DateTime( 2010, 1, 1, 0, 0, 0, 0 ), null ) );
fixture.flushIndexTransaction();
// setup: verify that 2 content is created
assertEquals( 2, fixture.countAllContent() );
// exercise
DataSourceContext context = new DataSourceContext();
context.setUser( fixture.findUserByName( "content-querier" ) );
int[] categoryKeys = new int[]{fixture.findCategoryByName( "MyCategory" ).getKey().toInt()};
int levels = 1;
String query = "assignee/qualifiedName = '" + fixture.findUserByName( "content-creator" ).getQualifiedName().toString() + "'";
String orderyBy = "";
int index = 0;
int count = 100;
boolean includeData = false;
int childrenLevel = 0;
int parentLevel = 0;
XMLDocument xmlDocResult =
dataSourceService.getContentByCategory( context, categoryKeys, levels, query, orderyBy, index, count, includeData,
childrenLevel, parentLevel, false, null );
// verify
AssertTool.assertXPathEquals( "/contents/content/@key", xmlDocResult.getAsJDOMDocument(),
new String[]{expectedContentKey.toString()} );
}
@Test
public void query_content_with_filterOnUser()
{
// setup content type
ContentTypeConfigBuilder ctyconf = new ContentTypeConfigBuilder( "Person", "name" );
ctyconf.startBlock( "Person" );
ctyconf.addInput( "name", "text", "contentdata/name", "Name", true );
ctyconf.endBlock();
Document configAsXmlBytes = XMLDocumentFactory.create( ctyconf.toString() ).getAsJDOMDocument();
// setup content type, unit category, users, and rights
fixture.save(
factory.createContentType( "MyContentType", ContentHandlerName.CUSTOM.getHandlerClassShortName(), configAsXmlBytes ) );
fixture.save( factory.createUnit( "MyUnit", "en" ) );
fixture.save(
factory.createCategory( "MyCategory", null, "MyContentType", "MyUnit", User.ANONYMOUS_UID, User.ANONYMOUS_UID, false ) );
fixture.createAndStoreNormalUserWithUserGroup( "content-creator", "Creator", "testuserstore" );
fixture.createAndStoreNormalUserWithUserGroup( "content-querier", "Creator", "testuserstore" );
fixture.save( factory.createCategoryAccessForUser( "MyCategory", "content-creator", "read, create, approve, admin_browse" ) );
fixture.save( factory.createCategoryAccessForUser( "MyCategory", "content-querier", "read, create, approve, admin_browse" ) );
fixture.flushAndClearHibernateSession();
fixture.flushIndexTransaction();
// setup content assigned to content-creator
CustomContentData contentData = new CustomContentData( fixture.findContentTypeByName( "MyContentType" ).getContentTypeConfig() );
contentData.add( new TextDataEntry( contentData.getInputConfig( "name" ), "Test Dummy" ) );
contentService.createContent(
createCreateContentCommand( "MyCategory", "content-creator", ContentStatus.APPROVED, new DateTime( 2020, 1, 1, 0, 0, 0, 0 ),
"content-creator", contentData, new DateTime( 2010, 1, 1, 0, 0, 0, 0 ), null ) );
// setup another content assigned to some one else
contentService.createContent(
createCreateContentCommand( "MyCategory", User.ROOT_UID, ContentStatus.APPROVED, new DateTime( 2020, 1, 1, 0, 0, 0, 0 ),
User.ROOT_UID, contentData, new DateTime( 2010, 1, 1, 0, 0, 0, 0 ), null ) );
// Add content with owner = content-querier
ContentKey expectedContentKey = contentService.createContent(
createCreateContentCommand( "MyCategory", "content-querier", ContentStatus.APPROVED, new DateTime( 2020, 1, 1, 0, 0, 0, 0 ),
User.ROOT_UID, contentData, new DateTime( 2010, 1, 1, 0, 0, 0, 0 ), null ) );
fixture.flushIndexTransaction();
// setup: verify that 2 content is created
assertEquals( 3, fixture.countAllContent() );
// exercise
DataSourceContext context = new DataSourceContext();
context.setUser( fixture.findUserByName( "content-querier" ) );
int[] categoryKeys = new int[]{fixture.findCategoryByName( "MyCategory" ).getKey().toInt()};
int levels = 1;
String query = "status = 2";
String orderyBy = "";
int index = 0;
int count = 100;
boolean includeData = false;
int childrenLevel = 0;
int parentLevel = 0;
boolean filterOnUser = true;
XMLDocument xmlDocResult =
dataSourceService.getContentByCategory( context, categoryKeys, levels, query, orderyBy, index, count, includeData,
childrenLevel, parentLevel, filterOnUser, null );
// verify
AssertTool.assertXPathEquals( "/contents/content/@key", xmlDocResult.getAsJDOMDocument(),
new String[]{expectedContentKey.toString()} );
}
@Test(expected = DataSourceException.class)
public void testIndexGreaterThanZeroRequirement()
{
// setup content type
ContentTypeConfigBuilder ctyconf = new ContentTypeConfigBuilder( "Person", "name" );
ctyconf.startBlock( "Person" );
ctyconf.addInput( "name", "text", "contentdata/name", "Name", true );
ctyconf.endBlock();
Document configAsXmlBytes = XMLDocumentFactory.create( ctyconf.toString() ).getAsJDOMDocument();
// setup content type, unit category, users, and rights
fixture.save(
factory.createContentType( "MyContentType", ContentHandlerName.CUSTOM.getHandlerClassShortName(), configAsXmlBytes ) );
fixture.save( factory.createUnit( "MyUnit", "en" ) );
fixture.save(
factory.createCategory( "MyCategory", null, "MyContentType", "MyUnit", User.ANONYMOUS_UID, User.ANONYMOUS_UID, false ) );
fixture.createAndStoreNormalUserWithUserGroup( "content-creator", "Creator", "testuserstore" );
fixture.createAndStoreNormalUserWithUserGroup( "content-querier", "Creator", "testuserstore" );
fixture.save( factory.createCategoryAccessForUser( "MyCategory", "content-creator", "read, create, approve, admin_browse" ) );
fixture.save( factory.createCategoryAccessForUser( "MyCategory", "content-querier", "read, create, approve, admin_browse" ) );
fixture.flushAndClearHibernateSession();
fixture.flushIndexTransaction();
// setup content assigned to content-creator
CustomContentData contentData = new CustomContentData( fixture.findContentTypeByName( "MyContentType" ).getContentTypeConfig() );
contentData.add( new TextDataEntry( contentData.getInputConfig( "name" ), "Test Dummy" ) );
contentService.createContent(
createCreateContentCommand( "MyCategory", "content-creator", ContentStatus.APPROVED, new DateTime( 2020, 1, 1, 0, 0, 0, 0 ),
"content-creator", contentData, new DateTime( 2010, 1, 1, 0, 0, 0, 0 ), null ) );
// setup another content assigned to some one else
contentService.createContent(
createCreateContentCommand( "MyCategory", User.ROOT_UID, ContentStatus.APPROVED, new DateTime( 2020, 1, 1, 0, 0, 0, 0 ),
User.ROOT_UID, contentData, new DateTime( 2010, 1, 1, 0, 0, 0, 0 ), null ) );
// Add content with owner = content-querier
ContentKey expectedContentKey = contentService.createContent(
createCreateContentCommand( "MyCategory", "content-querier", ContentStatus.APPROVED, new DateTime( 2020, 1, 1, 0, 0, 0, 0 ),
User.ROOT_UID, contentData, new DateTime( 2010, 1, 1, 0, 0, 0, 0 ), null ) );
fixture.flushIndexTransaction();
DataSourceContext context = new DataSourceContext();
context.setUser( fixture.findUserByName( "content-querier" ) );
int[] categoryKeys = new int[]{fixture.findCategoryByName( "MyCategory" ).getKey().toInt()};
int levels = 1;
String query = "status = 2";
String orderyBy = "";
int index = -1;
int count = 100;
boolean includeData = false;
int childrenLevel = 0;
int parentLevel = 0;
boolean filterOnUser = true;
XMLDocument xmlDocResult =
dataSourceService.getContentByCategory( context, categoryKeys, levels, query, orderyBy, index, count, includeData,
childrenLevel, parentLevel, filterOnUser, null );
}
private CreateContentCommand createCreateContentCommand( String categoryName, String creatorUid, ContentStatus contentStatus,
DateTime dueDate, String assigneeUserName, 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;
}
}