You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2021/01/14 03:26:13 UTC

[james-project] 08/11: JAMES-3470 EmailChangeRepositoryContract should stop relying on TestMessageId

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 4c16e1ff84299fefea9ffe58bcea54ff2e7f0029
Author: LanKhuat <dl...@linagora.com>
AuthorDate: Mon Jan 11 11:39:37 2021 +0700

    JAMES-3470 EmailChangeRepositoryContract should stop relying on TestMessageId
---
 .../mailbox/cassandra/ids/CassandraMessageId.java  |   2 +-
 .../change/CassandraEmailChangeRepositoryTest.java |  13 +
 .../api/change/EmailChangeRepositoryContract.java  | 699 +++++++++++++--------
 .../change/MemoryEmailChangeRepositoryTest.java    |  16 +-
 4 files changed, 462 insertions(+), 268 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/ids/CassandraMessageId.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/ids/CassandraMessageId.java
index cf7cb63..12be3fd 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/ids/CassandraMessageId.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/ids/CassandraMessageId.java
@@ -36,7 +36,7 @@ public class CassandraMessageId implements MessageId {
             return of(UUIDs.timeBased());
         }
 
-        public CassandraMessageId of(UUID uuid) {
+        public static CassandraMessageId of(UUID uuid) {
             return new CassandraMessageId(uuid);
         }
 
diff --git a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/change/CassandraEmailChangeRepositoryTest.java b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/change/CassandraEmailChangeRepositoryTest.java
index 50af3ff..8094155 100644
--- a/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/change/CassandraEmailChangeRepositoryTest.java
+++ b/server/data/data-jmap-cassandra/src/test/java/org/apache/james/jmap/cassandra/change/CassandraEmailChangeRepositoryTest.java
@@ -26,6 +26,9 @@ import org.apache.james.backends.cassandra.init.CassandraZonedDateTimeModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.jmap.api.change.EmailChangeRepository;
 import org.apache.james.jmap.api.change.EmailChangeRepositoryContract;
+import org.apache.james.jmap.api.change.State;
+import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
+import org.apache.james.mailbox.model.MessageId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -50,4 +53,14 @@ public class CassandraEmailChangeRepositoryTest implements EmailChangeRepository
     public EmailChangeRepository emailChangeRepository() {
         return emailChangeRepository;
     }
+
+    @Override
+    public State generateNewState() {
+        return new CassandraStateFactory().generate();
+    }
+
+    @Override
+    public MessageId generateNewMessageId() {
+        return new CassandraMessageId.Factory().generate();
+    }
 }
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/EmailChangeRepositoryContract.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/EmailChangeRepositoryContract.java
index fc0ac24..bf0ca99 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/EmailChangeRepositoryContract.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/api/change/EmailChangeRepositoryContract.java
@@ -26,20 +26,20 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.time.ZonedDateTime;
 import java.util.Optional;
-import java.util.UUID;
 
 import org.apache.james.jmap.api.exception.ChangeNotFoundException;
 import org.apache.james.jmap.api.model.AccountId;
-import org.apache.james.mailbox.model.TestMessageId;
+import org.apache.james.mailbox.model.MessageId;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.Test;
 
 public interface EmailChangeRepositoryContract {
     AccountId ACCOUNT_ID = AccountId.fromUsername(BOB);
     ZonedDateTime DATE = ZonedDateTime.now();
-    State STATE_0 = State.of(UUID.randomUUID());
 
     EmailChangeRepository emailChangeRepository();
+    MessageId generateNewMessageId();
+    State generateNewState();
 
     @Test
     default void saveChangeShouldSuccess() {
@@ -47,10 +47,10 @@ public interface EmailChangeRepositoryContract {
 
         EmailChange change = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
 
         assertThatCode(() -> repository.save(change).block())
@@ -69,26 +69,30 @@ public interface EmailChangeRepositoryContract {
     default void getLatestStateShouldReturnLastPersistedState() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2))
+            .created(messageId1)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(3))
+            .created(messageId2)
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(4))
+            .created(messageId3)
             .build();
         repository.save(change1).block();
         repository.save(change2).block();
