/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.itest.content;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
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.util.JDOMUtil;
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.ContentVersionEntity;
import com.enonic.cms.core.content.binary.BinaryDataAndBinary;
import com.enonic.cms.core.content.binary.BinaryDataEntity;
import com.enonic.cms.core.content.binary.ContentBinaryDataEntity;
import com.enonic.cms.core.content.command.CreateContentCommand;
import com.enonic.cms.core.content.contentdata.custom.BinaryDataEntry;
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.ContentTypeConfigParser;
import com.enonic.cms.core.content.contenttype.dataentryconfig.BinaryDataEntryConfig;
import com.enonic.cms.core.content.contenttype.dataentryconfig.TextDataEntryConfig;
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.AssertTool;
import com.enonic.cms.itest.util.DomainFactory;
import com.enonic.cms.itest.util.DomainFixture;
import com.enonic.cms.store.dao.ContentDao;
import static org.junit.Assert.*;
public class ContentServiceImplTest
extends AbstractSpringTest
{
private DomainFactory factory;
@Autowired
private DomainFixture fixture;
@Autowired
protected ContentDao contentDao;
@Autowired
protected ContentService contentService;
private Element standardConfigEl;
private Document standardConfig;
private byte[] dummyBinary = new byte[]{1, 2, 3};
@Before
public void before()
throws IOException, JDOMException
{
factory = fixture.getFactory();
// setup needed common data for each test
fixture.initSystemData();
StringBuffer standardConfigXml = new StringBuffer();
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=\"myTitleInSubElement\" required=\"false\" type=\"text\">" );
standardConfigXml.append( " <display>My title in sub element</display>" );
standardConfigXml.append( " <xpath>contentdata/subelement/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>" );
standardConfigEl = JDOMUtil.parseDocument( standardConfigXml.toString() ).getRootElement();
standardConfig = XMLDocumentFactory.create( standardConfigXml.toString() ).getAsJDOMDocument();
MockHttpServletRequest request = new MockHttpServletRequest();
request.setRemoteAddr( "127.0.0.1" );
ServletRequestAccessor.setRequest( request );
}
@Test
public void testCreateContentWithBinary()
{
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" ) );
fixture.save( factory.createCategory( "MyCategory", null, "MyContentType", "MyUnit", "testuser", "testuser" ) );
fixture.save( factory.createCategoryAccessForUser( "MyCategory", "testuser", "read, create, approve" ) );
fixture.flushAndClearHibernateSession();
UserEntity runningUser = fixture.findUserByName( "testuser" );
ContentEntity content = new ContentEntity();
content.setLanguage( fixture.findLanguageByCode( "en" ) );
content.setCategory( fixture.findCategoryByName( "MyCategory" ) );
content.setOwner( fixture.findUserByName( "testuser" ) );
content.setPriority( 0 );
content.setName( "testcontet" );
ContentVersionEntity version = new ContentVersionEntity();
version.setModifiedBy( fixture.findUserByName( "testuser" ) );
version.setStatus( ContentStatus.DRAFT );
version.setContent( content );
ContentTypeConfig contentTypeConfig = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, standardConfigEl );
CustomContentData contentData = new CustomContentData( contentTypeConfig );
TextDataEntryConfig titleConfig = (TextDataEntryConfig) contentData.getInputConfig( "myTitle" );
BinaryDataEntryConfig binaryConfig = (BinaryDataEntryConfig) contentData.getInputConfig( "myBinaryfile" );
contentData.add( new TextDataEntry( titleConfig, "title" ) );
contentData.add( new BinaryDataEntry( binaryConfig, "%0" ) );
version.setContentData( contentData );
version.setTitle( contentData.getTitle() );
CreateContentCommand createContentCommand = new CreateContentCommand();
createContentCommand.setCreator( runningUser.getKey() );
createContentCommand.populateCommandWithContentValues( content );
createContentCommand.populateCommandWithContentVersionValues( version );
List<BinaryDataAndBinary> binaryDatas = new ArrayList<BinaryDataAndBinary>();
binaryDatas.add( factory.createBinaryDataAndBinary( "dummyBinary", dummyBinary ) );
createContentCommand.setBinaryDatas( binaryDatas );
createContentCommand.setUseCommandsBinaryDataToAdd( true );
ContentKey contenKey = contentService.createContent( createContentCommand );
fixture.flushAndClearHibernateSession();
ContentEntity persistedContent = contentDao.findByKey( contenKey );
assertNotNull( persistedContent );
ContentVersionEntity persistedVersion = persistedContent.getMainVersion();
// verify content binary data
Set<ContentBinaryDataEntity> contentBinaryDatas = persistedVersion.getContentBinaryData();
assertEquals( 1, contentBinaryDatas.size() );
ContentBinaryDataEntity contentBinaryData = contentBinaryDatas.iterator().next();
assertNull( contentBinaryData.getLabel() );
// verify binary data
BinaryDataEntity binaryData = contentBinaryData.getBinaryData();
assertEquals( "dummyBinary", binaryData.getName() );
// verify binary
// BinaryEntity binary = binaryDao.findByKey( binaryData.getBinaryDataKey() );
// assertArrayEquals( dummyBinary, binary.getData() );
CustomContentData peristedContentData = (CustomContentData) persistedVersion.getContentData();
// verify binary data entry in content data
List<BinaryDataEntry> binaryDataEntryList = peristedContentData.getBinaryDataEntryList();
assertEquals( 1, binaryDataEntryList.size() );
BinaryDataEntry binaryDataEntry = binaryDataEntryList.get( 0 );
assertEquals( binaryData.getBinaryDataKey().toInt(), binaryDataEntry.getExistingBinaryKey().intValue() );
}
@Test
public void testCreateContent_TitleIsSaved()
{
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" ) );
fixture.save( factory.createCategory( "MyCategory", null, "MyContentType", "MyUnit", "testuser", "testuser" ) );
fixture.save( factory.createCategoryAccessForUser( "MyCategory", "testuser", "read, create, approve" ) );
fixture.flushAndClearHibernateSession();
UserEntity runningUser = fixture.findUserByName( "testuser" );
ContentEntity content = new ContentEntity();
content.setLanguage( fixture.findLanguageByCode( "en" ) );
content.setCategory( fixture.findCategoryByName( "MyCategory" ) );
content.setOwner( fixture.findUserByName( "testuser" ) );
content.setPriority( 0 );
content.setName( "testcontent" );
ContentVersionEntity version = new ContentVersionEntity();
version.setModifiedBy( fixture.findUserByName( "testuser" ) );
version.setStatus( ContentStatus.DRAFT );
version.setContent( content );
ContentTypeConfig contentTypeConfig = ContentTypeConfigParser.parse( ContentHandlerName.CUSTOM, standardConfigEl );
CustomContentData contentData = new CustomContentData( contentTypeConfig );
TextDataEntryConfig titleConfig = (TextDataEntryConfig) contentData.getInputConfig( "myTitle" );
TextDataEntryConfig subElementConfig = (TextDataEntryConfig) contentData.getInputConfig( "myTitleInSubElement" );
contentData.add( new TextDataEntry( titleConfig, "test title" ) );
contentData.add( new TextDataEntry( subElementConfig, "test subtitle" ) );
version.setContentData( contentData );
version.setTitle( contentData.getTitle() );
CreateContentCommand createContentCommand = new CreateContentCommand();
createContentCommand.setCreator( runningUser.getKey() );
createContentCommand.populateCommandWithContentValues( content );
createContentCommand.populateCommandWithContentVersionValues( version );
List<BinaryDataAndBinary> binaryDatas = new ArrayList<BinaryDataAndBinary>();
createContentCommand.setBinaryDatas( binaryDatas );
createContentCommand.setUseCommandsBinaryDataToAdd( true );
ContentKey contenKey = contentService.createContent( createContentCommand );
fixture.flushAndClearHibernateSession();
ContentEntity persistedContent = contentDao.findByKey( contenKey );
assertNotNull( persistedContent );
ContentVersionEntity persistedVersion = persistedContent.getMainVersion();
assertEquals( "test title", persistedVersion.getTitle() );
Document contentDataXml = persistedVersion.getContentDataAsJDomDocument();
AssertTool.assertSingleXPathValueEquals( "/contentdata/mytitle", contentDataXml, "test title" );
AssertTool.assertSingleXPathValueEquals( "/contentdata/subelement/mytitle", contentDataXml, "test subtitle" );
CustomContentData peristedContentData = (CustomContentData) persistedVersion.getContentData();
assertEquals( "test title", peristedContentData.getTitle() );
}
}