Skip to content

Commit 6969065

Browse files
authored
Merge pull request #95 from AET-DevOps25/add-tests
test: add integration and unit tests for messaging service endpoints
2 parents 075c3c0 + 3caac16 commit 6969065

File tree

2 files changed

+273
-35
lines changed

2 files changed

+273
-35
lines changed
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package messagingservice;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import messagingservice.dto.MessageDto;
5+
import messagingservice.dto.ContactDto;
6+
import messagingservice.dto.SendMessageRequest;
7+
import model.UserDTO;
8+
import org.junit.jupiter.api.DisplayName;
9+
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.api.extension.ExtendWith;
11+
import org.mockito.Mockito;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
14+
import org.springframework.boot.test.mock.mockito.MockBean;
15+
import org.springframework.data.domain.Page;
16+
import org.springframework.data.domain.PageImpl;
17+
import org.springframework.data.domain.PageRequest;
18+
import org.springframework.http.MediaType;
19+
import org.springframework.test.context.junit.jupiter.SpringExtension;
20+
import org.springframework.test.web.servlet.MockMvc;
21+
22+
import java.time.LocalDateTime;
23+
import java.util.List;
24+
import java.util.Arrays;
25+
26+
import static org.hamcrest.Matchers.*;
27+
import static org.mockito.ArgumentMatchers.any;
28+
import static org.mockito.ArgumentMatchers.eq;
29+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
30+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
31+
32+
/**
33+
* Integration tests for {@link MessagingController}.
34+
*/
35+
@ExtendWith(SpringExtension.class)
36+
@WebMvcTest(MessagingController.class)
37+
class MessagingControllerTest {
38+
39+
@Autowired
40+
private MockMvc mockMvc;
41+
42+
@MockBean
43+
private MessagingService messagingService;
44+
45+
private final ObjectMapper mapper = new ObjectMapper();
46+
47+
@Test
48+
@DisplayName("POST /messaging/send returns sent message")
49+
void sendMessageEndpointReturnsSentMessage() throws Exception {
50+
// Given
51+
SendMessageRequest request = new SendMessageRequest();
52+
request.setFromUserId("user1");
53+
request.setToUserId("user2");
54+
request.setContent("Hello World");
55+
56+
MessageDto expectedResponse = new MessageDto(1L, "user1", "user2", "Hello World", LocalDateTime.now());
57+
58+
Mockito.when(messagingService.sendMessage("user1", "user2", "Hello World"))
59+
.thenReturn(expectedResponse);
60+
61+
// When & Then
62+
mockMvc.perform(post("/messaging/send")
63+
.contentType(MediaType.APPLICATION_JSON)
64+
.content(mapper.writeValueAsString(request)))
65+
.andExpect(status().isOk())
66+
.andExpect(jsonPath("$.fromUserId", is("user1")))
67+
.andExpect(jsonPath("$.toUserId", is("user2")))
68+
.andExpect(jsonPath("$.content", is("Hello World")));
69+
}
70+
71+
@Test
72+
@DisplayName("GET /messaging/conversation returns paginated conversation")
73+
void getConversationEndpointReturnsPaginatedMessages() throws Exception {
74+
// Given
75+
List<MessageDto> messages = Arrays.asList(
76+
new MessageDto(1L, "user1", "user2", "Hi", LocalDateTime.now()),
77+
new MessageDto(2L, "user2", "user1", "Hello", LocalDateTime.now())
78+
);
79+
Page<MessageDto> messagePage = new PageImpl<>(messages, PageRequest.of(0, 10), 2);
80+
81+
Mockito.when(messagingService.getConversation("user1", "user2", 0, 10))
82+
.thenReturn(messagePage);
83+
84+
// When & Then
85+
mockMvc.perform(get("/messaging/conversation")
86+
.param("userA", "user1")
87+
.param("userB", "user2")
88+
.param("page", "0")
89+
.param("size", "10"))
90+
.andExpect(status().isOk())
91+
.andExpect(jsonPath("$.content", hasSize(2)))
92+
.andExpect(jsonPath("$.totalElements", is(2)))
93+
.andExpect(jsonPath("$.content[0].content", is("Hi")))
94+
.andExpect(jsonPath("$.content[1].content", is("Hello")));
95+
}
96+
97+
@Test
98+
@DisplayName("POST /messaging/contact adds contact and returns contact info")
99+
void addContactEndpointAddsContactAndReturnsInfo() throws Exception {
100+
// Given
101+
ContactDto expectedResponse = new ContactDto("user1", "user2", LocalDateTime.now());
102+
103+
Mockito.when(messagingService.addContact("user1", "user2"))
104+
.thenReturn(expectedResponse);
105+
106+
// When & Then
107+
mockMvc.perform(post("/messaging/contact")
108+
.param("userId", "user1")
109+
.param("contactId", "user2"))
110+
.andExpect(status().isOk())
111+
.andExpect(jsonPath("$.userId", is("user1")))
112+
.andExpect(jsonPath("$.contactId", is("user2")));
113+
}
114+
115+
@Test
116+
@DisplayName("GET /messaging/contacts/{userId} returns user contacts")
117+
void getContactsEndpointReturnsUserContacts() throws Exception {
118+
// Given
119+
List<UserDTO> contacts = Arrays.asList(
120+
new UserDTO("user2", "User Two", "", "", "", java.util.Map.of(), java.util.List.of()),
121+
new UserDTO("user3", "User Three", "", "", "", java.util.Map.of(), java.util.List.of())
122+
);
123+
124+
Mockito.when(messagingService.getContacts("user1")).thenReturn(contacts);
125+
126+
// When & Then
127+
mockMvc.perform(get("/messaging/contacts/user1"))
128+
.andExpect(status().isOk())
129+
.andExpect(jsonPath("$", hasSize(2)))
130+
.andExpect(jsonPath("$[0].id", is("user2")))
131+
.andExpect(jsonPath("$[1].id", is("user3")));
132+
}
133+
134+
@Test
135+
@DisplayName("POST /messaging/send with invalid request returns bad request")
136+
void sendMessageWithInvalidRequestReturnsBadRequest() throws Exception {
137+
// Given - Invalid request with empty fields
138+
SendMessageRequest invalidRequest = new SendMessageRequest();
139+
invalidRequest.setFromUserId("");
140+
invalidRequest.setToUserId("");
141+
invalidRequest.setContent("");
142+
143+
// When & Then
144+
mockMvc.perform(post("/messaging/send")
145+
.contentType(MediaType.APPLICATION_JSON)
146+
.content(mapper.writeValueAsString(invalidRequest)))
147+
.andExpect(status().isBadRequest());
148+
}
149+
}
Lines changed: 124 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,135 @@
11
package messagingservice;
22

