This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 9738e5dd547076471912d3046888d86b2fa9e592
Author: Tran Tien Duc <[email protected]>
AuthorDate: Mon Mar 25 15:34:41 2019 +0700

    JAMES-2688 DeletedMessageVault Export API Integration Tests
---
 .../org/apache/james/mailbox/backup/ZipAssert.java |  23 ++-
 .../cassandra-jmap-integration-testing/pom.xml     |   5 +
 .../CassandraDeletedMessageVaultTest.java          |   6 +-
 .../jmap-integration-testing-common/pom.xml        |   6 +
 .../integration/DeletedMessagesVaultTest.java      | 229 ++++++++++++++++++++-
 .../memory-jmap-integration-testing/pom.xml        |   5 +
 ...FileMailRepositoryDeletedMessagesVaultTest.java |   6 +-
 .../memory/MemoryDeletedMessagesVaultTest.java     |   6 +-
 .../rabbitmq-jmap-integration-testing/pom.xml      |   5 +
 .../rabbitmq/RabbitMQDeletedMessagesVaultTest.java |   6 +-
 10 files changed, 281 insertions(+), 16 deletions(-)

diff --git 
a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssert.java 
b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssert.java
index 9f0c9b0..4721ffd 100644
--- 
a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssert.java
+++ 
b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssert.java
@@ -36,6 +36,7 @@ import 
org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
 import org.apache.commons.compress.archivers.zip.ZipExtraField;
 import org.apache.commons.compress.archivers.zip.ZipFile;
 import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;
+import org.apache.commons.io.IOUtils;
 import org.assertj.core.api.AbstractAssert;
 import org.assertj.core.error.BasicErrorMessageFactory;
 import org.assertj.core.error.ErrorMessageFactory;
@@ -91,6 +92,14 @@ public class ZipAssert extends AbstractAssert<ZipAssert, 
ZipFile> implements Aut
         return assertThatZip(new ZipFile(new 
SeekableInMemoryByteChannel(outputStream.toByteArray())));
     }
 
+    public static ZipAssert assertThatZip(InputStream inputStream) throws 
IOException {
+        return assertThatZip(zipFileFromInputStream(inputStream));
+    }
+
+    private static ZipFile zipFileFromInputStream(InputStream inputStream) 
throws IOException {
+        return new ZipFile(new 
SeekableInMemoryByteChannel(IOUtils.toByteArray(inputStream)));
+    }
+
     private static BasicErrorMessageFactory shouldHaveSize(ZipFile zipFile, 
int expected, int actual) {
         return new BasicErrorMessageFactory("%nExpecting %s to have size %s 
but was %s", zipFile, expected, actual);
     }
@@ -104,12 +113,12 @@ public class ZipAssert extends AbstractAssert<ZipAssert, 
ZipFile> implements Aut
     }
 
     private static BasicErrorMessageFactory 
