You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rc...@apache.org on 2020/03/04 08:03:51 UTC

[james-project] 05/09: JAMES-2897 Avoid an interface joining together the two mailboxDAO

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

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

commit 9832ab8bf39784918389c886cf645143b89c8837
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Mar 2 10:53:31 2020 +0700

    JAMES-2897 Avoid an interface joining together the two mailboxDAO
    
    The older one is not supposed to be written to.
---
 .../mail/CassandraMailboxPathDAOImpl.java          |   8 +-
 .../cassandra/mail/CassandraMailboxPathV2DAO.java  |   8 +-
 .../mail/CassandraMailboxPathDAOImplTest.java      | 110 +++++++++++++++---
 .../mail/CassandraMailboxPathDAOTest.java          | 128 ---------------------
 .../mail/CassandraMailboxPathV2DAOTest.java        |  95 ++++++++++++++-
 .../mailbox/cassandra/mail/MailboxFixture.java}    |  28 ++---
 6 files changed, 199 insertions(+), 178 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java
index d9ba8a4..b795777 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImpl.java
@@ -54,7 +54,7 @@ import com.google.common.annotations.VisibleForTesting;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
-public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
+public class CassandraMailboxPathDAOImpl {
 
     private static final int FIRST_CELL = 0;
 
@@ -135,7 +135,6 @@ public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
             .switchIfEmpty(ReactorUtils.executeAndEmpty(() -> logGhostMailboxFailure(mailboxPath)));
     }
 
-    @Override
     public Flux<CassandraIdAndPath> listUserMailboxes(String namespace, Username user) {
         return cassandraAsyncExecutor.execute(
             selectAllForUser.bind()
@@ -151,12 +150,10 @@ public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
      * A missed read on an existing mailbox is the cause of the ghost mailbox bug. Here we log missing reads. Successful
      * reads and write operations are also added in order to allow audit in order to know if the mailbox existed.
      */
-    @Override
     public void logGhostMailboxSuccess(CassandraIdAndPath value) {
         logReadSuccess(value);
     }
 
-    @Override
     public void logGhostMailboxFailure(MailboxPath mailboxPath) {
         GhostMailbox.logger()
                 .addField(GhostMailbox.MAILBOX_NAME, mailboxPath)
@@ -187,7 +184,7 @@ public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
                 row.getString(MAILBOX_NAME)));
     }
 
