/*
* 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.util.Collection;
import java.util.List;
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 junit.framework.Assert;
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.ContentVersionEntity;
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.relationdataentrylistbased.RelatedContentsDataEntry;
import com.enonic.cms.core.content.contenttype.ContentHandlerName;
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.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 Support112124Test
extends AbstractSpringTest
{
@Autowired
private DomainFixture fixture;
@Autowired
private ImportJobFactory importJobFactory;
@Before
public void setUp()
throws IOException
{
String kontaktContentTypeXml = resourceToString(
new ClassPathResource( Support112124Test.class.getName().replace( ".", "/" ) + "-innholdstype-kontakt.xml" ) );
String statistikkContentTypeXml = resourceToString(
new ClassPathResource( Support112124Test.class.getName().replace( ".", "/" ) + "-innholdstype-statistikk.xml" ) );
DomainFactory factory = fixture.getFactory();
fixture.initSystemData();
fixture.createAndStoreNormalUserWithUserGroup( "testuser", "Test user", "testuserstore" );
fixture.save( factory.createContentHandler( "MyHandler", ContentHandlerName.CUSTOM.getHandlerClassShortName() ) );
fixture.save( factory.createContentType( "kontaktCty", ContentHandlerName.CUSTOM.getHandlerClassShortName(),
XMLDocumentFactory.create( kontaktContentTypeXml ).getAsJDOMDocument() ) );
fixture.save( factory.createContentType( "statistikkCty", ContentHandlerName.CUSTOM.getHandlerClassShortName(),
XMLDocumentFactory.create( statistikkContentTypeXml ).getAsJDOMDocument() ) );
fixture.save( factory.createUnit( "MyUnit" ) );
fixture.save( factory.createCategory( "Kontakt", null, "kontaktCty", "MyUnit", "testuser", "testuser" ) );
fixture.save( factory.createCategoryAccessForUser( "Kontakt", "testuser", "read, create, approve" ) );
fixture.save( factory.createCategory( "Statistikk", null, "statistikkCty", "MyUnit", "testuser", "testuser" ) );
fixture.save( factory.createCategoryAccessForUser( "Statistikk", "testuser", "read, create, approve" ) );
MockHttpServletRequest request = new MockHttpServletRequest();
request.setRemoteAddr( "127.0.0.1" );
ServletRequestAccessor.setRequest( request );
PortalSecurityHolder.setLoggedInUser( fixture.findUserByName( "testuser" ).getKey() );
PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "testuser" ).getKey() );
ImportJobFactory.setExecuteInOneTransaction( true );
}
@Test
public void importing_related_content()
throws IOException
{
ImportResult result = doImport( "Kontakt", "SRKontaktListeImport", "kontakter.xml" );
fixture.flushIndexTransaction();
// verify
assertEquals( 4, result.getInserted().size() );
assertEquals( 4, fixture.countAllContent() );
assertEquals( 1, fixture.countContentVersionsByTitle( "Bibliotek og Informasjonssenteret" ) );
assertEquals( 1, fixture.countContentVersionsByTitle( "Ingen Mann" ) );
assertEquals( 1, fixture.countContentVersionsByTitle( "Ell Emelle" ) );
assertEquals( 1, fixture.countContentVersionsByTitle( "Inte Nett" ) );
// import 1 pass
result = doImport( "Statistikk", "SRImport", "statistikk.xml" );
fixture.flushIndexTransaction();
assertEquals( 1, result.getInserted().size() );
assertEquals( 0, result.getUpdated().size() );
assertEquals( 5, fixture.countAllContent() );
assertEquals( 1, fixture.countContentVersionsByTitle( "Veitrafikkulykker" ) );
final List<ContentEntity> all = fixture.findAllContent();
ContentEntity content = fixture.findContentByName( "veitrafikkulykker" );
Collection<ContentKey> actualOrder = getRelatedContentKeys( content, "kontakter" );
final String expected = String.format( "0: %d, 1: %d, 2: %d", all.get( 2 - 1 ).getKey().toInt(), all.get( 4 - 1 ).getKey().toInt(),
all.get( 3 - 1 ).getKey().toInt() );
assertOrderedEquals( expected, actualOrder );
// reimport the same
result = doImport( "Statistikk", "SRImport", "statistikk.xml" );
fixture.flushIndexTransaction();
assertEquals( 1, result.getSkipped().size() );
assertEquals( 5, fixture.countAllContent() );
assertEquals( 1, fixture.countContentVersionsByTitle( "Veitrafikkulykker" ) );
content = fixture.findContentByName( "veitrafikkulykker" );
actualOrder = getRelatedContentKeys( content, "kontakter" );
assertOrderedEquals( expected, actualOrder );
// import with new order
result = doImport( "Statistikk", "SRImport", "statistikk-endret.xml" );
assertEquals( 1, result.getUpdated().size() );
assertEquals( 5, fixture.countAllContent() );
assertEquals( 2, fixture.countContentVersionsByTitle( "Veitrafikkulykker" ) );
fixture.flushAndClearHibernateSession();
}
private ImportResult doImport( String categoryName, String importName, String fileName )
throws IOException
{
String importData =
resourceToString( new ClassPathResource( Support112124Test.class.getName().replace( ".", "/" ) + "-" + fileName ) );
ImportContentCommand command = new ImportContentCommand();
command.importer = fixture.findUserByName( "testuser" );
command.categoryToImportTo = fixture.findCategoryByName( categoryName );
command.importName = importName;
command.inputStream = new ByteArrayInputStream( importData.getBytes( "UTF-8" ) );
ImportJob job = importJobFactory.createImportJob( command );
ImportResult result = job.start();
return result;
}
private Collection<ContentKey> getRelatedContentKeys( ContentEntity content, String fieldName )
{
ContentVersionEntity contentVersion = content.getMainVersion();
CustomContentData contentData = (CustomContentData) contentVersion.getContentData();
RelatedContentsDataEntry relatedContents = (RelatedContentsDataEntry) contentData.getEntry( fieldName );
return relatedContents.getRelatedContentKeys();
}
private String resourceToString( Resource resource )
throws IOException
{
return IOUtils.toString( resource.getInputStream() );
}
private static void assertOrderedEquals( String expected, Collection<ContentKey> actualSet )
{
String[] actual = new String[3];
int i = 0;
for ( ContentKey contentKey : actualSet )
{
actual[i++] = contentKey.toString();
}
Assert.assertEquals( expected, arrayToString( actual ) );
}
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( ", " );
}
}
return result.toString();
}
}