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;
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));
}
@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
}
@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());
}
@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 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));
+ 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 messageText = "Bar";
+ Message message = new Message(key, 0l, timestamp, messageText);
+ when(chatMessageService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
+
// When
Mono<Message> mono = chatRoomData.addMessage(messageId, user, messageText);
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
+ 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);
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
Mono<Message> mono = chatRoomData.addMessage(messageId, user, mutatedText);
// 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
+ chatRoomData
+ .addMessage(messageId, user, mutatedText)
+ .onErrorResume((throwable) -> Mono.empty())
+ .block();
+
+ // Then
+ verify(chatMessageService, never()).persistMessage(any(), any(), any());
+ }
}