-    @Override
+    @VisibleForTesting
     public Mono<Boolean> save(MailboxPath mailboxPath, CassandraId mailboxId) {
         return cassandraAsyncExecutor.executeReturnApplied(insert.bind()
             .setUDTValue(NAMESPACE_AND_USER, mailboxBaseTupleUtil.createMailboxBaseUDT(mailboxPath.getNamespace(), mailboxPath.getUser()))
@@ -195,7 +192,6 @@ public class CassandraMailboxPathDAOImpl implements CassandraMailboxPathDAO {
             .setUUID(MAILBOX_ID, mailboxId.asUuid()));
     }
 
-    @Override
     public Mono<Void> delete(MailboxPath mailboxPath) {
         return cassandraAsyncExecutor.executeVoid(delete.bind()
             .setUDTValue(NAMESPACE_AND_USER, mailboxBaseTupleUtil.createMailboxBaseUDT(mailboxPath.getNamespace(), mailboxPath.getUser()))
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java
index 7324431..f105013 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAO.java
@@ -51,7 +51,7 @@ import com.datastax.driver.core.querybuilder.QueryBuilder;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
-public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
+public class CassandraMailboxPathV2DAO {
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final CassandraUtils cassandraUtils;
     private final PreparedStatement delete;
@@ -109,7 +109,6 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
             .from(TABLE_NAME));
     }
 
-    @Override
     public Mono<CassandraIdAndPath> retrieveId(MailboxPath mailboxPath) {
         return cassandraAsyncExecutor.executeSingleRow(
             select.bind()
@@ -122,7 +121,6 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
             .switchIfEmpty(ReactorUtils.executeAndEmpty(() -> logGhostMailboxFailure(mailboxPath)));
     }
 
-    @Override
     public Flux<CassandraIdAndPath> listUserMailboxes(String namespace, Username user) {
         return cassandraAsyncExecutor.execute(
             selectUser.bind()
@@ -148,12 +146,10 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
      * A missed read on an existing mailbox is the cause of the ghost mailbox bug. Here we log missing reads. Successful
      * reads and write operations are also added in order to allow audit in order to know if the mailbox existed.
      */
-    @Override
     public void logGhostMailboxSuccess(CassandraIdAndPath value) {
         logReadSuccess(value);
     }
 
-    @Override
     public void logGhostMailboxFailure(MailboxPath mailboxPath) {
         GhostMailbox.logger()
                 .addField(GhostMailbox.MAILBOX_NAME, mailboxPath)
@@ -183,7 +179,6 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
                 row.getString(MAILBOX_NAME)));
     }
 
-    @Override
     public Mono<Boolean> save(MailboxPath mailboxPath, CassandraId mailboxId) {
         return cassandraAsyncExecutor.executeReturnApplied(insert.bind()
             .setString(NAMESPACE, mailboxPath.getNamespace())
@@ -192,7 +187,6 @@ public class CassandraMailboxPathV2DAO implements CassandraMailboxPathDAO {
             .setUUID(MAILBOX_ID, mailboxId.asUuid()));
     }
 
-    @Override
     public Mono<Void> delete(MailboxPath mailboxPath) {
         return cassandraAsyncExecutor.executeVoid(delete.bind()
             .setString(NAMESPACE, mailboxPath.getNamespace())
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
index c310d71..0926921 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOImplTest.java
@@ -19,35 +19,117 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.INBOX_ID;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.INBOX_ID_AND_PATH;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.OTHER_USER_MAILBOXPATH;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.OUTBOX_ID;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.USER_INBOX_MAILBOXPATH;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.USER_OUTBOX_MAILBOXPATH;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.otherMailboxId;
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.List;
+
 import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+class CassandraMailboxPathDAOImplTest {
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
+        CassandraMailboxModule.MODULE, CassandraSchemaVersionModule.MODULE));
 
-class CassandraMailboxPathDAOImplTest extends CassandraMailboxPathDAOTest<CassandraMailboxPathDAOImpl> {
+    CassandraMailboxPathDAOImpl testee;
 
-    @Override
-    CassandraMailboxPathDAOImpl testee(CassandraCluster cassandra) {
-        return new CassandraMailboxPathDAOImpl(cassandra.getConf(), cassandra.getTypesProvider());
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
+        testee = new CassandraMailboxPathDAOImpl(cassandra.getConf(), cassandra.getTypesProvider());
     }
 
     @Test
-    void countAllShouldReturnEntryCount() {
+    void cassandraIdAndPathShouldRespectBeanContract() {
+        EqualsVerifier.forClass(CassandraIdAndPath.class).verify();
+    }
+
+    @Test
+    void saveShouldInsertNewEntry() {
+        assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block()).isTrue();
+
+        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
+            .contains(INBOX_ID_AND_PATH);
+    }
+
+    @Test
+    void saveOnSecondShouldBeFalse() {
+        assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block()).isTrue();
+        assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block()).isFalse();
+    }
+
+    @Test
+    void retrieveIdShouldReturnEmptyWhenEmptyData() {
+        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
+            .isEmpty();
+    }
+
+    @Test
+    void retrieveIdShouldReturnStoredData() {
+        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
+
+        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
+            .contains(INBOX_ID_AND_PATH);
+    }
+
+    @Test
+    void getUserMailboxesShouldReturnAllMailboxesOfUser() {
         testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
         testee.save(USER_OUTBOX_MAILBOXPATH, OUTBOX_ID).block();
         testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).block();
 
-        CassandraMailboxPathDAOImpl daoV1 = (CassandraMailboxPathDAOImpl) testee;
+        List<CassandraIdAndPath> cassandraIds = testee
+            .listUserMailboxes(USER_INBOX_MAILBOXPATH.getNamespace(), USER_INBOX_MAILBOXPATH.getUser())
+            .collectList()
+            .block();
+
+        assertThat(cassandraIds)
+            .hasSize(2)
+            .containsOnly(INBOX_ID_AND_PATH, new CassandraIdAndPath(OUTBOX_ID, USER_OUTBOX_MAILBOXPATH));
+    }
+
+    @Test
+    void deleteShouldNotThrowWhenEmpty() {
+        testee.delete(USER_INBOX_MAILBOXPATH).block();
+    }
+
+    @Test
+    void deleteShouldDeleteTheExistingMailboxId() {
+        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
+
+        testee.delete(USER_INBOX_MAILBOXPATH).block();
+
+        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
+            .isEmpty();
+    }
 
-        assertThat(daoV1.countAll().block())
+    @Test
+    void countAllShouldReturnEntryCount() {
+        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
+        testee.save(USER_OUTBOX_MAILBOXPATH, OUTBOX_ID).block();
+        testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).block();
+
+        assertThat(testee.countAll().block())
             .isEqualTo(3);
     }
 
     @Test
     void countAllShouldReturnZeroByDefault() {
-        CassandraMailboxPathDAOImpl daoV1 = (CassandraMailboxPathDAOImpl) testee;
-
-        assertThat(daoV1.countAll().block())
+        assertThat(testee.countAll().block())
             .isEqualTo(0);
     }
 
@@ -57,9 +139,7 @@ class CassandraMailboxPathDAOImplTest extends CassandraMailboxPathDAOTest<Cassan
         testee.save(USER_OUTBOX_MAILBOXPATH, OUTBOX_ID).block();
         testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).block();
 
-        CassandraMailboxPathDAOImpl daoV1 = (CassandraMailboxPathDAOImpl) testee;
-
-        assertThat(daoV1.readAll().toIterable())
+        assertThat(testee.readAll().toIterable())
             .containsOnly(
                 new CassandraIdAndPath(INBOX_ID, USER_INBOX_MAILBOXPATH),
                 new CassandraIdAndPath(OUTBOX_ID, USER_OUTBOX_MAILBOXPATH),
@@ -68,9 +148,7 @@ class CassandraMailboxPathDAOImplTest extends CassandraMailboxPathDAOTest<Cassan
 
     @Test
     void readAllShouldReturnEmptyByDefault() {
-        CassandraMailboxPathDAOImpl daoV1 = (CassandraMailboxPathDAOImpl) testee;
-
-        assertThat(daoV1.readAll().toIterable())
+        assertThat(testee.readAll().toIterable())
             .isEmpty();
     }
 }
\ No newline at end of file
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
deleted file mode 100644
index fc00da1..0000000
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- * http://www.apache.org/licenses/LICENSE-2.0                   *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.cassandra.mail;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
-import org.apache.james.core.Username;
-import org.apache.james.mailbox.cassandra.ids.CassandraId;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
-import org.apache.james.mailbox.model.MailboxPath;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-
-import nl.jqno.equalsverifier.EqualsVerifier;
-
-public abstract class CassandraMailboxPathDAOTest<T extends CassandraMailboxPathDAO> {
-    private static final Username USER = Username.of("user");
-    private static final Username OTHER_USER = Username.of("other");
-
-    static final CassandraId INBOX_ID = CassandraId.timeBased();
-    static final CassandraId OUTBOX_ID = CassandraId.timeBased();
-    static final CassandraId otherMailboxId = CassandraId.timeBased();
-    static final MailboxPath USER_INBOX_MAILBOXPATH = MailboxPath.forUser(USER, "INBOX");
-    static final MailboxPath USER_OUTBOX_MAILBOXPATH = MailboxPath.forUser(USER, "OUTBOX");
-    static final MailboxPath OTHER_USER_MAILBOXPATH = MailboxPath.forUser(OTHER_USER, "INBOX");
-    static final CassandraIdAndPath INBOX_ID_AND_PATH = new CassandraIdAndPath(INBOX_ID, USER_INBOX_MAILBOXPATH);
-
-    @RegisterExtension
-    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
-        CassandraMailboxModule.MODULE, CassandraSchemaVersionModule.MODULE));
-
-    protected T testee;
-
-    abstract T testee(CassandraCluster cassandra);
-
-    @BeforeEach
-    void setUp(CassandraCluster cassandra) {
-        testee = testee(cassandra);
-    }
-
-    @Test
-    void cassandraIdAndPathShouldRespectBeanContract() {
-        EqualsVerifier.forClass(CassandraIdAndPath.class).verify();
-    }
-
-    @Test
-    void saveShouldInsertNewEntry() {
-        assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block()).isTrue();
-
-        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
-            .contains(INBOX_ID_AND_PATH);
-    }
-
-    @Test
-    void saveOnSecondShouldBeFalse() {
-        assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block()).isTrue();
-        assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block()).isFalse();
-    }
-
-    @Test
-    void retrieveIdShouldReturnEmptyWhenEmptyData() {
-        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
-            .isEmpty();
-    }
-
-    @Test
-    void retrieveIdShouldReturnStoredData() {
-        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
-
-        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
-            .contains(INBOX_ID_AND_PATH);
-    }
-
-    @Test
-    void getUserMailboxesShouldReturnAllMailboxesOfUser() {
-        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
-        testee.save(USER_OUTBOX_MAILBOXPATH, OUTBOX_ID).block();
-        testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).block();
-
-        List<CassandraIdAndPath> cassandraIds = testee
-            .listUserMailboxes(USER_INBOX_MAILBOXPATH.getNamespace(), USER_INBOX_MAILBOXPATH.getUser())
-            .collectList()
-            .block();
-
-        assertThat(cassandraIds)
-            .hasSize(2)
-            .containsOnly(INBOX_ID_AND_PATH, new CassandraIdAndPath(OUTBOX_ID, USER_OUTBOX_MAILBOXPATH));
-    }
-
-    @Test
-    void deleteShouldNotThrowWhenEmpty() {
-        testee.delete(USER_INBOX_MAILBOXPATH).block();
-    }
-
-    @Test
-    void deleteShouldDeleteTheExistingMailboxId() {
-        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
-
-        testee.delete(USER_INBOX_MAILBOXPATH).block();
-
-        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
-            .isEmpty();
-    }
-}
\ No newline at end of file
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
index 4e6e40f..2cb04d3 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
@@ -19,16 +19,103 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.INBOX_ID;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.INBOX_ID_AND_PATH;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.OTHER_USER_MAILBOXPATH;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.OUTBOX_ID;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.USER_INBOX_MAILBOXPATH;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.USER_OUTBOX_MAILBOXPATH;
+import static org.apache.james.mailbox.cassandra.mail.MailboxFixture.otherMailboxId;
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.List;
+
 import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