shouldHaveSameEntriesSize(List<ZipArchiveEntry> entries, List<ZipArchiveEntry> 
expectedEntries) {
-        return new BasicErrorMessageFactory("%nExpecting zipFile entries has 
size (%s) but actually (%s)", expectedEntries.size(), entries.size());
+        return new BasicErrorMessageFactory("%nExpecting zipFile to contains 
%s entries (%s) but actually contains (%s)",
+            expectedEntries.size(), expectedEntries, entries);
     }
 
-    private static ErrorMessageFactory entriesShouldHaveSameContentAt(int 
entryIndex, String entryContentAssertionError) {
-        return new BasicErrorMessageFactory("%nExpecting zipFile entry at 
index %s have same content. Details: \n%s",
-            entryIndex, entryContentAssertionError);
+    private static ErrorMessageFactory entriesShouldHaveSameContentAt(int 
entryIndex) {
+        return new BasicErrorMessageFactory("%nExpecting zipFile entry at 
index %s has same content", entryIndex);
     }
 
     private static ErrorMessageFactory 
entriesShouldHaveSameName(ZipArchiveEntry entry, ZipArchiveEntry expectedEntry, 
int entryIndex) {
@@ -160,6 +169,10 @@ public class ZipAssert extends AbstractAssert<ZipAssert, 
ZipFile> implements Aut
         zipFile.close();
     }
 
+    public ZipAssert hasSameContentWith(InputStream inputStream) throws 
IOException {
+        return hasSameContentWith(zipFileFromInputStream(inputStream));
+    }
+
     public ZipAssert hasSameContentWith(ZipFile anotherZipFile) throws 
IOException {
         validateNonNull(zipFile);
         validateNonNull(anotherZipFile);
@@ -204,7 +217,7 @@ public class ZipAssert extends AbstractAssert<ZipAssert, 
ZipFile> implements Aut
             assertThat(entryContent)
                 .hasSameContentAs(expectingEntryContent);
         } catch (AssertionError assertionError) {
-            throwAssertionError(entriesShouldHaveSameContentAt(entryIndex, 
assertionError.getMessage()));
+            throwAssertionError(entriesShouldHaveSameContentAt(entryIndex));
         }
     }
 
diff --git 
a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/pom.xml
 
b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/pom.xml
index fded2b6..82f0d44 100644
--- 
a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/pom.xml
+++ 
b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/pom.xml
@@ -82,6 +82,11 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>backup</artifactId>
+            <type>test-jar</type>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>blob-objectstorage-guice</artifactId>
             <scope>test</scope>
         </dependency>
diff --git 
a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
 
b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
index 1f331c4..9cbc0ec 100644
--- 
a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
+++ 
b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import org.apache.james.CassandraJmapTestRule;
 import org.apache.james.DockerCassandraRule;
 import org.apache.james.GuiceJamesServer;
+import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.jmap.methods.integration.DeletedMessagesVaultTest;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.mailbox.PreDeletionHookConfiguration;
@@ -42,14 +43,15 @@ public class CassandraDeletedMessageVaultTest extends 
DeletedMessagesVaultTest {
     public CassandraJmapTestRule rule = 
CassandraJmapTestRule.defaultTestRule();
     
     @Override
-    protected GuiceJamesServer createJmapServer() throws IOException {
+    protected GuiceJamesServer createJmapServer(FileSystem fileSystem) throws 
IOException {
         return rule.jmapServer(cassandra.getModule(),
             binder -> binder.bind(PreDeletionHooksConfiguration.class)
                 .toInstance(PreDeletionHooksConfiguration.forHooks(
                     
PreDeletionHookConfiguration.forClass(DeletedMessageVaultHook.class))),
             binder -> 
binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION),
             binder -> 
binder.bind(MailRepositoryDeletedMessageVault.Configuration.class)
-                .toInstance(new 
MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("cassandra://var/deletedMessages/user"))));
+                .toInstance(new 
MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("cassandra://var/deletedMessages/user"))),
+            binder -> binder.bind(FileSystem.class).toInstance(fileSystem));
     }
 
     @Override
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/pom.xml
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/pom.xml
index c1bca3d..5925135 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/pom.xml
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/pom.xml
@@ -52,6 +52,12 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>backup</artifactId>
+            <scope>test</scope>
+            <type>test-jar</type>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-data-jmap</artifactId>
             <scope>test</scope>
         </dependency>
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
index 109fa2b..7807d7b 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java
@@ -22,6 +22,7 @@ package org.apache.james.jmap.methods.integration;
 import static io.restassured.RestAssured.given;
 import static io.restassured.RestAssured.with;
 import static 
org.apache.james.jmap.HttpJmapAuthentication.authenticateJamesUser;
+import static org.apache.james.jmap.JmapCommonRequests.getLastMessageId;
 import static org.apache.james.jmap.JmapCommonRequests.getOutboxId;
 import static 
org.apache.james.jmap.JmapCommonRequests.listMessageIdsForAccount;
 import static org.apache.james.jmap.JmapURIBuilder.baseUri;
@@ -30,6 +31,8 @@ import static org.apache.james.jmap.TestingConstants.DOMAIN;
 import static org.apache.james.jmap.TestingConstants.LOCALHOST_IP;
 import static org.apache.james.jmap.TestingConstants.calmlyAwait;
 import static org.apache.james.jmap.TestingConstants.jmapRequestSpecBuilder;
+import static org.apache.james.mailbox.backup.ZipAssert.EntryChecks.hasName;
+import static org.apache.james.mailbox.backup.ZipAssert.assertThatZip;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.Matchers.hasItem;
 import static org.hamcrest.Matchers.is;
