822ffe77efbb493fb675f6189bc37fd4643826bd
[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         0,
31         Clock.systemDefaultZone(),
32         chatRoomService,
33         8);
34     Message.MessageKey key = Message.MessageKey.of(user, messageId);
35     LocalDateTime timestamp = LocalDateTime.now();
36     Message message = new Message(key, 0l, timestamp, "Bar");
37     when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
38
39     // When
40     Mono<Message> mono = chatRoom.getMessage(user, messageId);
41
42     // Then
43     assertThat(mono).emitsExactly(message);
44   }
45
46   @Test
47   @DisplayName("Assert, that Mono if empty, if message does not exists")
48   void testGetNonExistentMessage()
49   {
50     // Given
51     String user = "foo";
52     Long messageId = 1l;
53     ChatRoomService chatRoomService = mock(ChatRoomService.class);
54     ChatRoom chatRoom = new ChatRoom(
55         UUID.randomUUID(),
56         "Foo",
57         0,
58         Clock.systemDefaultZone(),
59         chatRoomService,
60         8);
61     when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
62
63     // When
64     Mono<Message> mono = chatRoom.getMessage(user, messageId);
65
66     // Then
67     assertThat(mono).emitsCount(0);
68   }
69
70   @Test
71   @DisplayName("Assert, that Mono emits expected message, if a new message is added")
72   void testAddNewMessage()
73   {
74     // Given
75     String user = "foo";
76     Long messageId = 1l;
77     ChatRoomService chatRoomService = mock(ChatRoomService.class);
78     ChatRoom chatRoom = new ChatRoom(
79         UUID.randomUUID(),
80         "Foo",
81         0,
82         Clock.systemDefaultZone(),
83         chatRoomService,
84         8);
85     Message.MessageKey key = Message.MessageKey.of(user, messageId);
86     Clock now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
87     LocalDateTime timestamp = LocalDateTime.now(now);
88     String messageText = "Bar";
89     Message message = new Message(key, 0l, timestamp, messageText);
90     when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.empty());
91     when(chatRoomService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
92
93     // When
94     Mono<Message> mono = chatRoom.addMessage(messageId, user, messageText);
95
96     // Then
97     assertThat(mono).emitsExactly(message);
98   }
99
100   @Test
101   @DisplayName("Assert, that Mono emits expected message, if an unchanged message is added")
102   void testAddUnchangedMessage()
103   {
104     // Given
105     String user = "foo";
106     Long messageId = 1l;
107     ChatRoomService chatRoomService = mock(ChatRoomService.class);
108     ChatRoom chatRoom = new ChatRoom(
109         UUID.randomUUID(),
110         "Foo",
111         0,
112         Clock.systemDefaultZone(),
113         chatRoomService,
114         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     Message message = new Message(key, 0l, timestamp, messageText);
120     when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
121     when(chatRoomService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
122
123     // When
124     Mono<Message> mono = chatRoom.addMessage(messageId, user, messageText);
125
126     // Then
127     assertThat(mono).emitsExactly(message);
128   }
129
130   @Test
131   @DisplayName("Assert, that Mono sends an error, if a message is added again with mutated text")
132   void testAddMutatedMessage()
133   {
134     // Given
135     String user = "foo";
136     Long messageId = 1l;
137     ChatRoomService chatRoomService = mock(ChatRoomService.class);
138     ChatRoom chatRoom = new ChatRoom(
139         UUID.randomUUID(),
140         "Foo",
141         0,
142         Clock.systemDefaultZone(),
143         chatRoomService,
144         8);
145     Message.MessageKey key = Message.MessageKey.of(user, messageId);
146     Clock now = Clock.fixed(Instant.now(), ZoneId.systemDefault());
147     LocalDateTime timestamp = LocalDateTime.now(now);
148     String messageText = "Bar";
149     String mutatedText = "Boom!";
150     Message message = new Message(key, 0l, timestamp, messageText);
151     when(chatRoomService.getMessage(any(Message.MessageKey.class))).thenReturn(Mono.just(message));
152     when(chatRoomService.persistMessage(any(Message.MessageKey.class), any(LocalDateTime.class), any(String.class))).thenReturn(Mono.just(message));
153
154     // When
155     Mono<Message> mono = chatRoom.addMessage(messageId, user, mutatedText);
156
157     // Then
158     assertThat(mono).sendsError();
159   }
160 }