diff --git a/ccm-core/src/main/java/org/libreccm/imexport/AbstractEntityImExporter.java b/ccm-core/src/main/java/org/libreccm/imexport/AbstractEntityImExporter.java index 2d3e6a922..b3ecd72b0 100644 --- a/ccm-core/src/main/java/org/libreccm/imexport/AbstractEntityImExporter.java +++ b/ccm-core/src/main/java/org/libreccm/imexport/AbstractEntityImExporter.java @@ -25,6 +25,7 @@ import java.io.IOException; import java.util.Set; import javax.enterprise.context.RequestScoped; +import javax.transaction.Transactional; /** * Base class for importers/exporters. Implementations must be annotated with @@ -69,6 +70,7 @@ public abstract class AbstractEntityImExporter { */ protected abstract Set> getRequiredEntities(); + @Transactional(Transactional.TxType.REQUIRED) public T importEntity(final String data) throws ImportExpection { try { @@ -81,6 +83,7 @@ public abstract class AbstractEntityImExporter { } + @Transactional(Transactional.TxType.REQUIRED) public String exportEntity(final Exportable entity) throws ExportException { try { diff --git a/ccm-core/src/main/java/org/libreccm/security/GroupImExporter.java b/ccm-core/src/main/java/org/libreccm/security/GroupImExporter.java index 156e93839..939c016bf 100644 --- a/ccm-core/src/main/java/org/libreccm/security/GroupImExporter.java +++ b/ccm-core/src/main/java/org/libreccm/security/GroupImExporter.java @@ -49,6 +49,7 @@ public class GroupImExporter extends AbstractEntityImExporter{ @Transactional(Transactional.TxType.REQUIRED) protected void saveImportedEntity(final Group entity) { + entity.setPartyId(0); groupRepository.save(entity); } diff --git a/ccm-core/src/main/java/org/libreccm/security/GroupMembershipImExporter.java b/ccm-core/src/main/java/org/libreccm/security/GroupMembershipImExporter.java index 9c42b7254..6c08bc790 100644 --- a/ccm-core/src/main/java/org/libreccm/security/GroupMembershipImExporter.java +++ b/ccm-core/src/main/java/org/libreccm/security/GroupMembershipImExporter.java @@ -59,6 +59,7 @@ public class GroupMembershipImExporter extends AbstractEntityImExporterJens Pelzetter + */ +@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 GroupMembershipImportTest { + + private static final String IMPORT_MANIFEST_SOURCE = "/imports" + + "/org.libreccm.imexport.GroupMembershipImportTest" + + "/ccm-export.json"; + private static final String IMPORT_GROUPMEMBERSHIP_TOC_SOURCE = "/imports" + + "/org.libreccm.imexport.GroupMembershipImportTest" + + "/org.libreccm.security.GroupMembership" + + "/org.libreccm.security.GroupMembership.json"; + private static final String IMPORT_GROUPMEMBERSHIP_DATA_SOURCE = "/imports" + + "/org.libreccm.imexport.GroupMembershipImportTest" + + "/org.libreccm.security.GroupMembership" + + "/f8ac4073-447e-4bd6-ac96-3bf92bdc8ce7.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 GROUPMEMBERSHIP_IMPORT_TEST_DIR = IMPORTS_DIR + + "/org.libreccm.imexport.GroupMembershipImportTest"; + private static final String IMPORT_GROUPMEMBERSHIP_DATA_DIR + = GROUPMEMBERSHIP_IMPORT_TEST_DIR + + "/org.libreccm.security.GroupMembership"; + + @Inject + private ConfigurationManager confManager; + + @Inject + private ImportExport importExport; + + @Inject + private Shiro shiro; + + public GroupMembershipImportTest() { + + } + + @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 ccmTestsDirPath = Paths.get(CCM_TESTS_DIR); + final Path importsPath = Paths.get(IMPORTS_DIR); + final Path groupMembershipsImportsTestDirPath = Paths.get( + GROUPMEMBERSHIP_IMPORT_TEST_DIR); + final Path importGroupMembershipDataPath = Paths.get( + IMPORT_GROUPMEMBERSHIP_DATA_DIR); + + if (Files.exists(ccmTestsDirPath)) { + Files.walkFileTree(ccmTestsDirPath, + new DeleteDirectoryVisitor()); + } + + Files.createDirectory(ccmTestsDirPath); + Files.createDirectory(importsPath); + Files.createDirectory(groupMembershipsImportsTestDirPath); + Files.createDirectory(importGroupMembershipDataPath); + + final InputStream manifestInputStream = getClass() + .getResourceAsStream(IMPORT_MANIFEST_SOURCE); + final InputStream groupMembershipsTocInputStream = getClass() + .getResourceAsStream(IMPORT_GROUPMEMBERSHIP_TOC_SOURCE); + final InputStream groupMembership1DataInputStream = getClass() + .getResourceAsStream(IMPORT_GROUPMEMBERSHIP_DATA_SOURCE); + + final Path manifestTargetPath = groupMembershipsImportsTestDirPath + .resolve("ccm-export.json"); + final Path groupMembershipsTocTargetPath = importGroupMembershipDataPath + .resolve("org.libreccm.security.GroupMembership.json"); + final Path groupMembership1DataTargetPath + = importGroupMembershipDataPath + .resolve("f8ac4073-447e-4bd6-ac96-3bf92bdc8ce7.json"); + + copy(manifestInputStream, manifestTargetPath); + copy(groupMembershipsTocInputStream, groupMembershipsTocTargetPath); + copy(groupMembership1DataInputStream, groupMembership1DataTargetPath); + + } + + 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 { + + @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.GroupImportTest.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.Group.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.GroupMembershipImportTest"); + final Path manifestPath = importDataPath.resolve("ccm-export.json"); + + final Path groupMembershipTypeDirPath = importDataPath + .resolve("org.libreccm.security.GroupMembership"); + + final Path groupMembershipDataFile1Path = groupMembershipTypeDirPath + .resolve("f8ac4073-447e-4bd6-ac96-3bf92bdc8ce7.json"); + + assertThat(String.format("Path %s does not exist.", + manifestPath.toString()), + Files.exists(manifestPath), + is(true)); + assertThat(String.format("Path %s does not exist.", + groupMembershipTypeDirPath.toString()), + Files.exists(groupMembershipTypeDirPath), + is(true)); + assertThat(String.format("Path %s does not exist.", + groupMembershipDataFile1Path.toString()), + Files.exists(groupMembershipDataFile1Path), + is(true)); + } + + @Test + @InSequence(150) + public void importsAvailable() { + + final List imports = importExport + .listAvailableImportArchivies(); + + assertThat(imports.size(), is(1)); + } + + @Test + @UsingDataSet( + "datasets/org/libreccm/imexport/GroupMembershipImportTest/data.yml") + @ShouldMatchDataSet(value = "datasets/org/libreccm/imexport/" + + "GroupMembershipImportTest" + + "/after-import-single-membership.yml", + excludeColumns = {"party_id", "membership_id"}) + @InSequence(200) + public void importSingleGroupMembership() { + + shiro.getSystemUser().execute(() + -> importExport.importEntities( + "org.libreccm.imexport.GroupMembershipImportTest") + ); + } + +} diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/imexport/GroupMembershipImportTest/after-import-single-membership.yml b/ccm-core/src/test/resources/datasets/org/libreccm/imexport/GroupMembershipImportTest/after-import-single-membership.yml new file mode 100644 index 000000000..191dde8a3 --- /dev/null +++ b/ccm-core/src/test/resources/datasets/org/libreccm/imexport/GroupMembershipImportTest/after-import-single-membership.yml @@ -0,0 +1,70 @@ +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 + # Group 1 + - party_id: -100 + uuid: 7200c286-5045-4305-8f40-86cc078b5943 + name: group-1 + # Group 2 + - party_id: -200 + uuid: ebdc9a12-8f4e-48e8-92ec-900c65189895 + name: group-2 +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 +ccm_core.groups: + # Group 1 + - party_id: -100 + # Group 2 + - party_id: -200 +ccm_core.group_memberships: + - membership_id: -1000 + uuid: b32bd614-00b7-4f1e-b1a3-4fc53f230082 + group_id: -200 + member_id: -30 + - membership_id: -2000 + uuid: f8ac4073-447e-4bd6-ac96-3bf92bdc8ce7 + group_id: -100 + member_id: -10 + + diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/imexport/GroupMembershipImportTest/data.yml b/ccm-core/src/test/resources/datasets/org/libreccm/imexport/GroupMembershipImportTest/data.yml new file mode 100644 index 000000000..a1de45974 --- /dev/null +++ b/ccm-core/src/test/resources/datasets/org/libreccm/imexport/GroupMembershipImportTest/data.yml @@ -0,0 +1,65 @@ +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 + # Group 1 + - party_id: -100 + uuid: 7200c286-5045-4305-8f40-86cc078b5943 + name: group-1 + # Group 2 + - party_id: -200 + uuid: ebdc9a12-8f4e-48e8-92ec-900c65189895 + name: group-2 +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 +ccm_core.groups: + # Group 1 + - party_id: -100 + # Group 2 + - party_id: -200 +ccm_core.group_memberships: + - membership_id: -1000 + uuid: b32bd614-00b7-4f1e-b1a3-4fc53f230082 + group_id: -200 + member_id: -30 + diff --git a/ccm-core/src/test/resources/imports/org.libreccm.imexport.GroupMembershipImportTest/ccm-export.json b/ccm-core/src/test/resources/imports/org.libreccm.imexport.GroupMembershipImportTest/ccm-export.json new file mode 100644 index 000000000..fa8089fe2 --- /dev/null +++ b/ccm-core/src/test/resources/imports/org.libreccm.imexport.GroupMembershipImportTest/ccm-export.json @@ -0,0 +1,12 @@ +{ + "created": "2018-12-01T12:00:00", + "onServer": "tests.libreccm.example", + "types": [ + "org.libreccm.security.GroupMembership" + ], + "entities": { + "org.libreccm.security.GroupMembership": [ + "f8ac4073-447e-4bd6-ac96-3bf92bdc8ce7" + ] + } +} diff --git a/ccm-core/src/test/resources/imports/org.libreccm.imexport.GroupMembershipImportTest/org.libreccm.security.GroupMembership/f8ac4073-447e-4bd6-ac96-3bf92bdc8ce7.json b/ccm-core/src/test/resources/imports/org.libreccm.imexport.GroupMembershipImportTest/org.libreccm.security.GroupMembership/f8ac4073-447e-4bd6-ac96-3bf92bdc8ce7.json new file mode 100644 index 000000000..16aec1b3e --- /dev/null +++ b/ccm-core/src/test/resources/imports/org.libreccm.imexport.GroupMembershipImportTest/org.libreccm.security.GroupMembership/f8ac4073-447e-4bd6-ac96-3bf92bdc8ce7.json @@ -0,0 +1,6 @@ +{ + "membershipId": 123456, + "uuid": "f8ac4073-447e-4bd6-ac96-3bf92bdc8ce7", + "group": "7200c286-5045-4305-8f40-86cc078b5943", + "member": "631be113-7e86-453d-9f8b-8cb6cb6df268" +} diff --git a/ccm-core/src/test/resources/imports/org.libreccm.imexport.GroupMembershipImportTest/org.libreccm.security.GroupMembership/org.libreccm.security.GroupMembership.json b/ccm-core/src/test/resources/imports/org.libreccm.imexport.GroupMembershipImportTest/org.libreccm.security.GroupMembership/org.libreccm.security.GroupMembership.json new file mode 100644 index 000000000..6122194ba --- /dev/null +++ b/ccm-core/src/test/resources/imports/org.libreccm.imexport.GroupMembershipImportTest/org.libreccm.security.GroupMembership/org.libreccm.security.GroupMembership.json @@ -0,0 +1,5 @@ +{ + "files": [ + "f8ac4073-447e-4bd6-ac96-3bf92bdc8ce7.json" + ] +}