This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit e9e38a5ef2c1e1a9c3193d570db9fb8c78b6d8c9 Author: Tran Tien Duc <[email protected]> AuthorDate: Fri Feb 14 10:20:49 2020 +0700 JAMES-3056 Distinct on StoreMailboxManager.list() --- .../CassandraMailboxManagerConsistencyTest.java | 115 +++++++++++++++++++-- .../james/mailbox/store/StoreMailboxManager.java | 1 + 2 files changed, 110 insertions(+), 6 deletions(-) diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java index 2278c2a..5ec2154 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerConsistencyTest.java @@ -103,7 +103,7 @@ class CassandraMailboxManagerConsistencyTest { } @Nested - class FailsOnCreate { + class FailuresDuringCreation { @Test void createMailboxShouldBeConsistentWhenMailboxDaoFails() { @@ -137,7 +137,7 @@ class CassandraMailboxManagerConsistencyTest { })); } - @Disabled("JAMES-3056 createMailbox() return an empty Optional") + @Disabled("JAMES-3056 createMailbox() doesn't return mailboxId while it's supposed to") @Test void createMailboxAfterAFailedCreationShouldCreateTheMailboxWhenMailboxDaoFails() throws Exception { doReturn(Mono.error(new RuntimeException("mock exception"))) @@ -174,7 +174,7 @@ class CassandraMailboxManagerConsistencyTest { })); } - @Disabled("JAMES-3056 createMailbox() return an empty Optional") + @Disabled("JAMES-3056 createMailbox() doesn't return mailboxId while it's supposed to") @Test void createMailboxAfterDeletingShouldCreateTheMailboxWhenMailboxDaoFails() throws Exception { doReturn(Mono.error(new RuntimeException("mock exception"))) @@ -215,7 +215,7 @@ class CassandraMailboxManagerConsistencyTest { } @Nested - class FailsOnRename { + class FailuresDuringRenaming { @Test void renameShouldBeConsistentWhenMailboxDaoFails() throws Exception { @@ -367,7 +367,7 @@ class CassandraMailboxManagerConsistencyTest { } @Nested - class FailsOnDelete { + class FailuresOnDeletion { @Nested class DeleteOnce { @@ -463,6 +463,110 @@ class CassandraMailboxManagerConsistencyTest { } @Nested + class DeleteOnceThenCreate { + + @Test + void createMailboxShouldCreateWhenMailboxDaoFailsOnDeleteByPath() throws Exception { + testee.createMailbox(inboxPath, mailboxSession); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxDAO) + .delete(any(CassandraId.class)); + + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + + @Test + void createMailboxShouldCreateWhenMailboxDaoFailsOnDeleteById() throws Exception { + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxDAO) + .delete(any(CassandraId.class)); + + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + MailboxId inboxNewId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxNewId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + + @Disabled("JAMES-3056 cannot create because mailbox already exists") + @Test + void createMailboxShouldCreateWhenMailboxPathDaoFailsOnDeleteByPath() throws Exception { + testee.createMailbox(inboxPath, mailboxSession); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxPathV2DAO) + .delete(inboxPath); + + doQuietly(() -> testee.deleteMailbox(inboxPath, mailboxSession)); + MailboxId inboxNewId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxNewId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + + @Disabled("JAMES-3056 cannot create because mailbox already exists") + @Test + void createMailboxShouldCreateWhenMailboxPathDaoFailsOnDeleteById() throws Exception { + MailboxId inboxId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + doReturn(Mono.error(new RuntimeException("mock exception"))) + .doCallRealMethod() + .when(mailboxPathV2DAO) + .delete(inboxPath); + + doQuietly(() -> testee.deleteMailbox(inboxId, mailboxSession)); + MailboxId inboxNewId = testee.createMailbox(inboxPath, mailboxSession) + .get(); + + SoftAssertions.assertSoftly(Throwing.consumer(softly -> { + softly.assertThat(testee.search(allMailboxesSearchQuery, mailboxSession)) + .hasOnlyOneElementSatisfying(mailboxMetaData -> { + softly.assertThat(mailboxMetaData.getId()).isEqualTo(inboxNewId); + softly.assertThat(mailboxMetaData.getPath()).isEqualTo(inboxPath); + }); + softly.assertThat(testee.list(mailboxSession)) + .containsExactly(inboxPath); + })); + } + } + + @Nested class DeleteTwice { @Disabled("JAMES-3056 list() returns one element with inboxPath") @@ -552,7 +656,6 @@ class CassandraMailboxManagerConsistencyTest { @Nested class DeleteTwiceThenCreate { - @Disabled("JAMES-3056 list() returns two element with inboxPath being duplicated") @Test void createMailboxShouldCreateWhenMailboxDaoFailsOnDeleteByPath() throws Exception { testee.createMailbox(inboxPath, mailboxSession); diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java index f023f5f..31f7f7b 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java @@ -742,6 +742,7 @@ public class StoreMailboxManager implements MailboxManager { .list() .stream() .map(Mailbox::generateAssociatedPath) + .distinct() .collect(Guavate.toImmutableList()); } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