@@ -102,26 +106,30 @@ public interface EmailChangeRepositoryContract {
     default void getLatestStateShouldReturnLastNonDelegatedPersistedState() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2))
+            .created(messageId1)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(3))
+            .created(messageId2)
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(true)
-            .created(TestMessageId.of(4))
+            .created(messageId3)
             .build();
         repository.save(change1).block();
         repository.save(change2).block();
@@ -135,41 +143,45 @@ public interface EmailChangeRepositoryContract {
     default void getChangesShouldSuccess() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        MessageId messageId = generateNewMessageId();
+        State state = generateNewState();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId)
             .build();
         EmailChange change = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .updated(TestMessageId.of(1))
+            .updated(messageId)
             .build();
         repository.save(oldState).block();
         repository.save(change).block();
 
-        assertThat(repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.empty()).block().getAllChanges())
+        assertThat(repository.getSinceState(ACCOUNT_ID, state, Optional.empty()).block().getAllChanges())
             .hasSameElementsAs(change.getUpdated());
     }
 
     @Test
     default void getChangesShouldReturnEmptyWhenNoNewerState() {
         EmailChangeRepository repository = emailChangeRepository();
+        State state = generateNewState();
 
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
         repository.save(oldState).block();
 
-        assertThat(repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.empty()).block().getAllChanges())
+        assertThat(repository.getSinceState(ACCOUNT_ID, state, Optional.empty()).block().getAllChanges())
             .isEmpty();
     }
 
@@ -177,16 +189,18 @@ public interface EmailChangeRepositoryContract {
     default void getChangesShouldReturnCurrentStateWhenNoNewerState() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
         repository.save(oldState).block();
 
-        assertThat(repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.empty()).block().getNewState())
+        assertThat(repository.getSinceState(ACCOUNT_ID, state, Optional.empty()).block().getNewState())
             .isEqualTo(oldState.getState());
     }
 
@@ -194,40 +208,47 @@ public interface EmailChangeRepositoryContract {
     default void getChangesShouldLimitChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+        MessageId messageId5 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(3))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2))
+            .created(messageId2)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(3))
+            .created(messageId3)
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(4))
+            .created(messageId4)
             .build();
         EmailChange change4 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.plusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(5))
+            .created(messageId5)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
@@ -235,41 +256,47 @@ public interface EmailChangeRepositoryContract {
         repository.save(change3).block();
         repository.save(change4).block();
 
-        assertThat(repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(3))).block().getCreated())
-            .containsExactlyInAnyOrder(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(4));
+        assertThat(repository.getSinceState(ACCOUNT_ID, state, Optional.of(Limit.of(3))).block().getCreated())
+            .containsExactlyInAnyOrder(messageId2, messageId3, messageId4);
     }
 
     @Test
     default void getChangesShouldReturnAllFromInitial() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(3))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2))
+            .created(messageId2)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(3))
+            .created(messageId3)
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(4))
+            .created(messageId4)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
@@ -277,83 +304,102 @@ public interface EmailChangeRepositoryContract {
         repository.save(change3).block();
 
         assertThat(repository.getSinceState(ACCOUNT_ID, State.INITIAL, Optional.of(Limit.of(3))).block().getCreated())
-            .containsExactlyInAnyOrder(TestMessageId.of(1), TestMessageId.of(2), TestMessageId.of(3));
+            .containsExactlyInAnyOrder(messageId1, messageId2, messageId3);
     }
 
     @Test
     default void getChangesFromInitialShouldReturnNewState() {
         EmailChangeRepository repository = emailChangeRepository();
-        State state2 = State.of(UUID.randomUUID());
 
-        EmailChange oldState = EmailChange.builder()
+        State state = generateNewState();
+        State state2 = generateNewState();
+        State state3 = generateNewState();
+        State state4 = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+
+        EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(3))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
-        EmailChange change1 = EmailChange.builder()
+        EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(state2)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2))
+            .created(messageId2)
             .build();
