/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.itest.content.imports; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Calendar; import org.apache.commons.io.IOUtils; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.mock.web.MockHttpServletRequest; import com.enonic.cms.framework.xml.XMLDocumentFactory; 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.ContentStatus; import com.enonic.cms.core.content.command.AssignContentCommand; import com.enonic.cms.core.content.command.CreateContentCommand; import com.enonic.cms.core.content.command.ImportContentCommand; 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.ContentTypeConfig; import com.enonic.cms.core.content.contenttype.ContentTypeEntity; import com.enonic.cms.core.content.imports.ImportJob; import com.enonic.cms.core.content.imports.ImportJobFactory; import com.enonic.cms.core.content.imports.ImportResult; import com.enonic.cms.core.security.PortalSecurityHolder; 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.itest.AbstractSpringTest; import com.enonic.cms.itest.util.DomainFactory; import com.enonic.cms.itest.util.DomainFixture; import com.enonic.cms.store.dao.ContentDao; import static junit.framework.Assert.assertNull; import static org.junit.Assert.*; public class ImportServiceImplTest_handleAssignmentOnImport extends AbstractSpringTest { private DomainFactory factory; @Autowired private DomainFixture fixture; @Autowired private ImportJobFactory importJobFactory; @Autowired private ContentService contentService; @Autowired private ContentDao contentDao; private String personContentTypeXml; @Before public void setUp() throws IOException { personContentTypeXml = resourceToString( new ClassPathResource( "com/enonic/cms/itest/content/imports/personContentType.xml" ) ); factory = fixture.getFactory(); fixture.initSystemData(); fixture.createAndStoreNormalUserWithUserGroup( "testuser", "Test user", "testuserstore" ); fixture.save( factory.createContentHandler( "MyHandler", ContentHandlerName.CUSTOM.getHandlerClassShortName() ) ); fixture.save( factory.createContentType( "PersonCty", ContentHandlerName.CUSTOM.getHandlerClassShortName(), XMLDocumentFactory.create( personContentTypeXml ).getAsJDOMDocument() ) ); fixture.save( factory.createUnit( "MyUnit" ) ); fixture.save( factory.createCategory( "Persons", null, "PersonCty", "MyUnit", "testuser", "testuser" ) ); fixture.save( factory.createCategoryAccessForUser( "Persons", "testuser", "read, create, approve" ) ); MockHttpServletRequest request = new MockHttpServletRequest(); request.setRemoteAddr( "127.0.0.1" ); ServletRequestAccessor.setRequest( request ); PortalSecurityHolder.setAnonUser( fixture.findUserByName( User.ANONYMOUS_UID ).getKey() ); PortalSecurityHolder.setLoggedInUser( fixture.findUserByName( "testuser" ).getKey() ); PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "testuser" ).getKey() ); ImportJobFactory.setExecuteInOneTransaction( true ); } @Test public void import_create_content_status_draft_with_assignment() throws Exception { // setup content type with needed import configuration String importsConfig = ""; importsConfig += "<imports>"; importsConfig += "<import base='/persons/person' mode='xml' name='xml-import-without-status-without-sync'>"; importsConfig += " <mapping src='@id' dest='person-no'/>"; importsConfig += " <mapping src='name' dest='name'/>"; importsConfig += "</import>"; importsConfig += "</imports>"; String changedContentTypeXml = personContentTypeXml.replace( "<imports/>", importsConfig ); updateContentType( "PersonCty", changedContentTypeXml ); String importData = ""; importData += "<persons>"; importData += " <person id='1001'>"; importData += " <name>Jørund Vier Skriubakken</name>"; importData += " </person>"; importData += " <person id='1002'>"; importData += " <name>Ane Skriubakken</name>"; importData += " </person>"; importData += "</persons>"; // exercise ImportContentCommand command = new ImportContentCommand(); command.importer = fixture.findUserByName( "testuser" ); command.categoryToImportTo = fixture.findCategoryByName( "Persons" ); command.importName = "xml-import-without-status-without-sync"; command.inputStream = new ByteArrayInputStream( importData.getBytes( "UTF-8" ) ); command.assigneeKey = fixture.findUserByName( "testuser" ).getKey(); command.assignmentDescription = "Import-test"; command.assignmentDueDate = Calendar.getInstance().getTime(); ImportJob job = importJobFactory.createImportJob( command ); ImportResult result = job.start(); // verify assertEquals( 2, result.getInserted().size() ); assertEquals( 2, fixture.countAllContent() ); assertEquals( 1, fixture.countContentVersionsByTitle( "Jørund Vier Skriubakken" ) ); assertEquals( 1, fixture.countContentVersionsByTitle( "Ane Skriubakken" ) ); assertEquals( ContentStatus.DRAFT, fixture.findFirstContentVersionByTitle( "Jørund Vier Skriubakken" ).getStatus() ); assertEquals( ContentStatus.DRAFT, fixture.findFirstContentVersionByTitle( "Ane Skriubakken" ).getStatus() ); for ( ContentKey contentKey : result.getInserted().keySet() ) { final ContentEntity currentContent = fixture.findContentByKey( contentKey ); assertNotNull( "Assignee should be set for content: " + contentKey, currentContent.getAssignee() ); assertNotNull( "Assigner should be set", currentContent.getAssigner() ); assertNotNull( "Assignment descr should be set", currentContent.getAssignmentDescription() ); assertNotNull( "Assignment duedate should be set", currentContent.getAssignmentDueDate() ); } } @Test public void import_update_content_status_approved_removes_assignment() throws UnsupportedEncodingException { ContentTypeConfig contentTypeConfig = fixture.findCategoryByName( "Persons" ).getContentType().getContentTypeConfig(); UserEntity testUser = fixture.findUserByName( "testuser" ); // setup: create one content for each status CreateContentCommand createCommand = setupDefaultCreateContentCommandForPersons( ContentStatus.DRAFT ); CustomContentData contentData = new CustomContentData( contentTypeConfig ); contentData.add( new TextDataEntry( contentTypeConfig.getInputConfig( "person-no" ), "0" ) ); contentData.add( new TextDataEntry( contentTypeConfig.getInputConfig( "name" ), "Draft" ) ); createCommand.setContentData( contentData ); ContentKey contentKey_draft = contentService.createContent( createCommand ); AssignContentCommand assignCommand = new AssignContentCommand(); assignCommand.setAssigneeKey( testUser.getKey() ); assignCommand.setAssignerKey( testUser.getKey() ); assignCommand.setContentKey( contentKey_draft ); contentService.assignContent( assignCommand ); fixture.flushAndClearHibernateSession(); ContentEntity draft = contentDao.findByKey( contentKey_draft ); assertEquals( testUser, draft.getAssignee() ); createCommand = setupDefaultCreateContentCommandForPersons( ContentStatus.APPROVED ); contentData = new CustomContentData( contentTypeConfig ); contentData.add( new TextDataEntry( contentTypeConfig.getInputConfig( "person-no" ), "2" ) ); contentData.add( new TextDataEntry( contentTypeConfig.getInputConfig( "name" ), "Draft2" ) ); createCommand.setContentData( contentData ); ContentKey contentKey_draft2 = contentService.createContent( createCommand ); assignCommand = new AssignContentCommand(); assignCommand.setAssigneeKey( testUser.getKey() ); assignCommand.setAssignerKey( testUser.getKey() ); assignCommand.setContentKey( contentKey_draft2 ); contentService.assignContent( assignCommand ); fixture.flushAndClearHibernateSession(); ContentEntity draft2 = contentDao.findByKey( contentKey_draft2 ); assertEquals( testUser, draft2.getAssignee() ); // setup content type with needed import configuration String importsConfig = ""; importsConfig += "<imports>"; importsConfig += "<import base='/persons/person' mode='xml' name='xml-import' status='0' sync='person-no' purge='archive'>"; importsConfig += " <mapping src='@id' dest='person-no'/>"; importsConfig += " <mapping src='name' dest='name'/>"; importsConfig += " <mapping src='html' dest='htmlarea'/>"; importsConfig += "</import>"; importsConfig += "</imports>"; String changedContentTypeXml = personContentTypeXml.replace( "<imports/>", importsConfig ); updateContentType( "PersonCty", changedContentTypeXml ); String importData = ""; importData += "<persons>"; importData += " <person id='2'><name>Draft2 updated</name></person>"; importData += "</persons>"; // exercise: import with status = 0 ImportContentCommand command = new ImportContentCommand(); command.importer = fixture.findUserByName( "testuser" ); command.categoryToImportTo = fixture.findCategoryByName( "Persons" ); command.importName = "xml-import"; command.inputStream = new ByteArrayInputStream( importData.getBytes( "UTF-8" ) ); ImportJob job = importJobFactory.createImportJob( command ); ImportResult result = job.start(); // verify assertEquals( 1, result.getUpdated().size() ); assertEquals( 1, result.getArchived().size() ); assertEquals( 2, fixture.countAllContent() ); // verify: content Draft have unchanged status ContentEntity archived_content = fixture.findContentByKey( contentKey_draft ); assertEquals( ContentStatus.ARCHIVED, archived_content.getMainVersion().getStatus() ); assertNull( "Assignee should be null after archiving", archived_content.getAssignee() ); draft2 = fixture.findContentByKey( contentKey_draft2 ); assertEquals( "Assignee should be kept on draft", testUser, draft2.getAssignee() ); } private CreateContentCommand setupDefaultCreateContentCommandForPersons( ContentStatus contentStatus ) { CreateContentCommand createCommand = new CreateContentCommand(); createCommand.setAccessRightsStrategy( CreateContentCommand.AccessRightsStrategy.INHERIT_FROM_CATEGORY ); createCommand.setCategory( fixture.findCategoryByName( "Persons" ).getKey() ); createCommand.setCreator( fixture.findUserByName( "testuser" ).getKey() ); createCommand.setPriority( 0 ); createCommand.setLanguage( fixture.findLanguageByCode( "en" ) ); createCommand.setStatus( contentStatus ); createCommand.setContentName( "testcontent" ); return createCommand; } private void updateContentType( String contentTypeName, String contentTypeXml ) { ContentTypeEntity contentType = fixture.findContentTypeByName( contentTypeName ); contentType.setData( XMLDocumentFactory.create( contentTypeXml ).getAsJDOMDocument() ); fixture.flushAndClearHibernateSession(); } private String resourceToString( Resource resource ) throws IOException { return IOUtils.toString( resource.getInputStream() ); } }