From 34c359bb76075a09d01dcc813990a700baaf821c Mon Sep 17 00:00:00 2001 From: Marco Cetica Date: Mon, 15 Jan 2024 09:35:20 +0100 Subject: [PATCH] Added unit tests for UserController --- pom.xml | 5 ++ .../ceticamarco/bits/json/JsonEmitter.java | 4 +- .../java/com/ceticamarco/bits/user/User.java | 4 ++ .../ceticamarco/bits/user/UserController.java | 4 +- src/main/resources/application.properties | 15 +++-- .../bits/BitsApplicationTests.java | 56 ++++++++++++++++++- 6 files changed, 77 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 8b1fcbc..d84642f 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,11 @@ spring-boot-starter-test test + + com.h2database + h2 + test + org.springframework.security spring-security-test diff --git a/src/main/java/com/ceticamarco/bits/json/JsonEmitter.java b/src/main/java/com/ceticamarco/bits/json/JsonEmitter.java index 73eef69..a0ccb99 100644 --- a/src/main/java/com/ceticamarco/bits/json/JsonEmitter.java +++ b/src/main/java/com/ceticamarco/bits/json/JsonEmitter.java @@ -19,7 +19,7 @@ public class JsonEmitter { } public String emitJsonKey() { - String jsonString = ""; + String jsonString; try { jsonString = objectMapper.writeValueAsString(this.entity); @@ -31,7 +31,7 @@ public class JsonEmitter { } public String emitJsonKey(String key) { - String jsonString = ""; + String jsonString; try { var jsonNode = objectMapper.createObjectNode().put(key, this.entity.toString()); diff --git a/src/main/java/com/ceticamarco/bits/user/User.java b/src/main/java/com/ceticamarco/bits/user/User.java index b3502b5..eb8cbb3 100644 --- a/src/main/java/com/ceticamarco/bits/user/User.java +++ b/src/main/java/com/ceticamarco/bits/user/User.java @@ -48,4 +48,8 @@ public class User { public void setPassword(String password) { this.password = password; } public void setId(String id) { this.id = id; } + + public void setUsername(String username) { this.username = username; } + + public void setEmail(String email) { this.email = email; } } diff --git a/src/main/java/com/ceticamarco/bits/user/UserController.java b/src/main/java/com/ceticamarco/bits/user/UserController.java index b871dcb..80fae3a 100644 --- a/src/main/java/com/ceticamarco/bits/user/UserController.java +++ b/src/main/java/com/ceticamarco/bits/user/UserController.java @@ -40,7 +40,7 @@ public class UserController { * @param user the new user * @return on success, the userId, on failure the error message */ - @PostMapping("/users") + @PostMapping("/users/new") public ResponseEntity submitUser(@Valid @RequestBody User user) { var res = userService.addNewUser(user) .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 * @return on failure, the error message */ - @DeleteMapping("/users") + @DeleteMapping("/users/delete") public ResponseEntity deleteUser(@RequestBody User user) { // Check if email and password are specified if(user.getPassword() == null || user.getEmail() == null) { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d4b4a27..473a212 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,8 +4,13 @@ spring.jpa.properties.hibernate.format_sql=true # Adjust these values in production server.port=3000 -spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/bits -spring.datasource.username=postgres -spring.datasource.password=toor -spring.security.user.name=admin -spring.security.user.password=admin \ No newline at end of file +#spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/bits +#spring.datasource.username=postgres +#spring.datasource.password=toor +#spring.security.user.name=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 \ No newline at end of file diff --git a/src/test/java/com/ceticamarco/bits/BitsApplicationTests.java b/src/test/java/com/ceticamarco/bits/BitsApplicationTests.java index 4cfbe0b..cbdda20 100644 --- a/src/test/java/com/ceticamarco/bits/BitsApplicationTests.java +++ b/src/test/java/com/ceticamarco/bits/BitsApplicationTests.java @@ -1,13 +1,65 @@ 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.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.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 -class BitsApplicationTests { +@AutoConfigureMockMvc +class UserControllerTest { + @Autowired + private MockMvc mockMvc; + @Autowired + private ObjectMapper objectMapper; + @MockBean + private UserService userService; @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)); + } }