1 package de.juplo.kafka.chat.backend.domain;
3 import org.junit.jupiter.api.DisplayName;
4 import org.junit.jupiter.api.Test;
5 import reactor.core.publisher.Mono;
7 import java.time.Clock;
8 import java.time.Instant;
9 import java.time.LocalDateTime;
10 import java.time.ZoneId;
11 import java.util.UUID;
13 import static org.mockito.Mockito.*;
14 import static pl.rzrz.assertj.reactor.Assertions.assertThat;
17 public class ChatRoomTest
20 @DisplayName("Assert, that Mono emits expected message, if it exists")
21 void testGetExistingMessage()
26 ChatRoomService chatRoomService = mock(ChatRoomService.class);
27 ChatRoom chatRoom = new ChatRoom(UUID.randomUUID(), "Foo", Clock.systemDefaultZone(), chatRoomService, 8);
28 Message.MessageKey key = Message.MessageKey.of(user, messageId);
29 LocalDateTime timestamp = LocalDateTime.now();
30 Message message = new Message(key, 0l, timestamp, "Bar");
31 when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
34 Mono<Message> mono = chatRoom.getMessage(user, messageId);
37 assertThat(mono).emitsExactly(message);
41 @DisplayName("Assert, that Mono if empty, if message does not exists")
42 void testGetNonExistentMessage()
47 ChatRoomService chatRoomService = mock(ChatRoomService.class);
48 ChatRoom chatRoom = new ChatRoom(UUID.randomUUID(), "Foo", Clock.systemDefaultZone(), chatRoomService, 8);
49 when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
52 Mono<Message> mono = chatRoom.getMessage(user, messageId);
55 assertThat(mono).emitsCount(0);
59 @DisplayName("Assert, that Mono emits expected message, if a new message is added")
60 void testAddNewMessage()
65 ChatRoomService chatRoomService = mock(ChatRoomService.class);
66 ChatRoom chatRoom = new ChatRoom(UUID.randomUUID(), "Foo", Clock.systemDefaultZone(), chatRoomService, 8);
67 Message.MessageKey key = Message.MessageKey.of(user, messageId);
68 Clock now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
69 LocalDateTime timestamp = LocalDateTime.now(now);
70 String messageText = "Bar";
71 Message message = new Message(key, 0l, timestamp, messageText);
72 when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
73 when(chatRoomService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(message);
76 Mono<Message> mono = chatRoom.addMessage(messageId, user, messageText);
79 assertThat(mono).emitsExactly(message);
83 @DisplayName("Assert, that Mono emits expected message, if an unchanged message is added")
84 void testAddUnchangedMessage()
89 ChatRoomService chatRoomService = mock(ChatRoomService.class);
90 ChatRoom chatRoom = new ChatRoom(UUID.randomUUID(), "Foo", Clock.systemDefaultZone(), chatRoomService, 8);
91 Message.MessageKey key = Message.MessageKey.of(user, messageId);
92 Clock now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
93 LocalDateTime timestamp = LocalDateTime.now(now);
94 String messageText = "Bar";
95 Message message = new Message(key, 0l, timestamp, messageText);
96 when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
97 when(chatRoomService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(message);
100 Mono<Message> mono = chatRoom.addMessage(messageId, user, messageText);
103 assertThat(mono).emitsExactly(message);
107 @DisplayName("Assert, that Mono sends an error, if a message is added again with mutated text")
108 void testAddMutatedMessage()
113 ChatRoomService chatRoomService = mock(ChatRoomService.class);
114 ChatRoom chatRoom = new ChatRoom(UUID.randomUUID(), "Foo", Clock.systemDefaultZone(), chatRoomService, 8);
115 Message.MessageKey key = Message.MessageKey.of(user, messageId);
116 Clock now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
117 LocalDateTime timestamp = LocalDateTime.now(now);
118 String messageText = "Bar";
119 String mutatedText = "Boom!";
120 Message message = new Message(key, 0l, timestamp, messageText);
121 when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
122 when(chatRoomService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(message);
125 Mono<Message> mono = chatRoom.addMessage(messageId, user, mutatedText);
128 assertThat(mono).sendsError();