/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.itest.client;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Set;
import org.apache.commons.io.IOUtils;
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.core.io.ClassPathResource;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.orm.hibernate3.HibernateTemplate;
import junit.framework.Assert;
import com.enonic.cms.framework.xml.XMLDocumentFactory;
import com.enonic.cms.api.client.model.CreateImageContentParams;
import com.enonic.cms.api.client.model.content.ContentStatus;
import com.enonic.cms.api.client.model.content.image.ImageBinaryInput;
import com.enonic.cms.api.client.model.content.image.ImageContentDataInput;
import com.enonic.cms.api.client.model.content.image.ImageDescriptionInput;
import com.enonic.cms.api.client.model.content.image.ImageKeywordsInput;
import com.enonic.cms.api.client.model.content.image.ImageNameInput;
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.legacy.LegacyImageContentData;
import com.enonic.cms.core.content.contenttype.ContentHandlerName;
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.AssertTool;
import com.enonic.cms.itest.util.DomainFactory;
import com.enonic.cms.itest.util.DomainFixture;
import static org.junit.Assert.*;
public class InternalClientImpl_CreateImageContentTest
extends AbstractSpringTest
{
@Autowired
private HibernateTemplate hibernateTemplate;
private DomainFactory factory;
@Autowired
private DomainFixture fixture;
@Autowired
@Qualifier("localClient")
private InternalClient internalClient;
private Document contentTypeConfig;
@Before
public void before()
throws IOException, JDOMException
{
factory = fixture.getFactory();
fixture.initSystemData();
StringBuilder contentTypeConfigXml = new StringBuilder();
contentTypeConfigXml.append( "<moduledata/>" );
contentTypeConfig = XMLDocumentFactory.create( contentTypeConfigXml.toString() ).getAsJDOMDocument();
hibernateTemplate.flush();
MockHttpServletRequest request = new MockHttpServletRequest();
request.setRemoteAddr( "127.0.0.1" );
ServletRequestAccessor.setRequest( request );
}
@Test
public void testCreateImageContent()
throws Exception
{
setUpContentAndCategory();
setRunningUser();
CreateImageContentParams params = new CreateImageContentParams();
params.categoryKey = fixture.findCategoryByName( "MyCategory" ).getKey().toInt();
params.publishFrom = new Date();
params.publishTo = null;
params.status = ContentStatus.STATUS_DRAFT;
params.contentData = createImageContentData( "200" );
int contentKey = internalClient.createImageContent( params );
fixture.flushAndClearHibernateSession();
ContentEntity persistedContent = fixture.findContentByKey( new ContentKey( contentKey ) );
assertNotNull( persistedContent );
assertEquals( "MyCategory", persistedContent.getCategory().getName() );
ContentVersionEntity persistedVersion = persistedContent.getMainVersion();
assertNotNull( persistedVersion );
assertEquals( "test binary", persistedVersion.getTitle() );
assertEquals( com.enonic.cms.core.content.ContentStatus.DRAFT.getKey(), persistedVersion.getStatus().getKey() );
Set<ContentBinaryDataEntity> contentBinaryDatas = persistedVersion.getContentBinaryData();
assertEquals( 1, contentBinaryDatas.size() );
assertEquals( "source", contentBinaryDatas.iterator().next().getLabel() );
BinaryDataEntity binaryDataResolvedFromContentBinaryData = contentBinaryDatas.iterator().next().getBinaryData();
assertEquals( "Dummy Name", binaryDataResolvedFromContentBinaryData.getName() );
LegacyImageContentData contentData = (LegacyImageContentData) persistedVersion.getContentData();
assertNotNull( contentData );
Document contentDataXml = contentData.getContentDataXml();
AssertTool.assertSingleXPathValueEquals( "/contentdata/name", contentDataXml, "test binary" );
AssertTool.assertSingleXPathValueEquals( "/contentdata/description", contentDataXml, "Dummy description." );
AssertTool.assertSingleXPathValueEquals( "/contentdata/keywords", contentDataXml, "keyword1 keyword2" );
AssertTool.assertSingleXPathValueEquals( "/contentdata/sourceimage/binarydata/@key", contentDataXml,
binaryDataResolvedFromContentBinaryData.getBinaryDataKey().toString() );
AssertTool.assertSingleXPathValueEquals( "/contentdata/sourceimage/@width", contentDataXml, "200" );
AssertTool.assertSingleXPathValueEquals( "/contentdata/sourceimage/@height", contentDataXml, "200" );
AssertTool.assertSingleXPathValueEquals( "/contentdata/images/@border", contentDataXml, "no" );
AssertTool.assertSingleXPathValueEquals( "/contentdata/images/image/@rotation", contentDataXml, "none" );
AssertTool.assertSingleXPathValueEquals( "/contentdata/images/image/@type", contentDataXml, "original" );
AssertTool.assertSingleXPathValueEquals( "/contentdata/images/image/width", contentDataXml, "200" );
AssertTool.assertSingleXPathValueEquals( "/contentdata/images/image/height", contentDataXml, "200" );
AssertTool.assertSingleXPathValueEquals( "/contentdata/images/image/binarydata/@key", contentDataXml,
binaryDataResolvedFromContentBinaryData.getBinaryDataKey().toString() );
}
@Test
public void testNoScaleImageCreated()
throws Exception
{
setUpContentAndCategory();
setRunningUser();
CreateImageContentParams params = new CreateImageContentParams();
params.categoryKey = fixture.findCategoryByName( "MyCategory" ).getKey().toInt();
params.publishFrom = new Date();
params.publishTo = null;
params.status = ContentStatus.STATUS_DRAFT;
params.contentData = createImageContentData( "1024" );
int contentKey = internalClient.createImageContent( params );
fixture.flushAndClearHibernateSession();
ContentEntity persistedContent = fixture.findContentByKey( new ContentKey( contentKey ) );
assertNotNull( persistedContent );
assertEquals( "MyCategory", persistedContent.getCategory().getName() );
ContentVersionEntity persistedVersion = persistedContent.getMainVersion();
assertNotNull( persistedVersion );
assertEquals( "test binary", persistedVersion.getTitle() );
assertEquals( ContentStatus.STATUS_DRAFT, persistedVersion.getStatus().getKey() );
Set<ContentBinaryDataEntity> contentBinaryDatas = persistedVersion.getContentBinaryData();
assertEquals( 4, contentBinaryDatas.size() );
String[] names = new String[4];
int i = 0;
for ( ContentBinaryDataEntity contentBinaryData : contentBinaryDatas )
{
names[i++] = contentBinaryData.getBinaryData().getName();
}
assertArrayEquals( new String[]{"Dummy Name_small.jpeg", "Dummy Name_medium.jpeg", "Dummy Name_large.jpeg", "Dummy Name"}, names );
}
private static void assertArrayEquals( Object[] a1, Object[] a2 )
{
Assert.assertEquals( arrayToString( a1 ), arrayToString( a2 ) );
}
private static String arrayToString( Object[] a )
{
StringBuilder result = new StringBuilder( "[" );
for ( int i = 0; i < a.length; i++ )
{
result.append( i ).append( ": " ).append( a[i] );
if ( i < a.length - 1 )
{
result.append( ", " );
}
}
result.append( "]" );
return result.toString();
}
private void setRunningUser()
{
UserEntity runningUser = fixture.findUserByName( "testuser" );
PortalSecurityHolder.setImpersonatedUser( runningUser.getKey() );
}
private void setUpContentAndCategory()
{
fixture.createAndStoreUserAndUserGroup( "testuser", "testuser fullname", UserType.NORMAL, "testuserstore" );
fixture.save( factory.createContentHandler( "File content", ContentHandlerName.IMAGE.getHandlerClassShortName() ) );
fixture.save(
factory.createContentType( "MyContentType", ContentHandlerName.IMAGE.getHandlerClassShortName(), contentTypeConfig ) );
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();
}
private ImageContentDataInput createImageContentData( String fileName )
throws Exception
{
ImageContentDataInput imageContentData = new ImageContentDataInput();
imageContentData.binary = new ImageBinaryInput( loadImageFile( fileName ), "Dummy Name" );
imageContentData.description = new ImageDescriptionInput( "Dummy description." );
imageContentData.keywords = new ImageKeywordsInput().addKeyword( "keyword1" ).addKeyword( "keyword2" );
imageContentData.name = new ImageNameInput( "test binary" );
return imageContentData;
}
private String createFileName( String fileName )
{
return InternalClientImpl_CreateImageContentTest.class.getName().replace( ".", "/" ) + "-" + fileName + "px.jpg";
}
private byte[] loadImageFile( String fileName )
throws IOException
{
ClassPathResource resource = new ClassPathResource( createFileName( fileName ) );
InputStream in = resource.getInputStream();
return IOUtils.toByteArray( in );
}
}