-        EmailChange change2 = EmailChange.builder()
+        EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(state2)
+            .state(state3)
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(3))
+            .created(messageId3)
             .build();
-        EmailChange change3 = EmailChange.builder()
+        EmailChange change4 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(state4)
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(4))
+            .created(messageId4)
             .build();
 
-        repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
         repository.save(change3).block();
+        repository.save(change4).block();
 
         assertThat(repository.getSinceState(ACCOUNT_ID, State.INITIAL, Optional.of(Limit.of(3))).block().getNewState())
-            .isEqualTo(state2);
+            .isEqualTo(state3);
     }
 
     @Test
     default void getChangesShouldLimitChangesWhenMaxChangesOmitted() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+        MessageId messageId5 = generateNewMessageId();
+        MessageId messageId6 = generateNewMessageId();
+        MessageId messageId7 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(4), TestMessageId.of(5), TestMessageId.of(6))
+            .created(messageId2, messageId3, messageId4, messageId5, messageId6)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(7))
+            .created(messageId7)
             .build();
 
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        assertThat(repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.empty()).block().getAllChanges())
+        assertThat(repository.getSinceState(ACCOUNT_ID, state, Optional.empty()).block().getAllChanges())
             .hasSameElementsAs(change1.getCreated());
     }
 
@@ -361,32 +407,40 @@ public interface EmailChangeRepositoryContract {
     default void getChangesShouldNotReturnMoreThanMaxChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+        MessageId messageId5 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3))
+            .created(messageId2, messageId3)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(4), TestMessageId.of(5))
+            .created(messageId4, messageId5)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        assertThat(repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(3))).block().getAllChanges())
+        assertThat(repository.getSinceState(ACCOUNT_ID, state, Optional.of(Limit.of(3))).block().getAllChanges())
             .hasSameElementsAs(change1.getCreated());
     }
 
@@ -394,31 +448,39 @@ public interface EmailChangeRepositoryContract {
     default void getChangesShouldReturnEmptyWhenNumberOfChangesExceedMaxChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+        MessageId messageId5 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3))
+            .created(messageId2, messageId3)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(4), TestMessageId.of(5))
+            .created(messageId4, messageId5)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
 
-        assertThat(repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(1))).block().getAllChanges())
+        assertThat(repository.getSinceState(ACCOUNT_ID, state, Optional.of(Limit.of(1))).block().getAllChanges())
             .isEmpty();
     }
 
@@ -426,32 +488,38 @@ public interface EmailChangeRepositoryContract {
     default void getChangesShouldReturnNewState() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3))
+            .created(messageId2, messageId3)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .updated(TestMessageId.of(2), TestMessageId.of(3))
+            .updated(messageId2, messageId3)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        assertThat(repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.empty()).block().getNewState())
+        assertThat(repository.getSinceState(ACCOUNT_ID, state, Optional.empty()).block().getNewState())
             .isEqualTo(change2.getState());
     }
 
@@ -459,32 +527,38 @@ public interface EmailChangeRepositoryContract {
     default void hasMoreChangesShouldBeTrueWhenMoreChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3))
+            .created(messageId2, messageId3)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .updated(TestMessageId.of(2), TestMessageId.of(3))
+            .updated(messageId2, messageId3)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        assertThat(repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(1))).block().hasMoreChanges())
+        assertThat(repository.getSinceState(ACCOUNT_ID, state, Optional.of(Limit.of(1))).block().hasMoreChanges())
             .isTrue();
     }
 
@@ -492,32 +566,38 @@ public interface EmailChangeRepositoryContract {
     default void hasMoreChangesShouldBeFalseWhenNoMoreChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3))