3-
import messagingservice.dto.MessageDto;
3+
import messagingservice.entity.MessageEntity;
4+
import messagingservice.entity.ContactEntity;
45
import messagingservice.repository.MessageRepository;
5-
import org.junit.jupiter.api.BeforeEach;
6+
import messagingservice.repository.ContactRepository;
7+
import messagingservice.client.UserServiceClient;
8+
import messagingservice.dto.MessageDto;
9+
import messagingservice.dto.ContactDto;
10+
import model.UserDTO;
611
import org.junit.jupiter.api.Test;
7-
import org.springframework.beans.factory.annotation.Autowired;
8-
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
9-
import org.springframework.boot.test.context.TestConfiguration;
10-
import org.springframework.context.annotation.Bean;
12+
import org.junit.jupiter.api.extension.ExtendWith;
13+
import org.mockito.InjectMocks;
14+
import org.mockito.Mock;
15+
import org.mockito.junit.jupiter.MockitoExtension;
1116
import org.springframework.messaging.simp.SimpMessagingTemplate;
17+
import org.springframework.data.domain.Page;
18+
import org.springframework.data.domain.PageImpl;
19+
import org.springframework.data.domain.PageRequest;
20+
import org.springframework.data.domain.Pageable;
1221

22+
import java.time.LocalDateTime;
1323
import java.util.List;
24+
import java.util.Arrays;
1425

15-
import static org.assertj.core.api.Assertions.assertThat;
26+
import static org.junit.jupiter.api.Assertions.assertEquals;
27+
import static org.junit.jupiter.api.Assertions.assertNotNull;
28+
import static org.mockito.ArgumentMatchers.any;
29+
import static org.mockito.ArgumentMatchers.anyString;
30+
import static org.mockito.ArgumentMatchers.eq;
31+
import static org.mockito.Mockito.when;
32+
import static org.mockito.Mockito.verify;
33+
import static org.mockito.Mockito.times;
1634

