Skip to content

Commit 010b116

Browse files
Add integration tests and fix build
1 parent d358d75 commit 010b116

File tree

7 files changed

+319
-0
lines changed

7 files changed

+319
-0
lines changed

pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@
4848
<artifactId>spring-boot-starter-test</artifactId>
4949
<scope>test</scope>
5050
</dependency>
51+
<dependency>
52+
<groupId>org.testcontainers</groupId>
53+
<artifactId>junit-jupiter</artifactId>
54+
<version>1.19.7</version>
55+
<scope>test</scope>
56+
</dependency>
57+
<dependency>
58+
<groupId>org.testcontainers</groupId>
59+
<artifactId>postgresql</artifactId>
60+
<version>1.19.7</version>
61+
<scope>test</scope>
62+
</dependency>
5163
</dependencies>
5264
<build>
5365
<plugins>

src/main/java/myuserservice/mapper/UserMapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public static UserDto toDto(User user) {
1313
.id(user.getId())
1414
.name(user.getName())
1515
.email(user.getEmail())
16+
.age(user.getAge())
1617
.build();
1718
}
1819

src/test/java/myuserservice/controller/UserControllerTest.java

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package myuserservice.controller;
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import jakarta.persistence.EntityNotFoundException;
45
import myuserservice.dto.UserDto;
56
import myuserservice.service.UserService;
67
import org.junit.jupiter.api.Test;
@@ -9,9 +10,17 @@
910
import org.springframework.boot.test.context.TestConfiguration;
1011
import org.springframework.context.annotation.Bean;
1112
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.dao.DataIntegrityViolationException;
1214
import org.springframework.test.web.servlet.MockMvc;
15+
import org.springframework.http.MediaType;
1316

17+
import java.util.List;
18+
19+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
1420
import static org.mockito.ArgumentMatchers.any;
21+
import static org.mockito.ArgumentMatchers.eq;
22+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
23+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
1524
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
1625
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
1726