@@ -39,14 +42,18 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 import org.apache.james.GuiceJamesServer;
+import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.jmap.categories.BasicFeature;
 import org.apache.james.mailbox.DefaultMailboxes;
+import org.apache.james.mailbox.backup.ZipAssert;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.probe.MailboxProbe;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.modules.protocols.ImapGuiceProbe;
 import org.apache.james.probe.DataProbe;
+import org.apache.james.server.core.JamesServerResourceLoader;
+import org.apache.james.server.core.filesystem.FileSystemImpl;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.JmapGuiceProbe;
@@ -59,6 +66,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
+import org.junit.rules.TemporaryFolder;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
@@ -68,6 +76,39 @@ import io.restassured.parsing.Parser;
 import io.restassured.specification.RequestSpecification;
 
 public abstract class DeletedMessagesVaultTest {
+
+    private static class ExportRequest {
+
+        private static class Builder {
+
+            @FunctionalInterface
+            interface RequireSharee {
+                RequireMatchingQuery exportTo(String sharee);
+            }
+
+            @FunctionalInterface
+            interface RequireMatchingQuery {
+                ExportRequest query(String query);
+            }
+        }
+
+        private static Builder.RequireSharee userExportFrom(String 
userExportFrom) {
+            return sharee -> query -> new ExportRequest(userExportFrom, 
sharee, query);
+        }
+
+        private final String userExportFrom;
+        private final String sharee;
+        private final String matchingQuery;
+
+        private ExportRequest(String userExportFrom, String sharee, String 
matchingQuery) {
+            this.userExportFrom = userExportFrom;
+            this.sharee = sharee;
+            this.matchingQuery = matchingQuery;
+        }
+    }
+
+    private static final String FIRST_SUBJECT = "first subject";
+    private static final String SECOND_SUBJECT = "second subject";
     private static final String HOMER = "homer@" + DOMAIN;
     private static final String BART = "bart@" + DOMAIN;
     private static final String PASSWORD = "password";
@@ -79,24 +120,32 @@ public abstract class DeletedMessagesVaultTest {
         "\"combinator\": \"and\"," +
         "\"criteria\": []" +
         "}";
+    private static final ExportRequest EXPORT_ALL_HOMER_MESSAGES_TO_BART = 
ExportRequest
+        .userExportFrom(HOMER)
+        .exportTo(BART)
+        .query(MATCH_ALL_QUERY);
 
     private MailboxId otherMailboxId;
 
-    protected abstract GuiceJamesServer createJmapServer() throws IOException;
+    protected abstract GuiceJamesServer createJmapServer(FileSystem 
fileSystem) throws IOException;
 
     protected abstract void awaitSearchUpToDate();
 
     @Rule
     public IMAPMessageReader imapMessageReader = new IMAPMessageReader();
+    @Rule
+    public TemporaryFolder tempFolder = new TemporaryFolder();
 
     private AccessToken homerAccessToken;
     private AccessToken bartAccessToken;
     private GuiceJamesServer jmapServer;
     private RequestSpecification webAdminApi;
+    private FileSystem fileSystem;
 
     @Before
     public void setup() throws Throwable {
-        jmapServer = createJmapServer();
+        fileSystem = new FileSystemImpl(new 
JamesServerResourceLoader(tempFolder.getRoot().getPath()));
+        jmapServer = createJmapServer(fileSystem);
         jmapServer.start();
         MailboxProbe mailboxProbe = 
jmapServer.getProbe(MailboxProbeImpl.class);
         DataProbe dataProbe = jmapServer.getProbe(DataProbeImpl.class);
@@ -118,7 +167,7 @@ public abstract class DeletedMessagesVaultTest {
     }
 
     @After
-    public void tearDown() {
+    public void tearDown() throws Exception {
         jmapServer.stop();
     }
 
@@ -405,6 +454,166 @@ public abstract class DeletedMessagesVaultTest {
             .body(ARGUMENTS + ".list.subject", hasItem(SUBJECT));
     }
 
+    @Category(BasicFeature.class)
+    @Test
+    public void 
vaultExportShouldExportZipContainsVaultMessagesToShareeWhenJmapDeleteMessage() 
throws Exception {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 1);
+        String messageIdOfHomer = 
listMessageIdsForAccount(homerAccessToken).get(0);
+
+        homerDeletesMessages(listMessageIdsForAccount(homerAccessToken));
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        String fileLocation = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartAccessToken);
+
+        try (ZipAssert zipAssert = 
assertThatZip(fileSystem.getResource(fileLocation))) {
+            zipAssert.containsOnlyEntriesMatching(hasName(messageIdOfHomer));
+        }
+    }
+
+    @Category(BasicFeature.class)
+    @Test
+    public void 
vaultExportShouldExportZipContainsVaultMessagesToShareeWhenImapDeleteMessage() 
throws Exception {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 1);
+        String messageIdOfHomer = 
listMessageIdsForAccount(homerAccessToken).get(0);
+
+        imapMessageReader.connect(LOCALHOST_IP, 
jmapServer.getProbe(ImapGuiceProbe.class).getImapPort())
+            .login(HOMER, PASSWORD)
+            .select(IMAPMessageReader.INBOX)
+            .setFlagsForAllMessagesInMailbox("\\Deleted");
+        imapMessageReader.expunge();
+
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        String fileLocation = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartAccessToken);
+
+        try (ZipAssert zipAssert = 
assertThatZip(fileSystem.getResource(fileLocation))) {
+            zipAssert.containsOnlyEntriesMatching(hasName(messageIdOfHomer));
+        }
+    }
+
+    @Category(BasicFeature.class)
+    @Test
+    public void 
vaultExportShouldExportZipContainsVaultMessagesToShareeWhenImapDeletedMailbox() 
throws Exception {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 1);
+        String messageIdOfHomer = 
listMessageIdsForAccount(homerAccessToken).get(0);
+
+        imapMessageReader.connect(LOCALHOST_IP, 
jmapServer.getProbe(ImapGuiceProbe.class).getImapPort())
+            .login(HOMER, PASSWORD)
+            .select(IMAPMessageReader.INBOX);
+
+        imapMessageReader.moveFirstMessage(MAILBOX_NAME);
+
+        imapMessageReader.delete(MAILBOX_NAME);
+
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        String fileLocation = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartAccessToken);
+
+        try (ZipAssert zipAssert = 
assertThatZip(fileSystem.getResource(fileLocation))) {
+            zipAssert.containsOnlyEntriesMatching(hasName(messageIdOfHomer));
+        }
+    }
+
+    @Test
+    public void vaultExportShouldExportZipContainsOnlyMatchedMessages() throws 
Exception {
+        bartSendMessageToHomerWithSubject(FIRST_SUBJECT);
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 1);
+        String firstMessageIdOfHomer = 
listMessageIdsForAccount(homerAccessToken).get(0);
+
+        bartSendMessageToHomerWithSubject(SECOND_SUBJECT);
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 2);
+        String secondMessageIdOfHomer = 
listMessageIdsForAccount(homerAccessToken).get(1);
+
+        homerDeletesMessages(listMessageIdsForAccount(homerAccessToken));
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        ExportRequest exportRequest = ExportRequest
+            .userExportFrom(HOMER)
+            .exportTo(BART)
+            .query("{" +
+                "  \"fieldName\": \"subject\"," +
+                "  \"operator\": \"equals\"," +
+                "  \"value\": \"" + FIRST_SUBJECT + "\"" +
+                "}");
+        String fileLocation = 
exportAndGetFileLocationFromLastMail(exportRequest, bartAccessToken);
+
+        try (ZipAssert zipAssert = 
assertThatZip(fileSystem.getResource(fileLocation))) {
+            
zipAssert.containsOnlyEntriesMatching(hasName(firstMessageIdOfHomer));
+        }
+    }
+
+    @Test
+    public void vaultExportShouldExportEmptyZipWhenQueryDoesntMatch() throws 
Exception {
+        bartSendMessageToHomerWithSubject(FIRST_SUBJECT);
+        bartSendMessageToHomerWithSubject(SECOND_SUBJECT);
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 2);
+
+        homerDeletesMessages(listMessageIdsForAccount(homerAccessToken));
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        ExportRequest exportRequest = ExportRequest
+            .userExportFrom(HOMER)
+            .exportTo(BART)
+            .query("{" +
+                "  \"fieldName\": \"subject\"," +
+                "  \"operator\": \"equals\"," +
+                "  \"value\": \"non matching\"" +
+                "}");
+        String fileLocation = 
exportAndGetFileLocationFromLastMail(exportRequest, bartAccessToken);
+
+        try (ZipAssert zipAssert = 
assertThatZip(fileSystem.getResource(fileLocation))) {
+            zipAssert.hasNoEntry();
+        }
+    }
+
+    @Test
+    public void vaultExportShouldExportEmptyZipWhenVaultIsEmpty() throws 
Exception {
+        String fileLocation = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartAccessToken);
+
+        try (ZipAssert zipAssert = 
assertThatZip(fileSystem.getResource(fileLocation))) {
+            zipAssert.hasNoEntry();
+        }
+    }
+
+    @Test
+    public void vaultExportShouldResponseIdempotentSideEffect() throws 
Exception {
+        bartSendMessageToHomer();
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 1);
+
+        homerDeletesMessages(listMessageIdsForAccount(homerAccessToken));
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(homerAccessToken).size() == 0);
+
+        String fileLocationFirstExport = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartAccessToken);
+        String fileLocationSecondExport = 
exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, 
bartAccessToken);
+
+        try (ZipAssert zipAssert = 
assertThatZip(fileSystem.getResource(fileLocationFirstExport))) {
+            
zipAssert.hasSameContentWith(fileSystem.getResource(fileLocationSecondExport));
+        }
+    }
+
+    private String exportAndGetFileLocationFromLastMail(ExportRequest 
exportRequest, AccessToken shareeAccessToken) {
+        int currentNumberOfMessages = 
listMessageIdsForAccount(shareeAccessToken).size();
+        exportVaultContent(exportRequest);
+
+        WAIT_TWO_MINUTES.until(() -> 
listMessageIdsForAccount(shareeAccessToken).size() == currentNumberOfMessages + 
1);
+        String exportingMessageId = getLastMessageId(shareeAccessToken);
+        return exportedFileLocationFromMailHeader(exportingMessageId, 
shareeAccessToken);
+
+    }
+
+    private String exportedFileLocationFromMailHeader(String messageId, 
AccessToken accessToken) {
+        return with()
+                .header("Authorization", accessToken.serialize())
+                .body("[[\"getMessages\", {\"ids\": [\"" + messageId + "\"]}, 
\"#0\"]]")
+                .post("/jmap")
+            .jsonPath()
+                .getList(ARGUMENTS + ".list.headers.corresponding-file", 
String.class)
+                .get(0);
+    }
+
     private void homerSharesHisMailboxWithBart() {
         with()
             .header("Authorization", homerAccessToken.serialize())
@@ -518,4 +727,18 @@ public abstract class DeletedMessagesVaultTest {
             .when()
             .post("/jmap");
     }
+
+    private void exportVaultContent(ExportRequest exportRequest) {
+        String taskId =
+            webAdminApi.with()
+                .body(exportRequest.matchingQuery)
+                .post("/deletedMessages/users/" + exportRequest.userExportFrom 
+ "?action=export&exportTo=" + exportRequest.sharee)
+            .jsonPath()
+                .get("taskId");
+
+        webAdminApi.given()
+                .get("/tasks/" + taskId + "/await")
+            .then()
+                .body("status", is("completed"));
+    }
 }
