f513c40770d86a7f4c83ef5c0b257a186b6d4a84
[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(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));
32
33     // When
34     Mono<Message> mono = chatRoom.getMessage(user, messageId);
35
36     // Then
37     assertThat(mono).emitsExactly(message);
38   }
39
40   @Test
41   @DisplayName("Assert, that Mono if empty, if message does not exists")
42   void testGetNonExistentMessage()
43   {
44     // Given
45     String user = "foo";
46     Long messageId = 1l;
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());
50
51     // When
52     Mono<Message> mono = chatRoom.getMessage(user, messageId);
53
54     // Then
55     assertThat(mono).emitsCount(0);
56   }
57
58   @Test
59   @DisplayName("Assert, that Mono emits expected message, if a new message is added")
60   void testAddNewMessage()
61   {
62     // Given
63     String user = "foo";
64     Long messageId = 1l;
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);
74
75     // When
76     Mono<Message> mono = chatRoom.addMessage(messageId, user, messageText);
77
78     // Then
79     assertThat(mono).emitsExactly(message);
80   }
81
82   @Test
83   @DisplayName("Assert, that Mono emits expected message, if an unchanged message is added")
84   void testAddUnchangedMessage()
85   {
86     // Given
87     String user = "foo";
88     Long messageId = 1l;
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);
98
99     // When
100     Mono<Message> mono = chatRoom.addMessage(messageId, user, messageText);
101
102     // Then
103     assertThat(mono).emitsExactly(message);
104   }
105
106   @Test
107   @DisplayName("Assert, that Mono sends an error, if a message is added again with mutated text")
108   void testAddMutatedMessage()
109   {
110     // Given
111     String user = "foo";
112     Long messageId = 1l;
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);
123
124     // When
125     Mono<Message> mono = chatRoom.addMessage(messageId, user, mutatedText);
126
127     // Then
128     assertThat(mono).sendsError();
129   }
130 }