test: `ChatRoomDataTest` verifies that persistence is triggered as expected
[demos/kafka/chat] / src / test / java / de / juplo / kafka / chat / backend / domain / ChatRoomDataTest.java
index 3c7d1dd..58c4b50 100644 (file)
@@ -1,5 +1,6 @@
 package de.juplo.kafka.chat.backend.domain;
 
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
 import reactor.core.publisher.Mono;
@@ -15,20 +16,38 @@ import static pl.rzrz.assertj.reactor.Assertions.assertThat;
 
 public class ChatRoomDataTest
 {
+  Clock now;
+  ChatMessageService chatMessageService;
+  ChatRoomData chatRoomData;
+
+  String user;
+  Long messageId;
+  Message.MessageKey key;
+  LocalDateTime timestamp;
+
+
+  @BeforeEach
+  public void setUp()
+  {
+    now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
+    chatMessageService = mock(ChatMessageService.class);
+    chatRoomData = new ChatRoomData(
+        now,
+        chatMessageService,
+        8);
+
+    user = "foo";
+    messageId = 1l;
+    key = Message.MessageKey.of(user, messageId);
+    timestamp = LocalDateTime.now(now);
+  }
+
+
   @Test
   @DisplayName("Assert, that Mono emits expected message, if it exists")
   void testGetExistingMessage()
   {
     // Given
-    String user = "foo";
-    Long messageId = 1l;
-    ChatMessageService chatMessageService = mock(ChatMessageService.class);
-    ChatRoomData chatRoomData = new ChatRoomData(
-        Clock.systemDefaultZone(),
-        chatMessageService,
-        8);
-    Message.MessageKey key = Message.MessageKey.of(user, messageId);
-    LocalDateTime timestamp = LocalDateTime.now();
     Message message = new Message(key, 0l, timestamp, "Bar");
     when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
 
@@ -40,17 +59,10 @@ public class ChatRoomDataTest
   }
 
   @Test
-  @DisplayName("Assert, that Mono if empty, if message does not exists")
+  @DisplayName("Assert, that Mono is empty, if message does not exists")
   void testGetNonExistentMessage()
   {
     // Given
-    String user = "foo";
-    Long messageId = 1l;
-    ChatMessageService chatMessageService = mock(ChatMessageService.class);
-    ChatRoomData chatRoomData = new ChatRoomData(
-        Clock.systemDefaultZone(),
-        chatMessageService,
-        8);
     when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
 
     // When
@@ -61,20 +73,10 @@ public class ChatRoomDataTest
   }
 
   @Test
-  @DisplayName("Assert, that Mono emits expected message, if a new message is added")
-  void testAddNewMessage()
+  @DisplayName("Assert, that Mono emits the persisted message, if a new message is added")
+  void testAddNewMessageEmitsPersistedMessage()
   {
     // Given
-    String user = "foo";
-    Long messageId = 1l;
-    ChatMessageService chatMessageService = mock(ChatMessageService.class);
-    ChatRoomData chatRoomData = new ChatRoomData(
-        Clock.systemDefaultZone(),
-        chatMessageService,
-        8);
-    Message.MessageKey key = Message.MessageKey.of(user, messageId);
-    Clock now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
-    LocalDateTime timestamp = LocalDateTime.now(now);
     String messageText = "Bar";
     Message message = new Message(key, 0l, timestamp, messageText);
     when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
@@ -88,20 +90,29 @@ public class ChatRoomDataTest
   }
 
   @Test
-  @DisplayName("Assert, that Mono emits expected message, if an unchanged message is added")
-  void testAddUnchangedMessage()
+  @DisplayName("Assert, that ChatMessageService.persistMessage() is called correctly, if a new message is added")
+  void testAddNewMessageTriggersPersistence()
+  {
+    // Given
+    String messageText = "Bar";
+    Message message = new Message(key, 0l, timestamp, messageText);
+    when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
+    when(chatMessageService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
+
+    // When
+    chatRoomData
+        .addMessage(messageId, user, messageText)
+        .block();
+
+    // Then
+    verify(chatMessageService, times(1)).persistMessage(eq(key), eq(timestamp), eq(messageText));
+  }
+
+  @Test
+  @DisplayName("Assert, that Mono emits the already persisted message, if an unchanged message is added")
+  void testAddUnchangedMessageEmitsAlreadyPersistedMessage()
   {
     // Given
-    String user = "foo";
-    Long messageId = 1l;
-    ChatMessageService chatMessageService = mock(ChatMessageService.class);
-    ChatRoomData chatRoomData = new ChatRoomData(
-        Clock.systemDefaultZone(),
-        chatMessageService,
-        8);
-    Message.MessageKey key = Message.MessageKey.of(user, messageId);
-    Clock now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
-    LocalDateTime timestamp = LocalDateTime.now(now);
     String messageText = "Bar";
     Message message = new Message(key, 0l, timestamp, messageText);
     when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
@@ -114,21 +125,30 @@ public class ChatRoomDataTest
     assertThat(mono).emitsExactly(message);
   }
 
+  @Test
+  @DisplayName("Assert, that ChatMessageService.persistMessage() is not called, if an unchanged message is added")
+  void testAddUnchangedMessageDoesNotTriggerPersistence()
+  {
+    // Given
+    String messageText = "Bar";
+    Message message = new Message(key, 0l, timestamp, messageText);
+    when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
+    when(chatMessageService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
+
+    // When
+    chatRoomData
+        .addMessage(messageId, user, messageText)
+        .block();
+
+    // Then
+    verify(chatMessageService, never()).persistMessage(any(), any(), any());
+  }
+
   @Test
   @DisplayName("Assert, that Mono sends an error, if a message is added again with mutated text")
-  void testAddMutatedMessage()
+  void testAddMutatedMessageSendsError()
   {
     // Given
-    String user = "foo";
-    Long messageId = 1l;
-    ChatMessageService chatMessageService = mock(ChatMessageService.class);
-    ChatRoomData chatRoomData = new ChatRoomData(
-        Clock.systemDefaultZone(),
-        chatMessageService,
-        8);
-    Message.MessageKey key = Message.MessageKey.of(user, messageId);
-    Clock now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
-    LocalDateTime timestamp = LocalDateTime.now(now);
     String messageText = "Bar";
     String mutatedText = "Boom!";
     Message message = new Message(key, 0l, timestamp, messageText);
@@ -141,4 +161,25 @@ public class ChatRoomDataTest
     // Then
     assertThat(mono).sendsError();
   }
+
+  @Test
+  @DisplayName("Assert, that ChatMessageService.persistMessage() is not called, if a message is added again with mutated text")
+  void testAddMutatedDoesNotTriggerPersistence()
+  {
+    // Given
+    String messageText = "Bar";
+    String mutatedText = "Boom!";
+    Message message = new Message(key, 0l, timestamp, messageText);
+    when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
+    when(chatMessageService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
+
+    // When
+    chatRoomData
+        .addMessage(messageId, user, mutatedText)
+        .onErrorResume((throwable) -> Mono.empty())
+        .block();
+
+    // Then
+    verify(chatMessageService, never()).persistMessage(any(), any(), any());
+  }
 }