/* * 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 java.util.Set; import org.jdom.Document; import org.jdom.JDOMException; 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.CreateContentParams; import com.enonic.cms.api.client.model.content.BinaryInput; 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.GroupInput; 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.ContentVersionEntity; import com.enonic.cms.core.content.binary.BinaryDataEntity; import com.enonic.cms.core.content.binary.ContentBinaryDataEntity; import com.enonic.cms.core.content.contentdata.custom.BlockGroupDataEntries; import com.enonic.cms.core.content.contentdata.custom.CustomContentData; import com.enonic.cms.core.content.contentdata.custom.GroupDataEntry; 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.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 static org.junit.Assert.*; public class InternalClientImpl_CreateContentTest extends AbstractSpringTest { private DomainFactory factory; @Autowired private DomainFixture fixture; @Autowired @Qualifier("localClient") private InternalClient internalClient; private Document standardConfig; private byte[] dummyBinary = new byte[]{1, 2, 3}; @Before public void before() throws IOException, JDOMException { factory = fixture.getFactory(); fixture.initSystemData(); 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( " <input name=\"myBinaryfile\" type=\"uploadfile\">" ); standardConfigXml.append( " <display>My binaryfile</display>" ); standardConfigXml.append( " <xpath>contentdata/mybinaryfile</xpath>" ); standardConfigXml.append( " </input>" ); standardConfigXml.append( " </block>" ); standardConfigXml.append( " </form>" ); standardConfigXml.append( "</config>" ); standardConfig = XMLDocumentFactory.create( standardConfigXml.toString() ).getAsJDOMDocument(); MockHttpServletRequest request = new MockHttpServletRequest(); request.setRemoteAddr( "127.0.0.1" ); ServletRequestAccessor.setRequest( request ); } @Test public void testCreateContentWithBinary() { fixture.createAndStoreNormalUserWithUserGroup( "testuser", "Test user", "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" ) ); fixture.flushAndClearHibernateSession(); UserEntity runningUser = fixture.findUserByName( "testuser" ); PortalSecurityHolder.setImpersonatedUser( runningUser.getKey() ); ContentDataInput contentData = new ContentDataInput( "MyContentType" ); contentData.add( new TextInput( "myTitle", "testtitle" ) ); contentData.add( new BinaryInput( "myBinaryfile", dummyBinary, "dummyBinary" ) ); 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 ); fixture.flushAndClearHibernateSession(); ContentEntity persistedContent = fixture.findContentByKey( new ContentKey( contentKey ) ); assertNotNull( persistedContent ); assertEquals( "MyCategory", persistedContent.getCategory().getName() ); ContentVersionEntity persistedVersion = persistedContent.getMainVersion(); assertNotNull( persistedVersion ); assertEquals( "testtitle", persistedVersion.getTitle() ); assertEquals( com.enonic.cms.core.content.ContentStatus.DRAFT.getKey(), persistedVersion.getStatus().getKey() ); // verify binary was saved Set<ContentBinaryDataEntity> contentBinaryDatas = persistedVersion.getContentBinaryData(); assertEquals( 1, contentBinaryDatas.size() ); ContentBinaryDataEntity contentBinaryData = contentBinaryDatas.iterator().next(); BinaryDataEntity binaryData = contentBinaryData.getBinaryData(); assertEquals( "dummyBinary", binaryData.getName() ); CustomContentData customContentData = (CustomContentData) persistedVersion.getContentData(); assertNotNull( customContentData ); } @Test public void testCreateContentWithBlockGroup() { fixture.createAndStoreUserAndUserGroup( "testuser", "testuser fullname", UserType.NORMAL, "testuserstore" ); fixture.save( factory.createContentHandler( "Custom content", ContentHandlerName.CUSTOM.getHandlerClassShortName() ) ); // setup content type ContentTypeConfigBuilder ctyconf = new ContentTypeConfigBuilder( "Skole", "tittel" ); ctyconf.startBlock( "Skole" ); ctyconf.addInput( "tittel", "text", "contentdata/tittel", "Tittel", true ); ctyconf.endBlock(); ctyconf.startBlock( "Elever", "contentdata/elever" ); ctyconf.addInput( "elev-navn", "text", "navn", "Navn" ); ctyconf.addInput( "elev-karakter", "text", "karakter", "Karakter" ); ctyconf.endBlock(); ctyconf.startBlock( "Laerere", "contentdata/laerere" ); ctyconf.addInput( "laerer-navn", "text", "navn", "Navn" ); ctyconf.addInput( "laerer-karakter", "text", "karakter", "Karakter" ); ctyconf.endBlock(); Document configAsXmlBytes = XMLDocumentFactory.create( ctyconf.toString() ).getAsJDOMDocument(); fixture.save( factory.createContentType( "Skole", ContentHandlerName.CUSTOM.getHandlerClassShortName(), configAsXmlBytes ) ); fixture.save( factory.createUnit( "MyUnit", "en" ) ); fixture.save( factory.createCategory( "Skole", null, "Skole", "MyUnit", "testuser", "testuser" ) ); fixture.save( factory.createCategoryAccessForUser( "Skole", "testuser", "read,create,approve" ) ); UserEntity runningUser = fixture.findUserByName( "testuser" ); PortalSecurityHolder.setImpersonatedUser( runningUser.getKey() ); CreateContentParams content = new CreateContentParams(); content.categoryKey = fixture.findCategoryByName( "Skole" ).getKey().toInt(); content.publishFrom = new Date(); content.status = ContentStatus.STATUS_APPROVED; ContentDataInput contentData = new ContentDataInput( "Skole" ); contentData.add( new TextInput( "tittel", "St. Olav Videregaende skole" ) ); GroupInput groupInputElev1 = contentData.addGroup( "Elever" ); groupInputElev1.add( new TextInput( "elev-navn", "Vegar Jansen" ) ); groupInputElev1.add( new TextInput( "elev-karakter", "S" ) ); GroupInput groupInputElev2 = contentData.addGroup( "Elever" ); groupInputElev2.add( new TextInput( "elev-navn", "Thomas Sigdestad" ) ); groupInputElev2.add( new TextInput( "elev-karakter", "M" ) ); GroupInput groupInputLaerer1 = contentData.addGroup( "Laerere" ); groupInputLaerer1.add( new TextInput( "laerer-navn", "Mutt Hansen" ) ); groupInputLaerer1.add( new TextInput( "laerer-karakter", "LG" ) ); GroupInput groupInputLaerer2 = contentData.addGroup( "Laerere" ); groupInputLaerer2.add( new TextInput( "laerer-navn", "Striks Jansen" ) ); groupInputLaerer2.add( new TextInput( "laerer-karakter", "M" ) ); content.contentData = contentData; ContentKey contentKey = new ContentKey( internalClient.createContent( content ) ); ContentEntity createdContent = fixture.findContentByKey( contentKey ); ContentVersionEntity createdVersion = createdContent.getMainVersion(); CustomContentData createdContentData = (CustomContentData) createdVersion.getContentData(); BlockGroupDataEntries elever = createdContentData.getBlockGroupDataEntries( "Elever" ); GroupDataEntry elev1 = elever.getGroupDataEntry( 1 ); assertEquals( "Vegar Jansen", ( (TextDataEntry) elev1.getEntry( "elev-navn" ) ).getValue() ); assertEquals( "S", ( (TextDataEntry) elev1.getEntry( "elev-karakter" ) ).getValue() ); GroupDataEntry elev2 = elever.getGroupDataEntry( 2 ); assertEquals( "Thomas Sigdestad", ( (TextDataEntry) elev2.getEntry( "elev-navn" ) ).getValue() ); assertEquals( "M", ( (TextDataEntry) elev2.getEntry( "elev-karakter" ) ).getValue() ); BlockGroupDataEntries laerere = createdContentData.getBlockGroupDataEntries( "Laerere" ); GroupDataEntry laerer1 = laerere.getGroupDataEntry( 1 ); assertEquals( "Mutt Hansen", ( (TextDataEntry) laerer1.getEntry( "laerer-navn" ) ).getValue() ); assertEquals( "LG", ( (TextDataEntry) laerer1.getEntry( "laerer-karakter" ) ).getValue() ); GroupDataEntry laerer2 = laerere.getGroupDataEntry( 2 ); assertEquals( "Striks Jansen", ( (TextDataEntry) laerer2.getEntry( "laerer-navn" ) ).getValue() ); assertEquals( "M", ( (TextDataEntry) laerer2.getEntry( "laerer-karakter" ) ).getValue() ); } }