d87155c2044c6486d15ff3eb92d6668b40649db5
[demos/kafka/chat] / src / test / java / de / juplo / kafka / chat / backend / domain / ChatRoomTest.java
1 package de.juplo.kafka.chat.backend.domain;
2
3 import org.junit.jupiter.api.DisplayName;
4 import org.junit.jupiter.api.Test;
5 import reactor.core.publisher.Mono;
6
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;
12
13 import static org.mockito.Mockito.*;
14 import static pl.rzrz.assertj.reactor.Assertions.assertThat;
15
16
17 public class ChatRoomTest
18 {
19   @Test
20   @DisplayName("Assert, that Mono emits expected message, if it exists")
21   void testGetExistingMessage()
22   {
23     // Given
24     String user = "foo";
25     Long messageId = 1l;
26     ChatRoomService chatRoomService = mock(ChatRoomService.class);
27     ChatRoom chatRoom = new ChatRoom(
28         UUID.randomUUID(),
29         "Foo",
30         Clock.systemDefaultZone(),
31         chatRoomService,
32         8);
33     Message.MessageKey key = Message.MessageKey.of(user, messageId);
34     LocalDateTime timestamp = LocalDateTime.now();
35     Message message = new Message(key, 0l, timestamp, "Bar");
36     when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
37
38     // When
39     Mono<Message> mono = chatRoom.getMessage(user, messageId);
40
41     // Then
42     assertThat(mono).emitsExactly(message);
43   }
44
45   @Test
46   @DisplayName("Assert, that Mono if empty, if message does not exists")
47   void testGetNonExistentMessage()
48   {
49     // Given
50     String user = "foo";
51     Long messageId = 1l;
52     ChatRoomService chatRoomService = mock(ChatRoomService.class);
53     ChatRoom chatRoom = new ChatRoom(
54         UUID.randomUUID(),
55         "Foo",
56         Clock.systemDefaultZone(),
57         chatRoomService,
58         8);
59     when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
60
61     // When
62     Mono<Message> mono = chatRoom.getMessage(user, messageId);
63
64     // Then
65     assertThat(mono).emitsCount(0);
66   }
67
68   @Test
69   @DisplayName("Assert, that Mono emits expected message, if a new message is added")
70   void testAddNewMessage()
71   {
72     // Given
73     String user = "foo";
74     Long messageId = 1l;
75     ChatRoomService chatRoomService = mock(ChatRoomService.class);
76     ChatRoom chatRoom = new ChatRoom(
77         UUID.randomUUID(),
78         "Foo",
79         Clock.systemDefaultZone(),
80         chatRoomService,
81         8);
82     Message.MessageKey key = Message.MessageKey.of(user, messageId);
83     Clock now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
84     LocalDateTime timestamp = LocalDateTime.now(now);
85     String messageText = "Bar";
86     Message message = new Message(key, 0l, timestamp, messageText);
87     when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
88     when(chatRoomService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(message);
89
90     // When
91     Mono<Message> mono = chatRoom.addMessage(messageId, user, messageText);
92
93     // Then
94     assertThat(mono).emitsExactly(message);
95   }
96
97   @Test
98   @DisplayName("Assert, that Mono emits expected message, if an unchanged message is added")
99   void testAddUnchangedMessage()
100   {
101     // Given
102     String user = "foo";
103     Long messageId = 1l;
104     ChatRoomService chatRoomService = mock(ChatRoomService.class);
105     ChatRoom chatRoom = new ChatRoom(
106         UUID.randomUUID(),
107         "Foo",
108         Clock.systemDefaultZone(),
109         chatRoomService,
110         8);
111     Message.MessageKey key = Message.MessageKey.of(user, messageId);
112     Clock now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
113     LocalDateTime timestamp = LocalDateTime.now(now);
114     String messageText = "Bar";
115     Message message = new Message(key, 0l, timestamp, messageText);
116     when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
117     when(chatRoomService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(message);
118
119     // When
120     Mono<Message> mono = chatRoom.addMessage(messageId, user, messageText);
121
122     // Then
123     assertThat(mono).emitsExactly(message);
124   }
125
126   @Test
127   @DisplayName("Assert, that Mono sends an error, if a message is added again with mutated text")
128   void testAddMutatedMessage()
129   {
130     // Given
131     String user = "foo";
132     Long messageId = 1l;
133     ChatRoomService chatRoomService = mock(ChatRoomService.class);
134     ChatRoom chatRoom = new ChatRoom(
135         UUID.randomUUID(),
136         "Foo",
137         Clock.systemDefaultZone(),
138         chatRoomService,
139         8);
140     Message.MessageKey key = Message.MessageKey.of(user, messageId);
141     Clock now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
142     LocalDateTime timestamp = LocalDateTime.now(now);
143     String messageText = "Bar";
144     String mutatedText = "Boom!";
145     Message message = new Message(key, 0l, timestamp, messageText);
146     when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
147     when(chatRoomService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(message);
148
149     // When
150     Mono<Message> mono = chatRoom.addMessage(messageId, user, mutatedText);
151
152     // Then
153     assertThat(mono).sendsError();
154   }
155 }