17-
@DataJpaTest
35+
/**
36+
* Unit tests for MessagingService
37+
*/
38+
@ExtendWith(MockitoExtension.class)
1839
class MessagingServiceTest {
19-
20-
/*
21-
* @Autowired
22-
* private MessageRepository repo;
23-
*
24-
* private MessagingService service;
25-
* private SimpMessagingTemplate template;
26-
*
27-
* @BeforeEach
28-
* void setup() {
29-
* template = org.mockito.Mockito.mock(SimpMessagingTemplate.class);
30-
* service = new MessagingService(repo, template);
31-
* }
32-
*
33-
* @Test
34-
* void sendAndRetrieveConversation() {
35-
* service.sendMessage("alice", "bob", "hi");
36-
* service.sendMessage("bob", "alice", "hello");
37-
*
38-
* List<MessageDto> msgs = service.getConversation("alice", "bob", 0,
39-
* 10).getContent();
40-
* assertThat(msgs).hasSize(2);
41-
* assertThat(msgs.get(0).content()).isEqualTo("hi");
42-
* assertThat(msgs.get(1).content()).isEqualTo("hello");
43-
* }
44-
*/
45-
40+
41+
@Mock
42+
private MessageRepository messageRepository;
43+
44+
@Mock
45+
private ContactRepository contactRepository;
46+
47+
@Mock
48+
private UserServiceClient userServiceClient;
49+
50+
@Mock
51+
private SimpMessagingTemplate messagingTemplate;
52+
53+
@InjectMocks
54+
private MessagingService messagingService;
55+
56+
@Test
57+
void sendMessage_ShouldSaveMessageAndSendWebSocketNotification() {
58+
// Given
59+
MessageEntity savedMessage = new MessageEntity("user1", "user2", "Hello World", LocalDateTime.now());
60+
when(messageRepository.save(any(MessageEntity.class))).thenReturn(savedMessage);
61+
62+
// When
63+
MessageDto result = messagingService.sendMessage("user1", "user2", "Hello World");
64+
65+
// Then
66+
assertNotNull(result);
67+
assertEquals("user1", result.fromUserId());
68+
assertEquals("user2", result.toUserId());
69+
assertEquals("Hello World", result.content());
70+
71+
verify(messageRepository).save(any(MessageEntity.class));
72+
verify(messagingTemplate).convertAndSend(eq("/topic/conversation.user1-user2"), any(MessageDto.class));
73+
}
74+
75+
@Test
76+
void getConversation_ShouldReturnPaginatedMessages() {
77+
// Given
78+
List<MessageEntity> messages = Arrays.asList(
79+
new MessageEntity("user1", "user2", "Hi", LocalDateTime.now().minusMinutes(2)),
80+
new MessageEntity("user2", "user1", "Hello", LocalDateTime.now().minusMinutes(1))
81+
);
82+
Page<MessageEntity> messagePage = new PageImpl<>(messages, PageRequest.of(0, 10), 2);
83+
84+
when(messageRepository.findConversation(eq("user1"), eq("user2"), any(Pageable.class)))
85+
.thenReturn(messagePage);
86+
87+
// When
88+
Page<MessageDto> result = messagingService.getConversation("user1", "user2", 0, 10);
89+
90+
// Then
91+
assertNotNull(result);
92+
assertEquals(2, result.getContent().size());
93+
assertEquals(2, result.getTotalElements());
94+
assertEquals("Hi", result.getContent().get(0).content());
95+
assertEquals("Hello", result.getContent().get(1).content());
96+
}
97+
98+
@Test
99+
void addContact_ShouldSaveContactAndReturnDto() {
100+
// Given
101+
when(contactRepository.existsByUserIdAndContactId("user1", "user2")).thenReturn(false);
102+
103+
// When
104+
ContactDto result = messagingService.addContact("user1", "user2");
105+
106+
// Then
107+
assertNotNull(result);
108+
assertEquals("user1", result.userId());
109+
assertEquals("user2", result.contactId());
110+
111+
verify(contactRepository, times(2)).save(any(ContactEntity.class));
112+
}
113+
114+
@Test
115+
void getContacts_ShouldReturnUserContacts() {
116+
// Given
117+
List<String> contactIds = Arrays.asList("user2", "user3");
118+
List<UserDTO> expectedUsers = Arrays.asList(
119+
new UserDTO("user2", "User Two", "", "", "", java.util.Map.of(), java.util.List.of()),
120+
new UserDTO("user3", "User Three", "", "", "", java.util.Map.of(), java.util.List.of())
121+
);
122+
123+
when(contactRepository.findContactIdsByUser("user1")).thenReturn(contactIds);
124+
when(userServiceClient.getUsers(contactIds)).thenReturn(expectedUsers);
125+
126+
// When
127+
List<UserDTO> result = messagingService.getContacts("user1");
128+
129+
// Then
130+
assertNotNull(result);
131+
assertEquals(2, result.size());
132+
assertEquals("user2", result.get(0).id());
133+
assertEquals("user3", result.get(1).id());
134+
}
46135
}

0 commit comments

Comments
 (0)