+            .created(messageId2, messageId3)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .updated(TestMessageId.of(2), TestMessageId.of(3))
+            .updated(messageId2, messageId3)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        assertThat(repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(4))).block().hasMoreChanges())
+        assertThat(repository.getSinceState(ACCOUNT_ID, state, Optional.of(Limit.of(4))).block().hasMoreChanges())
             .isFalse();
     }
 
@@ -525,50 +605,62 @@ public interface EmailChangeRepositoryContract {
     default void changesShouldBeStoredInTheirRespectiveType() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+        MessageId messageId5 = generateNewMessageId();
+        MessageId messageId6 = generateNewMessageId();
+        MessageId messageId7 = generateNewMessageId();
+        MessageId messageId8 = generateNewMessageId();
+        MessageId messageId9 = generateNewMessageId();
+        MessageId messageId10 = generateNewMessageId();
 
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(3))
             .isDelegated(false)
-            .created(TestMessageId.of(1), TestMessageId.of(9), TestMessageId.of(10))
+            .created(messageId1, messageId9, messageId10)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(4), TestMessageId.of(5))
+            .created(messageId2, messageId3, messageId4, messageId5)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(6), TestMessageId.of(7))
-            .updated(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(10))
-            .destroyed(TestMessageId.of(4), TestMessageId.of(9))
+            .created(messageId6, messageId7)
+            .updated(messageId2, messageId3, messageId10)
+            .destroyed(messageId4, messageId9)
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(8))
-            .updated(TestMessageId.of(6), TestMessageId.of(7), TestMessageId.of(1))
-            .destroyed(TestMessageId.of(5), TestMessageId.of(10))
+            .created(messageId8)
+            .updated(messageId6, messageId7, messageId1)
+            .destroyed(messageId5, messageId10)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
         repository.save(change3).block();
 
-        EmailChanges emailChanges = repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(20))).block();
+        EmailChanges emailChanges = repository.getSinceState(ACCOUNT_ID, state, Optional.of(Limit.of(20))).block();
 
         SoftAssertions.assertSoftly(softly -> {
-            softly.assertThat(emailChanges.getCreated()).containsExactlyInAnyOrder(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(6), TestMessageId.of(7), TestMessageId.of(8));
-            softly.assertThat(emailChanges.getUpdated()).containsExactlyInAnyOrder(TestMessageId.of(1));
-            softly.assertThat(emailChanges.getDestroyed()).containsExactlyInAnyOrder(TestMessageId.of(9), TestMessageId.of(10));
+            softly.assertThat(emailChanges.getCreated()).containsExactlyInAnyOrder(messageId2, messageId3, messageId6, messageId7, messageId8);
+            softly.assertThat(emailChanges.getUpdated()).containsExactlyInAnyOrder(messageId1);
+            softly.assertThat(emailChanges.getDestroyed()).containsExactlyInAnyOrder(messageId9, messageId10);
         });
     }
 
@@ -576,80 +668,96 @@ public interface EmailChangeRepositoryContract {
     default void changesShouldNotReturnDelegatedChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+        MessageId messageId5 = generateNewMessageId();
+        MessageId messageId6 = generateNewMessageId();
+        MessageId messageId7 = generateNewMessageId();
+        MessageId messageId8 = generateNewMessageId();
 
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(3))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(4), TestMessageId.of(5))
+            .created(messageId2, messageId3, messageId4, messageId5)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(true)
-            .created(TestMessageId.of(6), TestMessageId.of(7))
+            .created(messageId6, messageId7)
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(8))
+            .created(messageId8)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
         repository.save(change3).block();
 
-        EmailChanges emailChanges = repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(20))).block();
+        EmailChanges emailChanges = repository.getSinceState(ACCOUNT_ID, state, Optional.of(Limit.of(20))).block();
 
         assertThat(emailChanges.getCreated())