diff --git 
a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/pom.xml
 
b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/pom.xml
index 02531d3..d2601dc 100644
--- 
a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/pom.xml
+++ 
b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/pom.xml
@@ -57,6 +57,11 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>backup</artifactId>
+            <type>test-jar</type>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-dnsservice-test</artifactId>
         </dependency>
         <dependency>
diff --git 
a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/FileMailRepositoryDeletedMessagesVaultTest.java
 
b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/FileMailRepositoryDeletedMessagesVaultTest.java
index ec7dd62..4656d9d 100644
--- 
a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/FileMailRepositoryDeletedMessagesVaultTest.java
+++ 
b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/FileMailRepositoryDeletedMessagesVaultTest.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.MemoryJmapTestRule;
+import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.jmap.methods.integration.DeletedMessagesVaultTest;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.mailbox.PreDeletionHookConfiguration;
@@ -43,13 +44,14 @@ public class FileMailRepositoryDeletedMessagesVaultTest 
extends DeletedMessagesV
     }
 
     @Override
-    protected GuiceJamesServer createJmapServer() throws IOException {
+    protected GuiceJamesServer createJmapServer(FileSystem fileSystem) throws 
IOException {
         return memoryJmap.jmapServer(
             binder -> binder.bind(PreDeletionHooksConfiguration.class)
                 .toInstance(PreDeletionHooksConfiguration.forHooks(
                     
PreDeletionHookConfiguration.forClass(DeletedMessageVaultHook.class))),
             binder -> 
binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION),
             binder -> 
binder.bind(MailRepositoryDeletedMessageVault.Configuration.class)
-                .toInstance(new 
MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("file://var/deletedMessages/user"))));
+                .toInstance(new 
MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("file://var/deletedMessages/user"))),
+            binder -> binder.bind(FileSystem.class).toInstance(fileSystem));
     }
 }
