1 package de.juplo.kafka.chat.backend.domain;
3 import org.junit.jupiter.api.BeforeEach;
4 import org.junit.jupiter.api.DisplayName;
5 import org.junit.jupiter.api.Test;
6 import reactor.core.publisher.Mono;
8 import java.time.Clock;
9 import java.time.Instant;
10 import java.time.LocalDateTime;
11 import java.time.ZoneId;
13 import static org.mockito.Mockito.*;
14 import static pl.rzrz.assertj.reactor.Assertions.assertThat;
17 public class ChatRoomDataTest
20 ChatMessageService chatMessageService;
21 ChatRoomData chatRoomData;
25 Message.MessageKey key;
26 LocalDateTime timestamp;
32 now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
33 chatMessageService = mock(ChatMessageService.class);
34 chatRoomData = new ChatRoomData(
41 key = Message.MessageKey.of(user, messageId);
42 timestamp = LocalDateTime.now(now);
47 @DisplayName("Assert, that Mono emits expected message, if it exists")
48 void testGetExistingMessage()
51 Message message = new Message(key, 0l, timestamp, "Bar");
52 when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
55 Mono<Message> mono = chatRoomData.getMessage(user, messageId);
58 assertThat(mono).emitsExactly(message);
62 @DisplayName("Assert, that Mono is empty, if message does not exists")
63 void testGetNonExistentMessage()
66 when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
69 Mono<Message> mono = chatRoomData.getMessage(user, messageId);
72 assertThat(mono).emitsCount(0);
76 @DisplayName("Assert, that Mono emits the persisted message, if a new message is added")
77 void testAddNewMessageEmitsPersistedMessage()
80 String messageText = "Bar";
81 Message message = new Message(key, 0l, timestamp, messageText);
82 when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
83 when(chatMessageService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
86 Mono<Message> mono = chatRoomData.addMessage(messageId, user, messageText);
89 assertThat(mono).emitsExactly(message);
93 @DisplayName("Assert, that ChatMessageService.persistMessage() is called correctly, if a new message is added")
94 void testAddNewMessageTriggersPersistence()
97 String messageText = "Bar";
98 Message message = new Message(key, 0l, timestamp, messageText);
99 when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
100 when(chatMessageService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
104 .addMessage(messageId, user, messageText)
108 verify(chatMessageService, times(1)).persistMessage(eq(key), eq(timestamp), eq(messageText));
112 @DisplayName("Assert, that Mono emits the already persisted message, if an unchanged message is added")
113 void testAddUnchangedMessageEmitsAlreadyPersistedMessage()
116 String messageText = "Bar";
117 Message message = new Message(key, 0l, timestamp, messageText);
118 when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
119 when(chatMessageService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
122 Mono<Message> mono = chatRoomData.addMessage(messageId, user, messageText);
125 assertThat(mono).emitsExactly(message);
129 @DisplayName("Assert, that ChatMessageService.persistMessage() is not called, if an unchanged message is added")
130 void testAddUnchangedMessageDoesNotTriggerPersistence()
133 String messageText = "Bar";
134 Message message = new Message(key, 0l, timestamp, messageText);
135 when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
136 when(chatMessageService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
140 .addMessage(messageId, user, messageText)
144 verify(chatMessageService, never()).persistMessage(any(), any(), any());
148 @DisplayName("Assert, that Mono sends an error, if a message is added again with mutated text")
149 void testAddMutatedMessageSendsError()
152 String messageText = "Bar";
153 String mutatedText = "Boom!";
154 Message message = new Message(key, 0l, timestamp, messageText);
155 when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
156 when(chatMessageService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
159 Mono<Message> mono = chatRoomData.addMessage(messageId, user, mutatedText);
162 assertThat(mono).sendsError();
166 @DisplayName("Assert, that ChatMessageService.persistMessage() is not called, if a message is added again with mutated text")
167 void testAddMutatedDoesNotTriggerPersistence()
170 String messageText = "Bar";
171 String mutatedText = "Boom!";
172 Message message = new Message(key, 0l, timestamp, messageText);
173 when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
174 when(chatMessageService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
178 .addMessage(messageId, user, mutatedText)
179 .onErrorResume((throwable) -> Mono.empty())
183 verify(chatMessageService, never()).persistMessage(any(), any(), any());