Added unit tests for UserController

This commit is contained in:
Marco Cetica 2024-01-15 09:35:20 +01:00
parent a577b29eec
commit 34c359bb76
Signed by: marco
GPG Key ID: 45060A949E90D0FD
6 changed files with 77 additions and 11 deletions

View File

@ -40,6 +40,11 @@
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.security</groupId> <groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId> <artifactId>spring-security-test</artifactId>

View File

@ -19,7 +19,7 @@ public class JsonEmitter<T> {
} }
public String emitJsonKey() { public String emitJsonKey() {
String jsonString = ""; String jsonString;
try { try {
jsonString = objectMapper.writeValueAsString(this.entity); jsonString = objectMapper.writeValueAsString(this.entity);
@ -31,7 +31,7 @@ public class JsonEmitter<T> {
} }
public String emitJsonKey(String key) { public String emitJsonKey(String key) {
String jsonString = ""; String jsonString;
try { try {
var jsonNode = objectMapper.createObjectNode().put(key, this.entity.toString()); var jsonNode = objectMapper.createObjectNode().put(key, this.entity.toString());

View File

@ -48,4 +48,8 @@ public class User {
public void setPassword(String password) { this.password = password; } public void setPassword(String password) { this.password = password; }
public void setId(String id) { this.id = id; } public void setId(String id) { this.id = id; }
public void setUsername(String username) { this.username = username; }
public void setEmail(String email) { this.email = email; }
} }

View File

@ -40,7 +40,7 @@ public class UserController {
* @param user the new user * @param user the new user
* @return on success, the userId, on failure the error message * @return on success, the userId, on failure the error message
*/ */
@PostMapping("/users") @PostMapping("/users/new")
public ResponseEntity<String> submitUser(@Valid @RequestBody User user) { public ResponseEntity<String> submitUser(@Valid @RequestBody User user) {
var res = userService.addNewUser(user) var res = userService.addNewUser(user)
.map(userId -> new JsonEmitter<>(userId).emitJsonKey("user_id")) .map(userId -> new JsonEmitter<>(userId).emitJsonKey("user_id"))
@ -59,7 +59,7 @@ public class UserController {
* @param user the email and the password of the user * @param user the email and the password of the user
* @return on failure, the error message * @return on failure, the error message
*/ */
@DeleteMapping("/users") @DeleteMapping("/users/delete")
public ResponseEntity<String> deleteUser(@RequestBody User user) { public ResponseEntity<String> deleteUser(@RequestBody User user) {
// Check if email and password are specified // Check if email and password are specified
if(user.getPassword() == null || user.getEmail() == null) { if(user.getPassword() == null || user.getEmail() == null) {

View File

@ -4,8 +4,13 @@ spring.jpa.properties.hibernate.format_sql=true
# Adjust these values in production # Adjust these values in production
server.port=3000 server.port=3000
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/bits #spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/bits
spring.datasource.username=postgres #spring.datasource.username=postgres
spring.datasource.password=toor #spring.datasource.password=toor
spring.security.user.name=admin #spring.security.user.name=admin
spring.security.user.password=admin #spring.security.user.password=admin
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password

View File

@ -1,13 +1,65 @@
package com.ceticamarco.bits; package com.ceticamarco.bits;
import com.ceticamarco.bits.user.User;
import com.ceticamarco.bits.user.UserService;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.vavr.control.Either;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import java.util.Optional;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
@SpringBootTest @SpringBootTest
class BitsApplicationTests { @AutoConfigureMockMvc
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@MockBean
private UserService userService;
@Test @Test
void contextLoads() { public void addNewUser() throws Exception {
var user = new User();
user.setUsername("john");
user.setEmail("john@example.com");
user.setPassword("qwerty");
when(userService.addNewUser(any(User.class))).thenReturn(Either.right("userId123"));
mockMvc.perform(MockMvcRequestBuilders.post("/users/new")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(user)))
.andExpect(MockMvcResultMatchers.status().isOk());
Mockito.verify(userService, Mockito.times(1)).addNewUser(any(User.class));
} }
@Test
public void deleteExistingUser() throws Exception {
var user = new User();
user.setEmail("john@example.com");
user.setPassword("qwerty");
when(userService.deleteUser(any(User.class))).thenReturn(Optional.empty());
mockMvc.perform(MockMvcRequestBuilders.delete("/users/delete")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(user)))
.andExpect(MockMvcResultMatchers.status().isOk());
Mockito.verify(userService, Mockito.times(1)).deleteUser(any(User.class));
}
} }