com.enonic.cms.itest.content.imports.Support112124Test.java Source code

Java tutorial

Introduction

Here is the source code for com.enonic.cms.itest.content.imports.Support112124Test.java

Source

/*
 * 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();
    }
}