/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.itest.client; import java.io.IOException; import java.util.Date; import org.jdom.Document; import org.jdom.JDOMException; import org.joda.time.DateTime; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.mock.web.MockHttpServletRequest; import com.enonic.cms.framework.xml.XMLDocumentFactory; import com.enonic.cms.api.client.model.AssignContentParams; import com.enonic.cms.api.client.model.CreateContentParams; import com.enonic.cms.api.client.model.UnassignContentParams; import com.enonic.cms.api.client.model.UpdateContentParams; import com.enonic.cms.api.client.model.content.ContentDataInput; import com.enonic.cms.api.client.model.content.ContentStatus; import com.enonic.cms.api.client.model.content.TextInput; import com.enonic.cms.core.client.InternalClient; import com.enonic.cms.core.content.ContentEntity; import com.enonic.cms.core.content.ContentKey; import com.enonic.cms.core.content.ContentService; import com.enonic.cms.core.content.ContentVersionEntity; import com.enonic.cms.core.content.ContentVersionKey; import com.enonic.cms.core.content.command.AssignContentCommand; import com.enonic.cms.core.content.command.CreateContentCommand; 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.dataentryconfig.TextDataEntryConfig; import com.enonic.cms.core.security.PortalSecurityHolder; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.core.security.user.UserType; import com.enonic.cms.core.servlet.ServletRequestAccessor; 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.ContentVersionDao; import static org.junit.Assert.*; public class InternalClientImpl_AssignContentTest extends AbstractSpringTest { private DomainFactory factory; @Autowired private DomainFixture fixture; @Autowired private ContentDao contentDao; @Autowired private ContentService contentService; @Autowired private ContentVersionDao contentVersionDao; @Autowired @Qualifier("localClient") private InternalClient internalClient; private Document standardConfig; @Before public void before() throws IOException, JDOMException { factory = fixture.getFactory(); fixture.initSystemData(); MockHttpServletRequest request = new MockHttpServletRequest(); request.setRemoteAddr( "127.0.0.1" ); ServletRequestAccessor.setRequest( request ); createContentTypeXml(); saveNeededEntities(); UserEntity runningUser = fixture.findUserByName( "testuser" ); PortalSecurityHolder.setImpersonatedUser( runningUser.getKey() ); } private void saveNeededEntities() { // prepare: save needed entities fixture.createAndStoreUserAndUserGroup( "testuser", "testuser fullname", UserType.NORMAL, "testuserstore" ); fixture.save( factory.createContentHandler( "Custom content", ContentHandlerName.CUSTOM.getHandlerClassShortName() ) ); fixture.save( factory.createContentType( "MyContentType", ContentHandlerName.CUSTOM.getHandlerClassShortName(), standardConfig ) ); fixture.save( factory.createUnit( "MyUnit", "en" ) ); fixture.save( factory.createCategory( "MyCategory", null, "MyContentType", "MyUnit", "testuser", "testuser" ) ); fixture.save( factory.createCategoryAccessForUser( "MyCategory", "testuser", "read, create, approve" ) ); fixture.flushAndClearHibernateSession(); } @Test public void testUpdateContentDoNotChangeAssignment() { ContentKey contentKey = createUpdateContent(); AssignContentCommand assignContentCommand = new AssignContentCommand(); assignContentCommand.setAssignerKey( fixture.findUserByName( "testuser" ).getKey() ); assignContentCommand.setAssigneeKey( fixture.findUserByName( "testuser" ).getKey() ); assignContentCommand.setAssignmentDescription( "test assignment" ); assignContentCommand.setAssignmentDueDate( new DateTime( 2010, 6, 6, 10, 0, 0, 0 ).toDate() ); assignContentCommand.setContentKey( contentKey ); contentService.assignContent( assignContentCommand ); ContentDataInput newContentData = new ContentDataInput( "MyContentType" ); newContentData.add( new TextInput( "myTitle", "changedtitle" ) ); UserEntity runningUser = fixture.findUserByName( "testuser" ); PortalSecurityHolder.setImpersonatedUser( runningUser.getKey() ); UpdateContentParams params = new UpdateContentParams(); params.contentKey = contentKey.toInt(); params.contentData = newContentData; params.publishFrom = new Date(); params.publishTo = null; params.createNewVersion = false; params.status = ContentStatus.STATUS_DRAFT; int contentVersionKey = internalClient.updateContent( params ); fixture.flushAndClearHibernateSession(); ContentVersionEntity actualVersion = contentVersionDao.findByKey( new ContentVersionKey( contentVersionKey ) ); ContentEntity persistedContent = contentDao.findByKey( actualVersion.getContent().getKey() ); assertEquals( runningUser, persistedContent.getAssignee() ); assertEquals( runningUser, persistedContent.getAssigner() ); assertEquals( "test assignment", persistedContent.getAssignmentDescription() ); assertEquals( new DateTime( 2010, 6, 6, 10, 0, 0, 0 ).toDate(), persistedContent.getAssignmentDueDate() ); } @Test public void testCreateAndAssignContent() { ContentDataInput contentData = new ContentDataInput( "MyContentType" ); contentData.add( new TextInput( "myTitle", "testtitle" ) ); CreateContentParams params = new CreateContentParams(); params.categoryKey = fixture.findCategoryByName( "MyCategory" ).getKey().toInt(); params.contentData = contentData; params.publishFrom = new Date(); params.publishTo = null; params.status = ContentStatus.STATUS_DRAFT; int contentKey = internalClient.createContent( params ); UserEntity runningUser = fixture.findUserByName( "testuser" ); PortalSecurityHolder.setImpersonatedUser( runningUser.getKey() ); AssignContentParams assignContentParams = new AssignContentParams(); assignContentParams.assignee = createClientUserQualifiedName( runningUser ); assignContentParams.assignmentDescription = "test assignment"; assignContentParams.assignmentDueDate = new DateTime( 2010, 6, 6, 10, 0, 0, 0 ).toDate(); assignContentParams.contentKey = contentKey; internalClient.assignContent( assignContentParams ); fixture.flushAndClearHibernateSession(); ContentEntity persistedContent = contentDao.findByKey( new ContentKey( contentKey ) ); assertEquals( runningUser, persistedContent.getAssignee() ); assertEquals( runningUser, persistedContent.getAssigner() ); assertEquals( "test assignment", persistedContent.getAssignmentDescription() ); assertEquals( new DateTime( 2010, 6, 6, 10, 0, 0, 0 ).toDate(), persistedContent.getAssignmentDueDate() ); } @Test public void testUnassignContent() { UserEntity testUser = fixture.findUserByName( "testuser" ); ContentKey contentKey = createUpdateContent(); AssignContentCommand assignContentCommand = new AssignContentCommand(); assignContentCommand.setAssignerKey( testUser.getKey() ); assignContentCommand.setAssigneeKey( testUser.getKey() ); assignContentCommand.setAssignmentDescription( "test assignment" ); assignContentCommand.setAssignmentDueDate( new DateTime( 2010, 6, 6, 10, 0, 0, 0 ).toDate() ); assignContentCommand.setContentKey( contentKey ); contentService.assignContent( assignContentCommand ); fixture.flushAndClearHibernateSession(); ContentEntity persistedContent = contentDao.findByKey( contentKey ); assertEquals( testUser, persistedContent.getAssignee() ); assertEquals( testUser, persistedContent.getAssigner() ); assertEquals( "test assignment", persistedContent.getAssignmentDescription() ); assertEquals( new DateTime( 2010, 6, 6, 10, 0, 0, 0 ).toDate(), persistedContent.getAssignmentDueDate() ); UnassignContentParams unassignContentparams = new UnassignContentParams(); unassignContentparams.contentKey = contentKey.toInt(); internalClient.unassignContent( unassignContentparams ); fixture.flushAndClearHibernateSession(); persistedContent = contentDao.findByKey( contentKey ); assertNull( persistedContent.getAssignee() ); assertNull( persistedContent.getAssigner() ); assertNull( persistedContent.getAssignmentDescription() ); assertNull( persistedContent.getAssignmentDueDate() ); } private ContentKey createUpdateContent() { UserEntity runningUser = fixture.findUserByName( "testuser" ); // prepare: save a new content CustomContentData contentData = new CustomContentData( fixture.findContentTypeByName( "MyContentType" ).getContentTypeConfig() ); TextDataEntryConfig titleConfig = (TextDataEntryConfig) contentData.getContentTypeConfig().getForm().getInputConfig( "myTitle" ); contentData.add( new TextDataEntry( titleConfig, "testitle" ) ); CreateContentCommand createContentCommand = new CreateContentCommand(); createContentCommand.setCreator( runningUser ); createContentCommand.setAvailableFrom( new DateTime( 2010, 1, 1, 0, 0, 0, 0 ).toDate() ); createContentCommand.setAccessRightsStrategy( CreateContentCommand.AccessRightsStrategy.USE_GIVEN ); createContentCommand.setPriority( 0 ); createContentCommand.setStatus( com.enonic.cms.core.content.ContentStatus.DRAFT ); createContentCommand.setLanguage( fixture.findLanguageByCode( "en" ).getKey() ); createContentCommand.setCategory( fixture.findCategoryByName( "MyCategory" ).getKey() ); createContentCommand.setContentData( contentData ); createContentCommand.setContentName( "testcontent" ); ContentKey contentKey = contentService.createContent( createContentCommand ); fixture.flushAndClearHibernateSession(); return contentKey; } private void createContentTypeXml() { StringBuilder standardConfigXml = new StringBuilder(); standardConfigXml.append( "<config name=\"MyContentType\" version=\"1.0\">" ); standardConfigXml.append( " <form>" ); standardConfigXml.append( " <title name=\"myTitle\"/>" ); standardConfigXml.append( " <block name=\"TestBlock1\">" ); standardConfigXml.append( " <input name=\"myTitle\" required=\"true\" type=\"text\">" ); standardConfigXml.append( " <display>My title</display>" ); standardConfigXml.append( " <xpath>contentdata/mytitle</xpath>" ); standardConfigXml.append( " </input>" ); standardConfigXml.append( " </block>" ); standardConfigXml.append( " </form>" ); standardConfigXml.append( "</config>" ); standardConfig = XMLDocumentFactory.create( standardConfigXml.toString() ).getAsJDOMDocument(); } private String createClientUserQualifiedName( UserEntity user ) { return user.getUserStoreKey().toString() + ":" + user.getUserGroup().getName(); } }