diff --git a/topic8/samples/spring-rest-sample/src/main/java/kma/topic8/springrestsample/dto/LoginResponseDto.java b/topic8/samples/spring-rest-sample/src/main/java/kma/topic8/springrestsample/dto/LoginResponseDto.java index 95f8ec9..453aa2a 100644 --- a/topic8/samples/spring-rest-sample/src/main/java/kma/topic8/springrestsample/dto/LoginResponseDto.java +++ b/topic8/samples/spring-rest-sample/src/main/java/kma/topic8/springrestsample/dto/LoginResponseDto.java @@ -10,6 +10,6 @@ public class LoginResponseDto { private final String login; - private final String message; + private final String successMessage; } diff --git a/topic8/samples/spring-rest-sample/src/test/java/kma/topic8/springrestsample/LoginControllerIT.java b/topic8/samples/spring-rest-sample/src/test/java/kma/topic8/springrestsample/LoginControllerIT.java new file mode 100644 index 0000000..7324969 --- /dev/null +++ b/topic8/samples/spring-rest-sample/src/test/java/kma/topic8/springrestsample/LoginControllerIT.java @@ -0,0 +1,45 @@ +package kma.topic8.springrestsample; + +import org.hamcrest.CoreMatchers; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.http.HttpHeaders; +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 io.restassured.RestAssured; +import io.restassured.http.ContentType; +import kma.topic8.springrestsample.dto.LoginResponseDto; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class LoginControllerIT { + + @LocalServerPort + void initTest(int port) { + RestAssured.port = port; + } + + @Test + void shouldSendRequest() { + RestAssured + .given() + .contentType(ContentType.JSON) + .content(LoginControllerIT.class.getResourceAsStream("/request.json")) + .queryParam("requiredField", "test1") + .when() + .post("/login") + .then() + .statusCode(200) + .body("login", CoreMatchers.is("myLogin")) + .body("successMessage", CoreMatchers.is("success")); + } + +} diff --git a/topic8/samples/spring-rest-sample/src/test/java/kma/topic8/springrestsample/LoginControllerTest.java b/topic8/samples/spring-rest-sample/src/test/java/kma/topic8/springrestsample/LoginControllerTest.java new file mode 100644 index 0000000..2e76178 --- /dev/null +++ b/topic8/samples/spring-rest-sample/src/test/java/kma/topic8/springrestsample/LoginControllerTest.java @@ -0,0 +1,61 @@ +package kma.topic8.springrestsample; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpHeaders; +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 kma.topic8.springrestsample.dto.LoginResponseDto; + +@WebMvcTest(LoginController.class) +class LoginControllerTest { + + @Autowired + private MockMvc mockMvc; + @MockBean + private UserService userService; + + @Test + void shouldSendRequest() throws Exception { + String expectedResponse = new String(LoginControllerTest.class.getResourceAsStream("/expectedResponse.json").readAllBytes()); + + Mockito.when(userService.doLogin(ArgumentMatchers.any())) + .thenReturn(LoginResponseDto.of("myLogin", "success message")); + + mockMvc.perform( + MockMvcRequestBuilders.post("/login") + .contentType(MediaType.APPLICATION_JSON) + .content(LoginControllerTest.class.getResourceAsStream("/request.json").readAllBytes()) + .queryParam("requiredField", "awegweg") + ) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.header().string(HttpHeaders.AUTHORIZATION, "generated-jwt-token")) + .andExpect(MockMvcResultMatchers.content().json(expectedResponse)); + + Mockito.verify(userService).doLogin(ArgumentMatchers.any()); + } + + @Test + void shouldHandleMissingParam() throws Exception { + mockMvc.perform( + MockMvcRequestBuilders.post("/login") + .contentType(MediaType.APPLICATION_JSON) + .content(LoginControllerTest.class.getResourceAsStream("/request.json").readAllBytes()) + ) + .andExpect(MockMvcResultMatchers.status().isBadRequest()) + .andExpect(MockMvcResultMatchers.header().doesNotExist(HttpHeaders.AUTHORIZATION)) + .andExpect(MockMvcResultMatchers.content().string("Required String parameter 'requiredField' is not present")); + + Mockito.verifyNoInteractions(userService); + } + +} diff --git a/topic8/samples/spring-rest-sample/src/test/resources/expectedResponse.json b/topic8/samples/spring-rest-sample/src/test/resources/expectedResponse.json new file mode 100644 index 0000000..eda7b52 --- /dev/null +++ b/topic8/samples/spring-rest-sample/src/test/resources/expectedResponse.json @@ -0,0 +1,4 @@ +{ + "login": "myLogin", + "successMessage": "success message" +} diff --git a/topic8/samples/spring-rest-sample/src/test/resources/request.json b/topic8/samples/spring-rest-sample/src/test/resources/request.json new file mode 100644 index 0000000..75c5e55 --- /dev/null +++ b/topic8/samples/spring-rest-sample/src/test/resources/request.json @@ -0,0 +1,4 @@ +{ + "login": "myLogin", + "password": "myPassword" +}