-            .containsExactlyInAnyOrder(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(4), TestMessageId.of(5), TestMessageId.of(8));
+            .containsExactlyInAnyOrder(messageId2, messageId3, messageId4, messageId5, messageId8);
     }
 
     @Test
     default void getChangesShouldIgnoreDuplicatedValues() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .updated(TestMessageId.of(1), TestMessageId.of(2))
+            .updated(messageId1, messageId2)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .updated(TestMessageId.of(1), TestMessageId.of(2))
-            .created(TestMessageId.of(3))
+            .updated(messageId1, messageId2)
+            .created(messageId3)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        EmailChanges emailChanges = repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(3))).block();
+        EmailChanges emailChanges = repository.getSinceState(ACCOUNT_ID, state, Optional.of(Limit.of(3))).block();
         SoftAssertions.assertSoftly(softly -> {
-            softly.assertThat(emailChanges.getUpdated()).containsExactly(TestMessageId.of(1), TestMessageId.of(2));
-            softly.assertThat(emailChanges.getCreated()).containsExactly(TestMessageId.of(3));
+            softly.assertThat(emailChanges.getUpdated()).containsExactly(messageId1, messageId2);
+            softly.assertThat(emailChanges.getCreated()).containsExactly(messageId3);
         });
     }
 
@@ -657,7 +765,7 @@ public interface EmailChangeRepositoryContract {
     default void getChangesShouldFailWhenSinceStateNotFound() {
         EmailChangeRepository repository = emailChangeRepository();
 
-        assertThatThrownBy(() -> repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.empty()).block())
+        assertThatThrownBy(() -> repository.getSinceState(ACCOUNT_ID, generateNewState(), Optional.empty()).block())
             .isInstanceOf(ChangeNotFoundException.class);
     }
 
@@ -675,24 +783,24 @@ public interface EmailChangeRepositoryContract {
 
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2))
+            .created(generateNewMessageId())
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(3))
+            .created(generateNewMessageId())
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(4))
+            .created(generateNewMessageId())
             .build();
         repository.save(change1).block();
         repository.save(change2).block();
@@ -708,24 +816,24 @@ public interface EmailChangeRepositoryContract {
 
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2))
+            .created(generateNewMessageId())
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(3))
+            .created(generateNewMessageId())
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(true)
-            .created(TestMessageId.of(4))
+            .created(generateNewMessageId())
             .build();
         repository.save(change1).block();
         repository.save(change2).block();
@@ -739,24 +847,26 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationShouldSuccess() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
         EmailChange change = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .updated(TestMessageId.of(1))
+            .updated(generateNewMessageId())
             .build();
         repository.save(oldState).block();
         repository.save(change).block();
 
-        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.empty()).block().getAllChanges())
+        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.empty()).block().getAllChanges())
             .hasSameElementsAs(change.getUpdated());
     }
 
@@ -764,16 +874,18 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationShouldReturnEmptyWhenNoNewerState() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
         repository.save(oldState).block();
 
-        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.empty()).block().getAllChanges())
+        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.empty()).block().getAllChanges())
             .isEmpty();
     }
 
@@ -781,16 +893,18 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationShouldReturnCurrentStateWhenNoNewerState() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
         repository.save(oldState).block();
 
-        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.empty()).block().getNewState())
+        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.empty()).block().getNewState())
             .isEqualTo(oldState.getState());
     }
 
@@ -798,40 +912,48 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationShouldLimitChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+        MessageId messageId5 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(3))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2))
+            .created(messageId2)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(3))
+            .created(messageId3)
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(4))
+            .created(messageId4)
             .build();
         EmailChange change4 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.plusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(5))
+            .created(messageId5)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
@@ -839,41 +961,46 @@ public interface EmailChangeRepositoryContract {
         repository.save(change3).block();
         repository.save(change4).block();
 
-        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(3))).block().getCreated())
-            .containsExactlyInAnyOrder(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(4));
+        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.of(Limit.of(3))).block().getCreated())
+            .containsExactlyInAnyOrder(messageId2, messageId3, messageId4);
     }
 
     @Test
     default void getSinceStateWithDelegationShouldReturnAllFromInitial() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(generateNewState())
             .date(DATE.minusHours(3))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2))
+            .created(messageId2)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(3))
+            .created(messageId3)
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(4))
+            .created(messageId4)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
@@ -881,40 +1008,42 @@ public interface EmailChangeRepositoryContract {
         repository.save(change3).block();
 
         assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, State.INITIAL, Optional.of(Limit.of(3))).block().getCreated())
-            .containsExactlyInAnyOrder(TestMessageId.of(1), TestMessageId.of(2), TestMessageId.of(3));
+            .containsExactlyInAnyOrder(messageId1, messageId2, messageId3);
     }
 
     @Test
     default void getSinceStateWithDelegationShouldLimitChangesWhenMaxChangesOmitted() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(4), TestMessageId.of(5), TestMessageId.of(6))
+            .created(generateNewMessageId(), generateNewMessageId(), generateNewMessageId(), generateNewMessageId(), generateNewMessageId())
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(7))
+            .created(generateNewMessageId())
             .build();
 
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.empty()).block().getAllChanges())
+        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.empty()).block().getAllChanges())
             .hasSameElementsAs(change1.getCreated());
     }
 
@@ -922,32 +1051,34 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationShouldNotReturnMoreThanMaxChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3))
+            .created(generateNewMessageId(), generateNewMessageId())
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(4), TestMessageId.of(5))
+            .created(generateNewMessageId(), generateNewMessageId())
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(3))).block().getAllChanges())
+        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.of(Limit.of(3))).block().getAllChanges())
             .hasSameElementsAs(change1.getCreated());
     }
 
@@ -955,31 +1086,33 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationShouldReturnEmptyWhenNumberOfChangesExceedMaxChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3))
+            .created(generateNewMessageId(), generateNewMessageId())
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(4), TestMessageId.of(5))
+            .created(generateNewMessageId(), generateNewMessageId())
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
 
-        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(1))).block().getAllChanges())
+        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.of(Limit.of(1))).block().getAllChanges())
             .isEmpty();
     }
 
@@ -987,32 +1120,34 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationShouldReturnNewState() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3))
+            .created(generateNewMessageId(), generateNewMessageId())
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .updated(TestMessageId.of(2), TestMessageId.of(3))
+            .updated(generateNewMessageId(), generateNewMessageId())
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.empty()).block().getNewState())
+        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.empty()).block().getNewState())
             .isEqualTo(change2.getState());
     }
 
@@ -1020,32 +1155,34 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationHasMoreChangesShouldBeTrueWhenMoreChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3))
+            .created(generateNewMessageId(), generateNewMessageId())
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .updated(TestMessageId.of(2), TestMessageId.of(3))
+            .updated(generateNewMessageId(), generateNewMessageId())
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(1))).block().hasMoreChanges())
+        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.of(Limit.of(1))).block().hasMoreChanges())
             .isTrue();
     }
 
@@ -1053,32 +1190,34 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationHasMoreChangesShouldBeFalseWhenNoMoreChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(generateNewMessageId())
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3))
+            .created(generateNewMessageId(), generateNewMessageId())
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .updated(TestMessageId.of(2), TestMessageId.of(3))
+            .updated(generateNewMessageId(), generateNewMessageId())
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(4))).block().hasMoreChanges())
+        assertThat(repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.of(Limit.of(4))).block().hasMoreChanges())
             .isFalse();
     }
 
@@ -1086,49 +1225,62 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationShouldReturnChangesInTheirRespectiveType() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+        MessageId messageId5 = generateNewMessageId();
+        MessageId messageId6 = generateNewMessageId();
+        MessageId messageId7 = generateNewMessageId();
+        MessageId messageId8 = generateNewMessageId();
+        MessageId messageId9 = generateNewMessageId();
+        MessageId messageId10 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(3))
             .isDelegated(false)
-            .created(TestMessageId.of(1), TestMessageId.of(9), TestMessageId.of(10))
+            .created(messageId1, messageId9, messageId10)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(4), TestMessageId.of(5))
+            .created(messageId2, messageId3, messageId4, messageId5)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .created(TestMessageId.of(6), TestMessageId.of(7))
-            .updated(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(10))
-            .destroyed(TestMessageId.of(4), TestMessageId.of(9))
+            .created(messageId6, messageId7)
+            .updated(messageId2, messageId3, messageId10)
+            .destroyed(messageId4, messageId9)
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(8))
-            .updated(TestMessageId.of(6), TestMessageId.of(7), TestMessageId.of(1))
-            .destroyed(TestMessageId.of(5), TestMessageId.of(10))
+            .created(messageId8)
+            .updated(messageId6, messageId7, messageId1)
+            .destroyed(messageId5, messageId10)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
         repository.save(change3).block();
 
-        EmailChanges emailChanges = repository.getSinceState(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(20))).block();
+        EmailChanges emailChanges = repository.getSinceState(ACCOUNT_ID, state, Optional.of(Limit.of(20))).block();
 
         SoftAssertions.assertSoftly(softly -> {
-            softly.assertThat(emailChanges.getCreated()).containsExactlyInAnyOrder(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(6), TestMessageId.of(7), TestMessageId.of(8));
-            softly.assertThat(emailChanges.getUpdated()).containsExactlyInAnyOrder(TestMessageId.of(1));
-            softly.assertThat(emailChanges.getDestroyed()).containsExactlyInAnyOrder(TestMessageId.of(9), TestMessageId.of(10));
+            softly.assertThat(emailChanges.getCreated()).containsExactlyInAnyOrder(messageId2, messageId3, messageId6, messageId7, messageId8);
+            softly.assertThat(emailChanges.getUpdated()).containsExactlyInAnyOrder(messageId1);
+            softly.assertThat(emailChanges.getDestroyed()).containsExactlyInAnyOrder(messageId9, messageId10);
         });
     }
 
@@ -1136,80 +1288,95 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationShouldReturnDelegatedChanges() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+        MessageId messageId4 = generateNewMessageId();
+        MessageId messageId5 = generateNewMessageId();
+        MessageId messageId6 = generateNewMessageId();
+        MessageId messageId7 = generateNewMessageId();
+        MessageId messageId8 = generateNewMessageId();
 
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(3))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(4), TestMessageId.of(5))
+            .created(messageId2, messageId3, messageId4, messageId5)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(true)
-            .created(TestMessageId.of(6), TestMessageId.of(7))
+            .created(messageId6, messageId7)
             .build();
         EmailChange change3 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .created(TestMessageId.of(8))
+            .created(messageId8)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
         repository.save(change3).block();
 
-        EmailChanges emailChanges = repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(20))).block();
+        EmailChanges emailChanges = repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.of(Limit.of(20))).block();
 
         assertThat(emailChanges.getCreated())
-            .containsExactlyInAnyOrder(TestMessageId.of(2), TestMessageId.of(3), TestMessageId.of(4), TestMessageId.of(5), TestMessageId.of(6), TestMessageId.of(7), TestMessageId.of(8));
+            .containsExactlyInAnyOrder(messageId2, messageId3, messageId4, messageId5, messageId6, messageId7, messageId8);
     }
 
     @Test
     default void getSinceStateWithDelegationShouldIgnoreDuplicatedValues() {
         EmailChangeRepository repository = emailChangeRepository();
 
+        State state = generateNewState();
+
+        MessageId messageId1 = generateNewMessageId();
+        MessageId messageId2 = generateNewMessageId();
+        MessageId messageId3 = generateNewMessageId();
+
         EmailChange oldState = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(STATE_0)
+            .state(state)
             .date(DATE.minusHours(2))
             .isDelegated(false)
-            .created(TestMessageId.of(1))
+            .created(messageId1)
             .build();
         EmailChange change1 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE.minusHours(1))
             .isDelegated(false)
-            .updated(TestMessageId.of(1), TestMessageId.of(2))
+            .updated(messageId1, messageId2)
             .build();
         EmailChange change2 = EmailChange.builder()
             .accountId(ACCOUNT_ID)
-            .state(State.of(UUID.randomUUID()))
+            .state(generateNewState())
             .date(DATE)
             .isDelegated(false)
-            .updated(TestMessageId.of(1), TestMessageId.of(2))
-            .created(TestMessageId.of(3))
+            .updated(messageId1, messageId2)
+            .created(messageId3)
             .build();
         repository.save(oldState).block();
         repository.save(change1).block();
         repository.save(change2).block();
 
-        EmailChanges emailChanges = repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.of(Limit.of(3))).block();
+        EmailChanges emailChanges = repository.getSinceStateWithDelegation(ACCOUNT_ID, state, Optional.of(Limit.of(3))).block();
         SoftAssertions.assertSoftly(softly -> {
-            softly.assertThat(emailChanges.getUpdated()).containsExactly(TestMessageId.of(1), TestMessageId.of(2));
-            softly.assertThat(emailChanges.getCreated()).containsExactly(TestMessageId.of(3));
+            softly.assertThat(emailChanges.getUpdated()).containsExactly(messageId1, messageId2);
+            softly.assertThat(emailChanges.getCreated()).containsExactly(messageId3);
         });
     }
 
@@ -1217,7 +1384,7 @@ public interface EmailChangeRepositoryContract {
     default void getSinceStateWithDelegationShouldFailWhenSinceStateNotFound() {
         EmailChangeRepository repository = emailChangeRepository();
 
-        assertThatThrownBy(() -> repository.getSinceStateWithDelegation(ACCOUNT_ID, STATE_0, Optional.empty()).block())
+        assertThatThrownBy(() -> repository.getSinceStateWithDelegation(ACCOUNT_ID, generateNewState(), Optional.empty()).block())
             .isInstanceOf(ChangeNotFoundException.class);
     }
 }
diff --git a/server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/change/MemoryEmailChangeRepositoryTest.java b/server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/change/MemoryEmailChangeRepositoryTest.java
index 3b1abc1..f7711db 100644
--- a/server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/change/MemoryEmailChangeRepositoryTest.java
+++ b/server/data/data-jmap/src/test/java/org/apache/james/jmap/memory/change/MemoryEmailChangeRepositoryTest.java
@@ -19,9 +19,13 @@
 
 package org.apache.james.jmap.memory.change;
 
+import java.util.concurrent.ThreadLocalRandom;
+
 import org.apache.james.jmap.api.change.EmailChangeRepository;
 import org.apache.james.jmap.api.change.EmailChangeRepositoryContract;
-import org.apache.james.jmap.api.change.MailboxChangeRepository;
+import org.apache.james.jmap.api.change.State;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.TestMessageId;
 import org.junit.jupiter.api.BeforeEach;
 
 public class MemoryEmailChangeRepositoryTest implements EmailChangeRepositoryContract {
@@ -36,4 +40,14 @@ public class MemoryEmailChangeRepositoryTest implements EmailChangeRepositoryCon
     public EmailChangeRepository emailChangeRepository() {
         return emailChangeRepository;
     }
+
+    @Override
+    public State generateNewState() {
+        return State.Factory.DEFAULT.generate();
+    }
+
+    @Override
+    public MessageId generateNewMessageId() {
+        return TestMessageId.of(ThreadLocalRandom.current().nextLong());
+    }
 }


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