+import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+class CassandraMailboxPathV2DAOTest {
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
+        CassandraMailboxModule.MODULE, CassandraSchemaVersionModule.MODULE));
+
+    CassandraMailboxPathV2DAO testee;
+
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
+        testee = new CassandraMailboxPathV2DAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
+    }
+
+    @Test
+    void cassandraIdAndPathShouldRespectBeanContract() {
+        EqualsVerifier.forClass(CassandraIdAndPath.class).verify();
+    }
+
+    @Test
+    void saveShouldInsertNewEntry() {
+        assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block()).isTrue();
+
+        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
+            .contains(INBOX_ID_AND_PATH);
+    }
+
+    @Test
+    void saveOnSecondShouldBeFalse() {
+        assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block()).isTrue();
+        assertThat(testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block()).isFalse();
+    }
+
+    @Test
+    void retrieveIdShouldReturnEmptyWhenEmptyData() {
+        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
+            .isEmpty();
+    }
+
+    @Test
+    void retrieveIdShouldReturnStoredData() {
+        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
+
+        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
+            .contains(INBOX_ID_AND_PATH);
+    }
+
+    @Test
+    void getUserMailboxesShouldReturnAllMailboxesOfUser() {
+        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
+        testee.save(USER_OUTBOX_MAILBOXPATH, OUTBOX_ID).block();
+        testee.save(OTHER_USER_MAILBOXPATH, otherMailboxId).block();
+
+        List<CassandraIdAndPath> cassandraIds = testee
+            .listUserMailboxes(USER_INBOX_MAILBOXPATH.getNamespace(), USER_INBOX_MAILBOXPATH.getUser())
+            .collectList()
+            .block();
+
+        assertThat(cassandraIds)
+            .hasSize(2)
+            .containsOnly(INBOX_ID_AND_PATH, new CassandraIdAndPath(OUTBOX_ID, USER_OUTBOX_MAILBOXPATH));
+    }
 