diff --git 
a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
 
b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
index d83717d..62360ad 100644
--- 
a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
+++ 
b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/java/org/apache/james/jmap/memory/MemoryDeletedMessagesVaultTest.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.MemoryJmapTestRule;
+import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.jmap.methods.integration.DeletedMessagesVaultTest;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.mailbox.PreDeletionHookConfiguration;
@@ -37,14 +38,15 @@ public class MemoryDeletedMessagesVaultTest extends 
DeletedMessagesVaultTest {
     public MemoryJmapTestRule memoryJmap = new MemoryJmapTestRule();
 
     @Override
-    protected GuiceJamesServer createJmapServer() throws IOException {
+    protected GuiceJamesServer createJmapServer(FileSystem fileSystem) throws 
IOException {
         return memoryJmap.jmapServer(
             binder -> binder.bind(PreDeletionHooksConfiguration.class)
                 .toInstance(PreDeletionHooksConfiguration.forHooks(
                     
PreDeletionHookConfiguration.forClass(DeletedMessageVaultHook.class))),
             binder -> 
binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION),
             binder -> 
binder.bind(MailRepositoryDeletedMessageVault.Configuration.class)
-                .toInstance(new 
MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("memory://var/deletedMessages/user"))));
+                .toInstance(new 
MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("memory://var/deletedMessages/user"))),
+            binder -> binder.bind(FileSystem.class).toInstance(fileSystem));
     }
 
     @Override
