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