-class CassandraMailboxPathV2DAOTest extends CassandraMailboxPathDAOTest<CassandraMailboxPathV2DAO> {
-    @Override
-    CassandraMailboxPathV2DAO testee(CassandraCluster cassandra) {
-        return new CassandraMailboxPathV2DAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
+    @Test
+    void deleteShouldNotThrowWhenEmpty() {
+        testee.delete(USER_INBOX_MAILBOXPATH).block();
+    }
+
+    @Test
+    void deleteShouldDeleteTheExistingMailboxId() {
+        testee.save(USER_INBOX_MAILBOXPATH, INBOX_ID).block();
+
+        testee.delete(USER_INBOX_MAILBOXPATH).block();
+
+        assertThat(testee.retrieveId(USER_INBOX_MAILBOXPATH).blockOptional())
+            .isEmpty();
     }
 
     @Test
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAO.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxFixture.java
similarity index 68%
rename from mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAO.java
rename to mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxFixture.java
index 72e7d78..b9f29e8 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAO.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MailboxFixture.java
@@ -23,21 +23,15 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.model.MailboxPath;
 
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.Mono;
-
-public interface CassandraMailboxPathDAO {
-
-    Mono<CassandraIdAndPath> retrieveId(MailboxPath mailboxPath);
-
-    Flux<CassandraIdAndPath> listUserMailboxes(String namespace, Username user);
-
-    void logGhostMailboxSuccess(CassandraIdAndPath value);
-
-    void logGhostMailboxFailure(MailboxPath mailboxPath);
-
-    Mono<Boolean> save(MailboxPath mailboxPath, CassandraId mailboxId);
-
-    Mono<Void> delete(MailboxPath mailboxPath);
-
+public interface MailboxFixture {
+    Username USER = Username.of("user");
+    Username OTHER_USER = Username.of("other");
+
+    CassandraId INBOX_ID = CassandraId.timeBased();
+    CassandraId OUTBOX_ID = CassandraId.timeBased();
+    CassandraId otherMailboxId = CassandraId.timeBased();
+    MailboxPath USER_INBOX_MAILBOXPATH = MailboxPath.forUser(USER, "INBOX");
+    MailboxPath USER_OUTBOX_MAILBOXPATH = MailboxPath.forUser(USER, "OUTBOX");
+    MailboxPath OTHER_USER_MAILBOXPATH = MailboxPath.forUser(OTHER_USER, "INBOX");
+    CassandraIdAndPath INBOX_ID_AND_PATH = new CassandraIdAndPath(INBOX_ID, USER_INBOX_MAILBOXPATH);
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org