CCM NG: Tests and Bugfixes for Im/Export
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5743 8810af33-2d31-482b-a856-94f89814c4df
Former-commit-id: c8311aea3d
pull/2/head
parent
de0d00244d
commit
361d6994a1
|
|
@ -19,9 +19,12 @@
|
||||||
package org.libreccm.categorization;
|
package org.libreccm.categorization;
|
||||||
|
|
||||||
import org.libreccm.imexport.AbstractEntityImExporter;
|
import org.libreccm.imexport.AbstractEntityImExporter;
|
||||||
import org.libreccm.imexport.DependsOn;
|
import org.libreccm.imexport.Exportable;
|
||||||
import org.libreccm.imexport.Processes;
|
import org.libreccm.imexport.Processes;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
|
|
@ -31,7 +34,6 @@ import javax.transaction.Transactional;
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
*/
|
*/
|
||||||
@Processes(Categorization.class)
|
@Processes(Categorization.class)
|
||||||
@DependsOn({Category.class})
|
|
||||||
public class CategorizationImExporter
|
public class CategorizationImExporter
|
||||||
extends AbstractEntityImExporter<Categorization> {
|
extends AbstractEntityImExporter<Categorization> {
|
||||||
|
|
||||||
|
|
@ -44,6 +46,15 @@ public class CategorizationImExporter
|
||||||
return Categorization.class;
|
return Categorization.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<Class<? extends Exportable>> getRequiredEntities() {
|
||||||
|
|
||||||
|
final Set<Class<? extends Exportable>> entities = new HashSet<>();
|
||||||
|
entities.add(Category.class);
|
||||||
|
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
protected void saveImportedEntity(final Categorization entity) {
|
protected void saveImportedEntity(final Categorization entity) {
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,12 @@
|
||||||
package org.libreccm.categorization;
|
package org.libreccm.categorization;
|
||||||
|
|
||||||
import org.libreccm.imexport.AbstractEntityImExporter;
|
import org.libreccm.imexport.AbstractEntityImExporter;
|
||||||
import org.libreccm.imexport.DependsOn;
|
import org.libreccm.imexport.Exportable;
|
||||||
import org.libreccm.imexport.Processes;
|
import org.libreccm.imexport.Processes;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.enterprise.context.RequestScoped;
|
import javax.enterprise.context.RequestScoped;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
|
|
@ -32,7 +35,6 @@ import javax.transaction.Transactional;
|
||||||
*/
|
*/
|
||||||
@RequestScoped
|
@RequestScoped
|
||||||
@Processes(Category.class)
|
@Processes(Category.class)
|
||||||
@DependsOn({Domain.class})
|
|
||||||
public class CategoryImExporter extends AbstractEntityImExporter<Category> {
|
public class CategoryImExporter extends AbstractEntityImExporter<Category> {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
|
@ -44,6 +46,15 @@ public class CategoryImExporter extends AbstractEntityImExporter<Category> {
|
||||||
return Category.class;
|
return Category.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<Class<? extends Exportable>> getRequiredEntities() {
|
||||||
|
|
||||||
|
final Set<Class<? extends Exportable>> entities = new HashSet<>();
|
||||||
|
entities.add(Domain.class);
|
||||||
|
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
protected void saveImportedEntity(final Category entity) {
|
protected void saveImportedEntity(final Category entity) {
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,9 @@ import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for importers/exporters. Implementations must be annotated with
|
* Base class for importers/exporters. Implementations must be annotated with
|
||||||
|
|
@ -37,8 +40,35 @@ public abstract class AbstractEntityImExporter<T extends Exportable> {
|
||||||
|
|
||||||
private final ObjectMapper objectMapper = new ObjectMapper();
|
private final ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Entity class which is handled by the implementation. This
|
||||||
|
* should be the same values than the class in the {@link Proceesses}
|
||||||
|
* annotation. This duplication is necessary because we need the value in
|
||||||
|
* qualifier annotation to be able to request an implementation for a
|
||||||
|
* specific class from the CDI container. But we can't access the
|
||||||
|
* annotations in a portable way in the rest of the code because CDI
|
||||||
|
* containers usually create a {@link java.lang.reflect.Proxy} class and
|
||||||
|
* there is no portable way to unproxy a class.
|
||||||
|
*
|
||||||
|
* @return The Entity class which is handled by the implementation.
|
||||||
|
*/
|
||||||
protected abstract Class<T> getEntityClass();
|
protected abstract Class<T> getEntityClass();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A set of entities which should be processed before this implementation is
|
||||||
|
* used. We can't use an annotation for this because we can't access the
|
||||||
|
* annotations in a portable way in the rest of the code because CDI
|
||||||
|
* containers usually create a {@link java.lang.reflect.Proxy} class and
|
||||||
|
* there is no portable way to unproxy a class.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @return A {@link Set} of exportable entity classes which should be
|
||||||
|
* processed before the entities which are processed by this
|
||||||
|
* implementation. If the implementation has no dependencies an
|
||||||
|
* empty {@link Set} should be returned.
|
||||||
|
*/
|
||||||
|
protected abstract Set<Class<? extends Exportable>> getRequiredEntities();
|
||||||
|
|
||||||
public T importEntity(final String data) throws ImportExpection {
|
public T importEntity(final String data) throws ImportExpection {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,8 @@ final class EntityImExporterTreeManager {
|
||||||
.getLogger(EntityImExporterTreeManager.class);
|
.getLogger(EntityImExporterTreeManager.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialises the tree with the provided list of {@link AbstractEntityImExporter}s.
|
* Initialises the tree with the provided list of
|
||||||
|
* {@link AbstractEntityImExporter}s.
|
||||||
*
|
*
|
||||||
* @param imExporters The available {@link AbstractEntityImExporter}s.
|
* @param imExporters The available {@link AbstractEntityImExporter}s.
|
||||||
*
|
*
|
||||||
|
|
@ -72,8 +73,7 @@ final class EntityImExporterTreeManager {
|
||||||
final Map<String, EntityImExporterTreeNode> nodes = imExporters
|
final Map<String, EntityImExporterTreeNode> nodes = imExporters
|
||||||
.stream()
|
.stream()
|
||||||
.map(EntityImExporterTreeNode::new)
|
.map(EntityImExporterTreeNode::new)
|
||||||
.collect(Collectors
|
.collect(Collectors.toMap(
|
||||||
.toMap(
|
|
||||||
node -> node
|
node -> node
|
||||||
.getEntityImExporter()
|
.getEntityImExporter()
|
||||||
.getClass()
|
.getClass()
|
||||||
|
|
|
||||||
|
|
@ -43,8 +43,6 @@ import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javax.enterprise.context.RequestScoped;
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
|
@ -262,8 +260,7 @@ public class ImportExport {
|
||||||
final EntityImExporterTreeManager treeManager
|
final EntityImExporterTreeManager treeManager
|
||||||
= new EntityImExporterTreeManager();
|
= new EntityImExporterTreeManager();
|
||||||
final List<EntityImExporterTreeNode> tree = treeManager
|
final List<EntityImExporterTreeNode> tree = treeManager
|
||||||
.generateTree(
|
.generateTree(imExportersList);
|
||||||
imExportersList);
|
|
||||||
final List<EntityImExporterTreeNode> orderedNodes = treeManager
|
final List<EntityImExporterTreeNode> orderedNodes = treeManager
|
||||||
.orderImExporters(tree);
|
.orderImExporters(tree);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,12 @@
|
||||||
package org.libreccm.security;
|
package org.libreccm.security;
|
||||||
|
|
||||||
import org.libreccm.imexport.AbstractEntityImExporter;
|
import org.libreccm.imexport.AbstractEntityImExporter;
|
||||||
import org.libreccm.imexport.DependsOn;
|
import org.libreccm.imexport.Exportable;
|
||||||
import org.libreccm.imexport.Processes;
|
import org.libreccm.imexport.Processes;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
|
|
@ -31,7 +34,6 @@ import javax.transaction.Transactional;
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
*/
|
*/
|
||||||
@Processes(GroupMembership.class)
|
@Processes(GroupMembership.class)
|
||||||
@DependsOn({User.class, Group.class})
|
|
||||||
public class GroupMembershipImExporter extends AbstractEntityImExporter<GroupMembership> {
|
public class GroupMembershipImExporter extends AbstractEntityImExporter<GroupMembership> {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
|
@ -41,7 +43,16 @@ public class GroupMembershipImExporter extends AbstractEntityImExporter<GroupMem
|
||||||
protected Class<GroupMembership> getEntityClass() {
|
protected Class<GroupMembership> getEntityClass() {
|
||||||
|
|
||||||
return GroupMembership.class;
|
return GroupMembership.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<Class<? extends Exportable>> getRequiredEntities() {
|
||||||
|
|
||||||
|
final Set<Class<? extends Exportable>> entities = new HashSet<>();
|
||||||
|
entities.add(User.class);
|
||||||
|
entities.add(Group.class);
|
||||||
|
|
||||||
|
return entities;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -272,7 +272,7 @@ public class User extends Party implements Serializable, Exportable {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setEmailAddresses(final List<EmailAddress> emailAddresses) {
|
protected void setEmailAddresses(final List<EmailAddress> emailAddresses) {
|
||||||
this.emailAddresses = emailAddresses;
|
this.emailAddresses = new ArrayList<>(emailAddresses);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addEmailAddress(final EmailAddress emailAddress) {
|
public void addEmailAddress(final EmailAddress emailAddress) {
|
||||||
|
|
@ -313,7 +313,7 @@ public class User extends Party implements Serializable, Exportable {
|
||||||
|
|
||||||
protected void setGroupMemberships(
|
protected void setGroupMemberships(
|
||||||
final Set<GroupMembership> groupMemberships) {
|
final Set<GroupMembership> groupMemberships) {
|
||||||
this.groupMemberships = groupMemberships;
|
this.groupMemberships = new HashSet<>(groupMemberships);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void addGroupMembership(final GroupMembership groupMembership) {
|
protected void addGroupMembership(final GroupMembership groupMembership) {
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,12 @@
|
||||||
package org.libreccm.workflow;
|
package org.libreccm.workflow;
|
||||||
|
|
||||||
import org.libreccm.imexport.AbstractEntityImExporter;
|
import org.libreccm.imexport.AbstractEntityImExporter;
|
||||||
import org.libreccm.imexport.DependsOn;
|
import org.libreccm.imexport.Exportable;
|
||||||
import org.libreccm.imexport.Processes;
|
import org.libreccm.imexport.Processes;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.enterprise.context.RequestScoped;
|
import javax.enterprise.context.RequestScoped;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
|
|
@ -33,7 +36,6 @@ import javax.transaction.Transactional;
|
||||||
*/
|
*/
|
||||||
@RequestScoped
|
@RequestScoped
|
||||||
@Processes(AssignableTask.class)
|
@Processes(AssignableTask.class)
|
||||||
@DependsOn(Workflow.class)
|
|
||||||
public class AssignableTaskImExporter
|
public class AssignableTaskImExporter
|
||||||
extends AbstractEntityImExporter<AssignableTask> {
|
extends AbstractEntityImExporter<AssignableTask> {
|
||||||
|
|
||||||
|
|
@ -45,6 +47,15 @@ public class AssignableTaskImExporter
|
||||||
return AssignableTask.class;
|
return AssignableTask.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Set<Class<? extends Exportable>> getRequiredEntities() {
|
||||||
|
|
||||||
|
final Set<Class<? extends Exportable>> entities = new HashSet<>();
|
||||||
|
entities.add(Workflow.class);
|
||||||
|
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(Transactional.TxType.REQUIRED)
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
protected void saveImportedEntity(final AssignableTask entity) {
|
protected void saveImportedEntity(final AssignableTask entity) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,289 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.libreccm.imexport;
|
||||||
|
|
||||||
|
import static org.libreccm.testutils.DependenciesHelpers.*;
|
||||||
|
|
||||||
|
import org.jboss.arquillian.container.test.api.Deployment;
|
||||||
|
import org.jboss.arquillian.junit.Arquillian;
|
||||||
|
import org.jboss.arquillian.junit.InSequence;
|
||||||
|
import org.jboss.arquillian.persistence.CleanupUsingScript;
|
||||||
|
import org.jboss.arquillian.persistence.CreateSchema;
|
||||||
|
import org.jboss.arquillian.persistence.PersistenceTest;
|
||||||
|
import org.jboss.arquillian.persistence.ShouldMatchDataSet;
|
||||||
|
import org.jboss.arquillian.persistence.TestExecutionPhase;
|
||||||
|
import org.jboss.arquillian.persistence.UsingDataSet;
|
||||||
|
import org.jboss.arquillian.transaction.api.annotation.TransactionMode;
|
||||||
|
import org.jboss.arquillian.transaction.api.annotation.Transactional;
|
||||||
|
import org.jboss.shrinkwrap.api.ShrinkWrap;
|
||||||
|
import org.jboss.shrinkwrap.api.spec.WebArchive;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.experimental.categories.Category;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.libreccm.configuration.ConfigurationManager;
|
||||||
|
import org.libreccm.core.UnexpectedErrorException;
|
||||||
|
import org.libreccm.files.CcmFilesConfiguration;
|
||||||
|
import org.libreccm.security.UserRepository;
|
||||||
|
import org.libreccm.tests.categories.IntegrationTest;
|
||||||
|
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.nio.file.FileVisitResult;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.SimpleFileVisitor;
|
||||||
|
import java.nio.file.attribute.BasicFileAttributes;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.PersistenceContext;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.*;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
@Category(IntegrationTest.class)
|
||||||
|
@RunWith(Arquillian.class)
|
||||||
|
@PersistenceTest
|
||||||
|
@Transactional(TransactionMode.COMMIT)
|
||||||
|
@CreateSchema("create_ccm_core_schema.sql")
|
||||||
|
@CleanupUsingScript(value = {"cleanup.sql"},
|
||||||
|
phase = TestExecutionPhase.BEFORE)
|
||||||
|
public class UserImportTest {
|
||||||
|
|
||||||
|
private static final String IMPORT_MANIFEST_SOURCE = "/imports"
|
||||||
|
+ "/org.libreccm.imexport.UserImportTest"
|
||||||
|
+ "/ccm-export.json";
|
||||||
|
private static final String IMPORT_DATA_SOURCE = "/imports"
|
||||||
|
+ "/org.libreccm.imexport.UserImportTest"
|
||||||
|
+ "/org.libreccm.security.User"
|
||||||
|
+ "/7cb9aba4-8071-4f27-af19-096e1473d050.json";
|
||||||
|
|
||||||
|
private static final String TMP_DIR = System.getProperty("java.io.tmpdir");
|
||||||
|
private static final String CCM_TESTS_DIR = TMP_DIR + "/ccm-tests";
|
||||||
|
private static final String IMPORTS_DIR = CCM_TESTS_DIR + "/imports";
|
||||||
|
private static final String USER_IMPORT_TEST_DIR = IMPORTS_DIR
|
||||||
|
+ "/org.libreccm.imexport.UserImportTest";
|
||||||
|
private static final String IMPORT_DATA_DIR = USER_IMPORT_TEST_DIR
|
||||||
|
+ "/org.libreccm.security.User";
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ConfigurationManager confManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ImportExport importExport;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private UserRepository userRepository;
|
||||||
|
|
||||||
|
@PersistenceContext
|
||||||
|
private EntityManager entityManager;
|
||||||
|
|
||||||
|
public UserImportTest() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUpClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void tearDownClass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws IOException, URISyntaxException {
|
||||||
|
|
||||||
|
final CcmFilesConfiguration filesConf = confManager
|
||||||
|
.findConfiguration(CcmFilesConfiguration.class);
|
||||||
|
filesConf.setDataPath(CCM_TESTS_DIR);
|
||||||
|
|
||||||
|
// final Path tmpDirPath = Paths.get(TMP_DIR);
|
||||||
|
final Path ccmTestsDirPath = Paths.get(CCM_TESTS_DIR);
|
||||||
|
final Path importsPath = Paths.get(IMPORTS_DIR);
|
||||||
|
final Path userImportsTestDirPath = Paths.get(USER_IMPORT_TEST_DIR);
|
||||||
|
final Path importDataPath = Paths.get(IMPORT_DATA_DIR);
|
||||||
|
|
||||||
|
if (Files.exists(ccmTestsDirPath)) {
|
||||||
|
Files.walkFileTree(ccmTestsDirPath, new DeleteDirectoryVisitor());
|
||||||
|
}
|
||||||
|
|
||||||
|
Files.createDirectory(ccmTestsDirPath);
|
||||||
|
Files.createDirectory(importsPath);
|
||||||
|
Files.createDirectory(userImportsTestDirPath);
|
||||||
|
Files.createDirectory(importDataPath);
|
||||||
|
|
||||||
|
final InputStream manifestInputStream = getClass()
|
||||||
|
.getResourceAsStream(IMPORT_MANIFEST_SOURCE);
|
||||||
|
final InputStream user1DataInputStream = getClass()
|
||||||
|
.getResourceAsStream(IMPORT_DATA_SOURCE);
|
||||||
|
|
||||||
|
final Path manifestTargetPath = userImportsTestDirPath
|
||||||
|
.resolve("ccm-export.json");
|
||||||
|
final Path user1DataTargetPath = importDataPath
|
||||||
|
.resolve("7cb9aba4-8071-4f27-af19-096e1473d050.json");
|
||||||
|
|
||||||
|
copy(manifestInputStream, manifestTargetPath);
|
||||||
|
copy(user1DataInputStream, user1DataTargetPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copy(final InputStream source, final Path destination) {
|
||||||
|
|
||||||
|
try (final OutputStream outputStream = new FileOutputStream(
|
||||||
|
destination.toFile())) {
|
||||||
|
|
||||||
|
int data = source.read();
|
||||||
|
while (data != -1) {
|
||||||
|
outputStream.write(data);
|
||||||
|
data = source.read();
|
||||||
|
}
|
||||||
|
} catch (IOException ex) {
|
||||||
|
throw new UnexpectedErrorException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() throws IOException {
|
||||||
|
|
||||||
|
final Path ccmTestsDirPath = Paths.get(CCM_TESTS_DIR);
|
||||||
|
Files.walkFileTree(ccmTestsDirPath, new DeleteDirectoryVisitor());
|
||||||
|
}
|
||||||
|
|
||||||
|
private class DeleteDirectoryVisitor extends SimpleFileVisitor<Path> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FileVisitResult visitFile(
|
||||||
|
final Path file, final BasicFileAttributes attrs)
|
||||||
|
throws IOException {
|
||||||
|
|
||||||
|
Files.delete(file);
|
||||||
|
return FileVisitResult.CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FileVisitResult postVisitDirectory(
|
||||||
|
final Path dir, final IOException exc)
|
||||||
|
throws IOException {
|
||||||
|
|
||||||
|
Files.delete(dir);
|
||||||
|
return FileVisitResult.CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deployment
|
||||||
|
public static WebArchive createDeployment() {
|
||||||
|
return ShrinkWrap
|
||||||
|
.create(WebArchive.class,
|
||||||
|
"LibreCCM-org.libreccm.imexport.UserImportTest.war")
|
||||||
|
.addPackage(org.libreccm.cdi.utils.CdiUtil.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.core.CcmObject.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.categorization.Categorization.class
|
||||||
|
.getPackage())
|
||||||
|
.addPackage(org.libreccm.configuration.Configuration.class
|
||||||
|
.getPackage())
|
||||||
|
.addPackage(org.libreccm.files.CcmFiles.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.l10n.LocalizedString.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.imexport.Exportable.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.jpa.EntityManagerProducer.class
|
||||||
|
.getPackage())
|
||||||
|
.addPackage(org.libreccm.jpa.utils.MimeTypeConverter.class
|
||||||
|
.getPackage())
|
||||||
|
.addPackage(org.libreccm.security.User.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.web.CcmApplication.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.workflow.Workflow.class.getPackage())
|
||||||
|
.addPackage(org.libreccm.testutils.EqualsVerifier.class
|
||||||
|
.getPackage())
|
||||||
|
.addPackage(org.libreccm.tests.categories.IntegrationTest.class
|
||||||
|
.getPackage())
|
||||||
|
.addClass(com.arsdigita.kernel.security.SecurityConfig.class)
|
||||||
|
.addClass(com.arsdigita.kernel.KernelConfig.class)
|
||||||
|
.addAsLibraries(getModuleDependencies())
|
||||||
|
.addAsResource("configs/shiro.ini", "shiro.ini")
|
||||||
|
.addAsResource("imports", "imports")
|
||||||
|
.addAsResource("test-persistence.xml",
|
||||||
|
"META-INF/persistence.xml")
|
||||||
|
.addAsWebInfResource("test-web.xml", "web.xml")
|
||||||
|
.addAsWebInfResource("META-INF/beans.xml", "beans.xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@InSequence(100)
|
||||||
|
public void checkIfFilesAreAvailable() {
|
||||||
|
|
||||||
|
final Path importDataPath = Paths.get(
|
||||||
|
TMP_DIR,
|
||||||
|
"ccm-tests",
|
||||||
|
"imports",
|
||||||
|
"org.libreccm.imexport.UserImportTest");
|
||||||
|
final Path manifestPath = importDataPath.resolve("ccm-export.json");
|
||||||
|
final Path typeDirPath = importDataPath
|
||||||
|
.resolve("org.libreccm.security.User");
|
||||||
|
final Path dataFile1Path = typeDirPath
|
||||||
|
.resolve("7cb9aba4-8071-4f27-af19-096e1473d050.json");
|
||||||
|
|
||||||
|
assertThat(String.format("Path %s does not exist.",
|
||||||
|
manifestPath.toString()),
|
||||||
|
Files.exists(manifestPath),
|
||||||
|
is(true));
|
||||||
|
assertThat(String.format("Path %s does not exist.",
|
||||||
|
typeDirPath.toString()),
|
||||||
|
Files.exists(typeDirPath),
|
||||||
|
is(true));
|
||||||
|
assertThat(String.format("Path %s does not exist.",
|
||||||
|
dataFile1Path.toString()),
|
||||||
|
Files.exists(dataFile1Path),
|
||||||
|
is(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@InSequence(150)
|
||||||
|
public void importsAvailable() {
|
||||||
|
|
||||||
|
final List<ImportManifest> imports = importExport
|
||||||
|
.listAvailableImportArchivies();
|
||||||
|
|
||||||
|
assertThat(imports.size(), is(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@UsingDataSet("datasets/org/libreccm/imexport/UserImportTest/data.yml")
|
||||||
|
@ShouldMatchDataSet(value = "datasets/org/libreccm/imexport/UserImportTest"
|
||||||
|
+ "/after-import-single-user.yml",
|
||||||
|
excludeColumns = {"party_id"}
|
||||||
|
)
|
||||||
|
@InSequence(200)
|
||||||
|
public void importSingleUser() {
|
||||||
|
|
||||||
|
importExport.importEntities("org.libreccm.imexport.UserImportTest");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
ccm_core.parties:
|
||||||
|
# John Doe
|
||||||
|
- party_id: -10
|
||||||
|
uuid: 631be113-7e86-453d-9f8b-8cb6cb6df268
|
||||||
|
name: jdoe
|
||||||
|
# Max Muster
|
||||||
|
- party_id: -20
|
||||||
|
uuid: 3a61d302-97a5-4e46-bbc9-8d716f7c54c4
|
||||||
|
name: mmuster
|
||||||
|
# Joe Public
|
||||||
|
- party_id: -30
|
||||||
|
uuid: 7d5ad4a7-c2bd-4e49-8716-0bfb40413c75
|
||||||
|
name: joe
|
||||||
|
# Jane Doe
|
||||||
|
- party_id: -40
|
||||||
|
uuid: 7cb9aba4-8071-4f27-af19-096e1473d050
|
||||||
|
name: janedoe
|
||||||
|
ccm_core.users:
|
||||||
|
# John Doe
|
||||||
|
- banned: false
|
||||||
|
bouncing: false
|
||||||
|
email_address: john.doe@example.com
|
||||||
|
family_name: Doe
|
||||||
|
given_name: John
|
||||||
|
party_id: -10
|
||||||
|
# foo123
|
||||||
|
password: $shiro1$SHA-512$500000$7xkDcZUN0/whJInHIvGsDw==$WhelBVmJU/cLV7lAkMOrE5B/mqCW0bUuid1WX+xBwzzAaekC5bYn9eeOFGJWhiDgmaC50ZCUmM96/iGsRoc4uA==
|
||||||
|
password_reset_required: false
|
||||||
|
verified: true
|
||||||
|
# Max Mustermann
|
||||||
|
- banned: false
|
||||||
|
bouncing: false
|
||||||
|
email_address: max.mustermann@example.org
|
||||||
|
family_name: Mustermann
|
||||||
|
given_name: Max
|
||||||
|
party_id: -20
|
||||||
|
# foo123
|
||||||
|
password: $shiro1$SHA-512$500000$Y7CnccN1h25sR7KCElMOXg==$CVLWBhetodaEzzhDfGjRcCFZtSW02xOnjH7xhBx0lbxO66grKIt6LWmXoUhLEydce1JZ7cbzNLYOxIwwTeqi5Q==
|
||||||
|
password_reset_required: false
|
||||||
|
verified: true
|
||||||
|
# Joe Public
|
||||||
|
- banned: false
|
||||||
|
bouncing: false
|
||||||
|
email_address: joe.public@example.com
|
||||||
|
family_name: Public
|
||||||
|
given_name: Joe
|
||||||
|
party_id: -30
|
||||||
|
password: $shiro1$SHA-512$500000$RUCYXAQt+XzUmj3x8oG5gw==$qU+lX160Jc6sNUOI9X85wlf2lzn4/hLJNURtjmw9LOYJ7vAqUFFmhyNCMxpzuHIpzeMELr+A0XReoSmtcZnOOw==
|
||||||
|
password_reset_required: false
|
||||||
|
verified: true
|
||||||
|
# Jane Doe
|
||||||
|
- banned: false
|
||||||
|
bouncing: false
|
||||||
|
email_address: jane.doe@libreccm.example
|
||||||
|
family_name: Doe
|
||||||
|
given_name: Jane
|
||||||
|
party_id: -40
|
||||||
|
password: ofafodafa
|
||||||
|
password_reset_required: false
|
||||||
|
verified: true
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
ccm_core.parties:
|
||||||
|
# John Doe
|
||||||
|
- party_id: -10
|
||||||
|
uuid: 631be113-7e86-453d-9f8b-8cb6cb6df268
|
||||||
|
name: jdoe
|
||||||
|
# Max Muster
|
||||||
|
- party_id: -20
|
||||||
|
uuid: 3a61d302-97a5-4e46-bbc9-8d716f7c54c4
|
||||||
|
name: mmuster
|
||||||
|
# Joe Public
|
||||||
|
- party_id: -30
|
||||||
|
uuid: 7d5ad4a7-c2bd-4e49-8716-0bfb40413c75
|
||||||
|
name: joe
|
||||||
|
ccm_core.users:
|
||||||
|
# John Doe
|
||||||
|
- banned: false
|
||||||
|
bouncing: false
|
||||||
|
email_address: john.doe@example.com
|
||||||
|
family_name: Doe
|
||||||
|
given_name: John
|
||||||
|
party_id: -10
|
||||||
|
# foo123
|
||||||
|
password: $shiro1$SHA-512$500000$7xkDcZUN0/whJInHIvGsDw==$WhelBVmJU/cLV7lAkMOrE5B/mqCW0bUuid1WX+xBwzzAaekC5bYn9eeOFGJWhiDgmaC50ZCUmM96/iGsRoc4uA==
|
||||||
|
password_reset_required: false
|
||||||
|
verified: true
|
||||||
|
# Max Mustermann
|
||||||
|
- banned: false
|
||||||
|
bouncing: false
|
||||||
|
email_address: max.mustermann@example.org
|
||||||
|
family_name: Mustermann
|
||||||
|
given_name: Max
|
||||||
|
party_id: -20
|
||||||
|
# foo123
|
||||||
|
password: $shiro1$SHA-512$500000$Y7CnccN1h25sR7KCElMOXg==$CVLWBhetodaEzzhDfGjRcCFZtSW02xOnjH7xhBx0lbxO66grKIt6LWmXoUhLEydce1JZ7cbzNLYOxIwwTeqi5Q==
|
||||||
|
password_reset_required: false
|
||||||
|
verified: true
|
||||||
|
# Joe Public
|
||||||
|
- banned: false
|
||||||
|
bouncing: false
|
||||||
|
email_address: joe.public@example.com
|
||||||
|
family_name: Public
|
||||||
|
given_name: Joe
|
||||||
|
party_id: -30
|
||||||
|
password: $shiro1$SHA-512$500000$RUCYXAQt+XzUmj3x8oG5gw==$qU+lX160Jc6sNUOI9X85wlf2lzn4/hLJNURtjmw9LOYJ7vAqUFFmhyNCMxpzuHIpzeMELr+A0XReoSmtcZnOOw==
|
||||||
|
password_reset_required: false
|
||||||
|
verified: true
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"created": "2018-11-18T12:00:00",
|
||||||
|
"onServer": "tests.libreccm.example",
|
||||||
|
"types": [
|
||||||
|
"org.libreccm.security.User"
|
||||||
|
],
|
||||||
|
"enities": {
|
||||||
|
"org.libreccm.security.User": [
|
||||||
|
"7cb9aba4-8071-4f27-af19-096e1473d050"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"id": 4345,
|
||||||
|
"uuid": "7cb9aba4-8071-4f27-af19-096e1473d050",
|
||||||
|
"name": "janedoe",
|
||||||
|
"givenName": "Jane",
|
||||||
|
"familyName": "Doe",
|
||||||
|
"primaryEmailAddress": {
|
||||||
|
"address": "jane.doe@libreccm.example",
|
||||||
|
"bouncing": false,
|
||||||
|
"verified": true
|
||||||
|
},
|
||||||
|
"banned": false,
|
||||||
|
"password": "ofafodafa",
|
||||||
|
"passwordResetRequired": false
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue