refactor: Moved `ShardingStrategy` into package `persistence` -- ALIGNE
[demos/kafka/chat] / src / test / java / de / juplo / kafka / chat / backend / persistence / AbstractStorageStrategyIT.java
index 84cf7d9..e619649 100644 (file)
@@ -6,7 +6,6 @@ import org.junit.jupiter.api.Test;
 
 import java.util.List;
 import java.util.UUID;
-import java.util.function.Supplier;
 
 import static pl.rzrz.assertj.reactor.Assertions.*;
 
@@ -15,22 +14,20 @@ import static pl.rzrz.assertj.reactor.Assertions.*;
 public abstract class AbstractStorageStrategyIT
 {
   protected ChatHome chathome;
-  protected ChatRoomFactory chatRoomFactory;
 
 
   protected abstract StorageStrategy getStorageStrategy();
-  protected abstract Supplier<ChatHomeService> getChatHomeServiceSupplier();
-  protected abstract ChatRoomFactory getChatRoomFactory();
+  protected abstract StorageStrategyITConfig getConfig();
 
   protected void start()
   {
-    chathome = new ChatHome(getChatHomeServiceSupplier().get(), 0);
-    chatRoomFactory = getChatRoomFactory();
+    StorageStrategyITConfig config = getConfig();
+    chathome = config.getChatHome();
   }
 
   protected void stop()
   {
-    getStorageStrategy().write(chathome.getChatRooms());
+    getStorageStrategy().write(chathome);
   }
 
   @Test
@@ -38,29 +35,85 @@ public abstract class AbstractStorageStrategyIT
   {
     start();
 
-    assertThat(chathome.getChatRooms().toStream()).hasSize(0);
+    assertThat(chathome.getChatRoomInfo().toStream()).hasSize(0);
 
     UUID chatRoomId = UUID.fromString("5c73531c-6fc4-426c-adcb-afc5c140a0f7");
-    ChatRoom chatroom = chatRoomFactory.createChatRoom(chatRoomId, "FOO").block();
-    chathome.putChatRoom(chatroom);
+    ChatRoomInfo info = chathome.createChatRoom(chatRoomId, "FOO").block();
+    log.debug("Created chat-room {}", info);
+    ChatRoomData chatroom = chathome.getChatRoomData(chatRoomId).block();
     Message m1 = chatroom.addMessage(1l,"peter", "Hallo, ich heiße Peter!").block();
     Message m2 = chatroom.addMessage(1l, "ute", "Ich bin Ute...").block();
     Message m3 = chatroom.addMessage(2l, "peter", "Willst du mit mir gehen?").block();
     Message m4 = chatroom.addMessage(1l, "klaus", "Ja? Nein? Vielleicht??").block();
 
-    assertThat(chathome.getChatRooms().toStream()).containsExactlyElementsOf(List.of(chatroom));
-    assertThat(chathome.getChatRoom(chatroom.getId())).emitsExactly(chatroom);
+    assertThat(chathome.getChatRoomInfo().toStream()).containsExactlyElementsOf(List.of(info));
+    assertThat(chathome.getChatRoomInfo(chatRoomId)).emitsExactly(info);
     assertThat(chathome
-        .getChatRoom(chatroom.getId())
+        .getChatRoomData(chatRoomId)
         .flatMapMany(cr -> cr.getMessages())).emitsExactly(m1, m2, m3, m4);
 
     stop();
     start();
 
-    assertThat(chathome.getChatRooms().toStream()).containsExactlyElementsOf(List.of(chatroom));
-    assertThat(chathome.getChatRoom(chatroom.getId())).emitsExactly(chatroom);
+    assertThat(chathome.getChatRoomInfo().toStream()).containsExactlyElementsOf(List.of(info));
+    assertThat(chathome.getChatRoomInfo(chatRoomId)).emitsExactly(info);
     assertThat(chathome
-        .getChatRoom(chatroom.getId())
+        .getChatRoomData(chatRoomId)
         .flatMapMany(cr -> cr.getMessages())).emitsExactly(m1, m2, m3, m4);
   }
+
+  @Test
+  protected void testStoreAndRecreateParallelChatRooms()
+  {
+    start();
+
+    assertThat(chathome.getChatRoomInfo().toStream()).hasSize(0);
+
+    UUID chatRoomAId = UUID.fromString("5c73531c-6fc4-426c-adcb-afc5c140a0f7");
+    ChatRoomInfo infoA = chathome.createChatRoom(chatRoomAId, "FOO").block();
+    log.debug("Created chat-room {}", infoA);
+    ChatRoomData chatroomA = chathome.getChatRoomData(chatRoomAId).block();
+    Message ma1 = chatroomA.addMessage(1l,"peter", "Hallo, ich heiße Peter!").block();
+    Message ma2 = chatroomA.addMessage(1l, "ute", "Ich bin Ute...").block();
+    Message ma3 = chatroomA.addMessage(2l, "peter", "Willst du mit mir gehen?").block();
+    Message ma4 = chatroomA.addMessage(1l, "klaus", "Ja? Nein? Vielleicht??").block();
+
+    UUID chatRoomBId = UUID.fromString("8763dfdc-4dda-4a74-bea4-4b389177abea");
+    ChatRoomInfo infoB = chathome.createChatRoom(chatRoomBId, "BAR").block();
+    log.debug("Created chat-room {}", infoB);
+    ChatRoomData chatroomB = chathome.getChatRoomData(chatRoomBId).block();
+    Message mb1 = chatroomB.addMessage(1l,"peter", "Hallo, ich heiße Uwe!").block();
+    Message mb2 = chatroomB.addMessage(1l, "ute", "Ich bin Ute...").block();
+    Message mb3 = chatroomB.addMessage(1l, "klaus", "Willst du mit mir gehen?").block();
+    Message mb4 = chatroomB.addMessage(2l, "peter", "Hä? Was jetzt?!? Isch glohb isch höb ühn däjah vüh...").block();
+
+    assertThat(chathome.getChatRoomInfo().toStream()).containsExactlyInAnyOrderElementsOf(List.of(infoA, infoB));
+    assertThat(chathome.getChatRoomInfo(chatRoomAId)).emitsExactly(infoA);
+    assertThat(chathome
+        .getChatRoomData(chatRoomAId)
+        .flatMapMany(cr -> cr.getMessages())).emitsExactly(ma1, ma2, ma3, ma4);
+    assertThat(chathome.getChatRoomData(chatRoomBId)).emitsExactly(chatroomB);
+    assertThat(chathome
+        .getChatRoomData(chatRoomBId)
+        .flatMapMany(cr -> cr.getMessages())).emitsExactly(mb1, mb2, mb3, mb4);
+
+    stop();
+    start();
+
+    assertThat(chathome.getChatRoomInfo().toStream()).containsExactlyInAnyOrderElementsOf(List.of(infoA, infoB));
+    assertThat(chathome.getChatRoomInfo(chatRoomAId)).emitsExactly(infoA);
+    assertThat(chathome
+        .getChatRoomData(chatRoomAId)
+        .flatMapMany(cr -> cr.getMessages())).emitsExactly(ma1, ma2, ma3, ma4);
+    assertThat(chathome.getChatRoomInfo(chatRoomBId)).emitsExactly(infoB);
+    assertThat(chathome
+        .getChatRoomData(chatRoomBId)
+        .flatMapMany(cr -> cr.getMessages())).emitsExactly(mb1, mb2, mb3, mb4);
+  }
+
+
+  interface StorageStrategyITConfig
+  {
+    ChatHome getChatHome();
+  }
 }