@@ -61,4 +70,92 @@ void testCreateUser() throws Exception {
6170
.andExpect(jsonPath("$.email").value("[email protected]"))
6271
.andExpect(jsonPath("$.age").value(25));
6372
}
73+
74+
@Test
75+
void testGetAllUsers() throws Exception {
76+
List<UserDto> users = List.of(
77+
UserDto.builder().id(1L).name("Alice").email("[email protected]").age(25).build(),
78+
UserDto.builder().id(2L).name("Bob").email("[email protected]").age(30).build()
79+
);
80+
81+
Mockito.when(userService.getAllUsers()).thenReturn(users);
82+
83+
mockMvc.perform(get("/api/users"))
84+
.andExpect(status().isOk())
85+
.andExpect(jsonPath("$.length()").value(2))
86+
.andExpect(jsonPath("$[0].name").value("Alice"))
87+
.andExpect(jsonPath("$[1].name").value("Bob"));
88+
}
89+
90+
@Test
91+
void testGetUserById() throws Exception {
92+
UserDto user = UserDto.builder().id(1L).name("Alice").email("[email protected]").age(25).build();
93+
94+
Mockito.when(userService.getUser(1L)).thenReturn(user);
95+
96+
mockMvc.perform(get("/api/users/1"))
97+
.andExpect(status().isOk())
98+
.andExpect(jsonPath("$.name").value("Alice"))
99+
.andExpect(jsonPath("$.email").value("[email protected]"));
100+
}
101+
102+
@Test
103+
void testUpdateUser() throws Exception {
104+
UserDto updated = UserDto.builder()
105+
.id(1L)
106+
.name("Updated")
107+
108+
.age(28)
109+
.build();
110+
111+
Mockito.when(userService.updateUser(eq(1L), any(UserDto.class))).thenReturn(updated);
112+
113+
mockMvc.perform(put("/api/users/1")
114+
.contentType(MediaType.APPLICATION_JSON)
115+
.content(objectMapper.writeValueAsString(updated)))
116+
.andExpect(status().isOk())
117+
.andExpect(jsonPath("$.name").value("Updated"))
118+
.andExpect(jsonPath("$.age").value(28));
119+
}
120+
121+
@Test
122+
void testDeleteUser() throws Exception {
123+
mockMvc.perform(delete("/api/users/1"))
124+
.andExpect(status().isOk());
125+
126+
Mockito.verify(userService).deleteUser(1L);
127+
}
128+
129+
@Test
130+
void testCreateUser_invalidName() throws Exception {
131+
UserDto invalidDto = UserDto.builder().name("A").email("[email protected]").age(20).build();
132+
133+
mockMvc.perform(post("/api/users")
134+
.contentType("application/json")
135+
.content(objectMapper.writeValueAsString(invalidDto)))
136+
.andExpect(status().isBadRequest());
137+
}
138+
139+
@Test
140+
void testGetUser_notFound() throws Exception {
141+
Mockito.when(userService.getUser(100L)).thenThrow(new EntityNotFoundException("User not found"));
142+
143+
mockMvc.perform(get("/api/users/100"))
144+
.andExpect(status().isNotFound())
145+
.andExpect(content().string("User not found"));
146+
}
147+
148+
@Test
149+
void testCreateUser_duplicateEmail() throws Exception {
150+
UserDto user = UserDto.builder().name("Alice").email("[email protected]").age(25).build();
151+
152+
Mockito.when(userService.createUser(any(UserDto.class)))
153+
.thenThrow(new DataIntegrityViolationException("Email already exists"));
154+
155+
mockMvc.perform(post("/api/users")
156+
.contentType("application/json")
157+
.content(objectMapper.writeValueAsString(user)))
158+
.andExpect(status().isBadRequest())
159+
.andExpect(content().string("Email already exists"));
160+
}
64161
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package myuserservice.integration;
2+
3+
import myuserservice.dto.UserDto;
4+
import myuserservice.repository.UserRepository;
5+
import org.junit.jupiter.api.Test;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.boot.test.context.SpringBootTest;
8+
import org.springframework.test.context.ActiveProfiles;
9+
10+
import static org.assertj.core.api.Assertions.assertThat;
11+
12+
@SpringBootTest
13+
@ActiveProfiles("test")
14+
class UserServiceIntegrationTest {
15+
16+
@Autowired
17+
private UserRepository userRepository;
18+
19+
@Test
20+
void testSaveUser() {
21+
var user = myuserservice.entity.User.builder()
22+
.name("Zoe")
23+
24+
.age(30)
25+
.build();
26+
27+
var saved = userRepository.save(user);
28+
29+
assertThat(saved.getId()).isNotNull();
30+
assertThat(saved.getEmail()).isEqualTo("[email protected]");
31+
}
32+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package myuserservice.mapper;
2+
3+
import org.junit.jupiter.api.Test;
4+
import myuserservice.dto.UserDto;
5+
import myuserservice.entity.User;
6+
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
class UserMapperTest {
11+
12+
@Test
13+
void toDto_shouldReturnNullWhenUserIsNull() {
14+
UserDto result = UserMapper.toDto(null);
15+
assertThat(result).isNull();
16+
}
17+
18+
@Test
19+
void toEntity_shouldReturnNullWhenDtoIsNull() {
20+
User result = UserMapper.toEntity(null);
21+
assertThat(result).isNull();
22+
}
23+
24+
@Test
25+
void toDto_shouldMapFieldsCorrectly() {
26+
User user = User.builder()
27+
.id(1L)
28+
.name("Alice")
29+
30+
.age(30)
31+
.build();
32+
33+
UserDto dto = UserMapper.toDto(user);
34+
35+
assertThat(dto).isNotNull();
36+
assertThat(dto.getId()).isEqualTo(1L);
37+
assertThat(dto.getName()).isEqualTo("Alice");
38+
assertThat(dto.getEmail()).isEqualTo("[email protected]");
39+
assertThat(dto.getAge()).isEqualTo(30);
40+
}
41+
42+
43+
@Test
44+
void toEntity_shouldMapFieldsCorrectly() {
45+
UserDto dto = UserDto.builder()
46+
.id(1L)
47+
.name("Alice")
48+
49+
.age(30)
50+
.build();
51+
52+
User user = UserMapper.toEntity(dto);
53+
54+
assertThat(user).isNotNull();
55+
assertThat(user.getId()).isEqualTo(1L);
56+
assertThat(user.getName()).isEqualTo("Alice");
57+
assertThat(user.getEmail()).isEqualTo("[email protected]");
58+
assertThat(user.getAge()).isEqualTo(30);
59+
}
60+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package myuserservice.service;
2+
3+
import myuserservice.dto.UserDto;
4+
import myuserservice.entity.User;
5+
import myuserservice.repository.UserRepository;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.Test;
8+
import org.mockito.InjectMocks;
9+
import org.mockito.Mock;
10+
import org.mockito.MockitoAnnotations;
11+
import java.util.List;
12+
import java.util.Optional;
13+
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
import static org.junit.jupiter.api.Assertions.assertThrows;
16+
import static org.mockito.Mockito.*;
17+
18+
class UserServiceImplTest {
19+
@Mock
20+
private UserRepository userRepository;
21+
22+
@InjectMocks
23+
private UserServiceImpl userService;
24+
25+
private User user;
26+
private UserDto userDto;
27+
28+
@BeforeEach
29+
void setUp() {
30+
MockitoAnnotations.openMocks(this);
31+
32+
user = User.builder()
33+
.id(1L)
34+
.name("Alice")
35+
36+
.age(25)
37+
.build();
38+
39+
userDto = UserDto.builder()
40+
.id(1L)
41+
.name("Alice")
42+
43+
.age(25)
44+
.build();
45+
}
46+
47+
@Test
48+
void createUser_shouldReturnCreatedUser() {
49+
when(userRepository.save(any(User.class))).thenReturn(user);
50+
51+
UserDto result = userService.createUser(userDto);
52+
53+
assertThat(result).isNotNull();
54+
assertThat(result.getEmail()).isEqualTo("[email protected]");
55+
verify(userRepository, times(1)).save(any(User.class));
56+
}
57+
58+
@Test
59+
void getUser_shouldReturnUser() {
60+
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
61+
62+
UserDto result = userService.getUser(1L);
63+
64+
assertThat(result).isNotNull();
65+
assertThat(result.getId()).isEqualTo(1L);
66+
verify(userRepository, times(1)).findById(1L);
67+
}
68+
69+
@Test
70+
void getUser_shouldThrowIfNotFound() {
71+
when(userRepository.findById(1L)).thenReturn(Optional.empty());
72+
73+
assertThrows(RuntimeException.class, () -> userService.getUser(1L));
74+
}
75+
76+
@Test
77+
void getAllUsers_shouldReturnList() {
78+
when(userRepository.findAll()).thenReturn(List.of(user));
79+
80+
List<UserDto> users = userService.getAllUsers();
81+
82+
assertThat(users).hasSize(1);
83+
assertThat(users.get(0).getEmail()).isEqualTo("[email protected]");
84+
}
85+
86+
@Test
87+
void updateUser_shouldUpdateSuccessfully() {
88+
User updated = User.builder()
89+
.id(1L)
90+
.name("Updated")
91+
92+
.age(30)
93+
.build();
94+
95+
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
96+
when(userRepository.save(any(User.class))).thenReturn(updated);
97+
98+
UserDto result = userService.updateUser(1L, userDto);
99+
100+
assertThat(result.getName()).isEqualTo("Updated");
101+
}
102+
103+
@Test
104+
void deleteUser_shouldDelete() {
105+
when(userRepository.existsById(1L)).thenReturn(true);
106+
107+
userService.deleteUser(1L);
108+
109+
verify(userRepository, times(1)).deleteById(1L);
110+
}
111+
}
112+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
spring.jpa.hibernate.ddl-auto=update
2+
spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver
3+
spring.datasource.url=jdbc:tc:postgresql:15://localhost/test
4+
spring.datasource.username=postgres
5+
spring.datasource.password=postgres

0 commit comments

Comments
 (0)