diff --git 
a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/pom.xml
 
b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/pom.xml
index 21fec29..a6c4482 100644
--- 
a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/pom.xml
+++ 
b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/pom.xml
@@ -53,6 +53,11 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>backup</artifactId>
+            <type>test-jar</type>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>blob-objectstorage</artifactId>
             <type>test-jar</type>
             <scope>test</scope>
diff --git 
a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
 
b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
index 840f45c..30f0a3a 100644
--- 
a/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
+++ 
b/server/protocols/jmap-integration-testing/rabbitmq-jmap-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQDeletedMessagesVaultTest.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import org.apache.james.CassandraRabbitMQSwiftJmapTestRule;
 import org.apache.james.DockerCassandraRule;
 import org.apache.james.GuiceJamesServer;
+import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.jmap.methods.integration.DeletedMessagesVaultTest;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.mailbox.PreDeletionHookConfiguration;
@@ -42,14 +43,15 @@ public class RabbitMQDeletedMessagesVaultTest extends 
DeletedMessagesVaultTest {
     public CassandraRabbitMQSwiftJmapTestRule rule = 
CassandraRabbitMQSwiftJmapTestRule.defaultTestRule();
 
     @Override
-    protected GuiceJamesServer createJmapServer() throws IOException {
+    protected GuiceJamesServer createJmapServer(FileSystem fileSystem) throws 
IOException {
         return rule.jmapServer(cassandra.getModule(),
             binder -> binder.bind(PreDeletionHooksConfiguration.class)
                 .toInstance(PreDeletionHooksConfiguration.forHooks(
                     
PreDeletionHookConfiguration.forClass(DeletedMessageVaultHook.class))),
             binder -> 
binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION),
             binder -> 
binder.bind(MailRepositoryDeletedMessageVault.Configuration.class)
-                .toInstance(new 
MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("cassandra://var/deletedMessages/user"))));
+                .toInstance(new 
MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("cassandra://var/deletedMessages/user"))),
+            binder -> binder.bind(FileSystem.class).toInstance(fileSystem));
     }
 
     @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to