From 30970b89682a980f803b2a48967880ba3b63775e Mon Sep 17 00:00:00 2001 From: Jin Hyuk Date: Wed, 3 Jul 2024 14:52:24 +0900 Subject: [PATCH 1/5] =?UTF-8?q?test/#353:=20@Valid=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exceed/food/adapter/in/CreateFoodController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/BE/exceed/src/main/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodController.java b/BE/exceed/src/main/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodController.java index eb611e61..1766722e 100644 --- a/BE/exceed/src/main/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodController.java +++ b/BE/exceed/src/main/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodController.java @@ -18,6 +18,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import javax.validation.Valid; + @RestController @SecurityRequirement(name = "access-token") @RequiredArgsConstructor @@ -29,7 +31,7 @@ public class CreateFoodController { @PostMapping("/food") public ApiResponse> createFood( - @RequestBody CreateFoodRequest request, @AuthenticationMemberId Long memberId) { + @RequestBody @Valid CreateFoodRequest request, @AuthenticationMemberId Long memberId) { createFoodUseCase.execute(request, memberId); return ApiResponseGenerator.success(HttpStatus.OK); } From bce1e05bb6757e7f0ea406dfc6c8fa7d5a589657 Mon Sep 17 00:00:00 2001 From: Jin Hyuk Date: Thu, 4 Jul 2024 15:10:10 +0900 Subject: [PATCH 2/5] test/#353: CreateFoodRequest Valid test --- .../food/adapter/in/CreateFoodController.java | 4 +- .../food/CreateFoodIntegrationTest.java | 309 ++++++++++++++++++ .../food/CreateFoodIntegrationTestDTO.java | 46 --- 3 files changed, 311 insertions(+), 48 deletions(-) create mode 100644 BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTest.java delete mode 100644 BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTestDTO.java diff --git a/BE/exceed/src/main/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodController.java b/BE/exceed/src/main/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodController.java index 1766722e..480646e5 100644 --- a/BE/exceed/src/main/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodController.java +++ b/BE/exceed/src/main/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodController.java @@ -1,5 +1,7 @@ package com.gaebaljip.exceed.food.adapter.in; +import javax.validation.Valid; + import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -18,8 +20,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import javax.validation.Valid; - @RestController @SecurityRequirement(name = "access-token") @RequiredArgsConstructor diff --git a/BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTest.java b/BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTest.java new file mode 100644 index 00000000..40180e00 --- /dev/null +++ b/BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTest.java @@ -0,0 +1,309 @@ +package com.gaebaljip.exceed.food; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; +import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; +import org.springframework.test.web.servlet.ResultActions; + +import com.gaebaljip.exceed.common.IntegrationTest; +import com.gaebaljip.exceed.common.ValidationMessage; +import com.gaebaljip.exceed.common.WithMockUser; +import com.gaebaljip.exceed.dto.request.CreateFoodRequest; + +class CreateFoodIntegrationTest extends IntegrationTest { + + @Test + @DisplayName("음식 추가 : 성공") + @WithMockUser + void createFood() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + String responseBody = resultActions.andReturn().getResponse().getContentAsString(); + + // then + resultActions.andExpect(status().isOk()); + } + + @Test + @DisplayName("음식 추가 : 실패 - 이름이 없는 경우") + @WithMockUser + void createFoodFail() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("이름을 " + ValidationMessage.NOT_BLANK)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 칼로리가 없는 경우") + @WithMockUser + void createFoodFail2() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("칼로리를 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 탄수화물이 없는 경우") + @WithMockUser + void createFoodFail3() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("탄수화물을 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 식이섬유가 없는 경우") + @WithMockUser + void createFoodFail4() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("식이섬유를 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 지방이 없는 경우") + @WithMockUser + void createFoodFail5() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("지방을 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 단백질이 없는 경우") + @WithMockUser + void createFoodFail6() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("단백질을 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 1회 제공량이 없는 경우") + @WithMockUser + void createFoodFail7() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("1회 제공량을 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 당이 없는 경우") + @WithMockUser + void createFoodFail8() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("당을 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 나트륨이 없는 경우") + @WithMockUser + void createFoodFail9() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("나트륨을 " + ValidationMessage.NOT_NULL)); + } +} diff --git a/BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTestDTO.java b/BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTestDTO.java deleted file mode 100644 index 4ab02eb6..00000000 --- a/BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTestDTO.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.gaebaljip.exceed.food; - -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.http.MediaType; -import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; -import org.springframework.test.web.servlet.ResultActions; - -import com.gaebaljip.exceed.common.IntegrationTest; -import com.gaebaljip.exceed.common.WithMockUser; -import com.gaebaljip.exceed.dto.request.CreateFoodRequest; - -class CreateFoodIntegrationTestDTO extends IntegrationTest { - - @Test - @DisplayName("음식 추가 : 성공") - @WithMockUser - void createFood() throws Exception { - // given - CreateFoodRequest request = - CreateFoodRequest.builder() - .name("민초마라탕") - .calorie(1000.0) - .carbohydrate(100.0) - .dietaryFiber(10.0) - .fat(10.0) - .protein(10.0) - .servingSize(1.0) - .sodium(10.0) - .sugars(10.0) - .build(); - // when - ResultActions resultActions = - mockMvc.perform( - RestDocumentationRequestBuilders.post("/v1/food") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON)); - - String responseBody = resultActions.andReturn().getResponse().getContentAsString(); - - // then - resultActions.andExpect(status().isOk()); - } -} From 0cf0127adf61d0a751a220c330f24ada257bba0e Mon Sep 17 00:00:00 2001 From: Jin Hyuk Date: Thu, 4 Jul 2024 15:44:35 +0900 Subject: [PATCH 3/5] test/#353: LoginRequest Valid --- .../auth/AuthControllerIntegrationTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/BE/exceed/src/test/java/com/gaebaljip/exceed/auth/AuthControllerIntegrationTest.java b/BE/exceed/src/test/java/com/gaebaljip/exceed/auth/AuthControllerIntegrationTest.java index 0656a258..3e5c1640 100644 --- a/BE/exceed/src/test/java/com/gaebaljip/exceed/auth/AuthControllerIntegrationTest.java +++ b/BE/exceed/src/test/java/com/gaebaljip/exceed/auth/AuthControllerIntegrationTest.java @@ -9,6 +9,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import com.gaebaljip.exceed.common.IntegrationTest; +import com.gaebaljip.exceed.common.ValidationMessage; import com.gaebaljip.exceed.dto.request.LoginRequest; class AuthControllerIntegrationTest extends IntegrationTest { @@ -42,4 +43,20 @@ void login_fail() throws Exception { resultActions.andExpect(status().isBadRequest()); } + + @Test() + @DisplayName("로그인 실패 - 이메일 형식 안 맞을 때") + void login_fail2() throws Exception { + LoginRequest loginRequest = new LoginRequest("abcd1111gmail.com", "Abc@123"); + + ResultActions resultActions = + mockMvc.perform( + MockMvcRequestBuilders.post("/v1/auth/login") + .content(om.writeValueAsString(loginRequest)) + .contentType(MediaType.APPLICATION_JSON)); + + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value(ValidationMessage.INVALID_EMAIL)); + } } From 43da40630fe7a12d33b6d67a7822b14eb819abf6 Mon Sep 17 00:00:00 2001 From: Jin Hyuk Date: Thu, 4 Jul 2024 15:57:11 +0900 Subject: [PATCH 4/5] test/#353: OnBoardingRequest Valid --- .../adapter/in/OnBoardingControllerTest.java | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/BE/exceed/src/test/java/com/gaebaljip/exceed/member/adapter/in/OnBoardingControllerTest.java b/BE/exceed/src/test/java/com/gaebaljip/exceed/member/adapter/in/OnBoardingControllerTest.java index 68ab2423..db874eec 100644 --- a/BE/exceed/src/test/java/com/gaebaljip/exceed/member/adapter/in/OnBoardingControllerTest.java +++ b/BE/exceed/src/test/java/com/gaebaljip/exceed/member/adapter/in/OnBoardingControllerTest.java @@ -12,6 +12,7 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import com.gaebaljip.exceed.common.ControllerTest; +import com.gaebaljip.exceed.common.ValidationMessage; import com.gaebaljip.exceed.common.WithMockUser; import com.gaebaljip.exceed.dto.request.OnBoardingMemberRequest; import com.gaebaljip.exceed.member.application.OnBoardingMemberService; @@ -68,4 +69,100 @@ void onBoarding_invalidActivity() throws Exception { resultActions.andExpect(jsonPath("$.error.reason").value(invalidValue + "는 올바르지 않은 값입니다.")); resultActions.andDo(document("onBoarding-fail")); } + + @Test + @DisplayName("온보딩 실패 - 키가 null일 때") + @WithMockUser + void onBoarding_fail() throws Exception { + // given + + OnBoardingMemberRequest request = + new OnBoardingMemberRequest( + null, "MALE", 61.0, 65.0, 26, "NOT_ACTIVE", "뭐든 잘 먹습니다."); + + // when + + ResultActions resultActions = + mockMvc.perform( + MockMvcRequestBuilders.post("/v1/members/detail") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("키를 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("온보딩 실패 - 몸무게가 null일 때") + @WithMockUser + void onBoarding_fail2() throws Exception { + // given + + OnBoardingMemberRequest request = + new OnBoardingMemberRequest( + 171.0, "MALE", null, 65.0, 26, "NOT_ACTIVE", "뭐든 잘 먹습니다."); + + // when + + ResultActions resultActions = + mockMvc.perform( + MockMvcRequestBuilders.post("/v1/members/detail") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("몸무게를 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("온보딩 실패 - 목표 몸무게가 null일 때") + @WithMockUser + void onBoarding_fail3() throws Exception { + // given + + OnBoardingMemberRequest request = + new OnBoardingMemberRequest( + 171.0, "MALE", 61.0, null, 26, "NOT_ACTIVE", "뭐든 잘 먹습니다."); + + // when + + ResultActions resultActions = + mockMvc.perform( + MockMvcRequestBuilders.post("/v1/members/detail") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("목표 몸무게를 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("온보딩 실패 - 나이가 null일 때") + @WithMockUser + void onBoarding_fail4() throws Exception { + // given + + OnBoardingMemberRequest request = + new OnBoardingMemberRequest( + 171.0, "MALE", 61.0, 65.0, null, "NOT_ACTIVE", "뭐든 잘 먹습니다."); + + // when + + ResultActions resultActions = + mockMvc.perform( + MockMvcRequestBuilders.post("/v1/members/detail") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("나이를 " + ValidationMessage.NOT_NULL)); + } } From 3deef0b6b565c127dc0c992ac32001a652572189 Mon Sep 17 00:00:00 2001 From: Jin Hyuk Date: Sun, 7 Jul 2024 01:32:26 +0900 Subject: [PATCH 5/5] =?UTF-8?q?test/#353:=20DTO=20Validation=20test?= =?UTF-8?q?=EB=A5=BC=20Controller=20test=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/AuthControllerIntegrationTest.java | 31 -- .../auth/adapter/in/AuthControllerTest.java | 53 ++++ .../food/CreateFoodIntegrationTest.java | 263 ---------------- .../adapter/in/CreateFoodControllerTest.java | 284 ++++++++++++++++++ 4 files changed, 337 insertions(+), 294 deletions(-) create mode 100644 BE/exceed/src/test/java/com/gaebaljip/exceed/auth/adapter/in/AuthControllerTest.java create mode 100644 BE/exceed/src/test/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodControllerTest.java diff --git a/BE/exceed/src/test/java/com/gaebaljip/exceed/auth/AuthControllerIntegrationTest.java b/BE/exceed/src/test/java/com/gaebaljip/exceed/auth/AuthControllerIntegrationTest.java index 3e5c1640..73ecd1d5 100644 --- a/BE/exceed/src/test/java/com/gaebaljip/exceed/auth/AuthControllerIntegrationTest.java +++ b/BE/exceed/src/test/java/com/gaebaljip/exceed/auth/AuthControllerIntegrationTest.java @@ -9,7 +9,6 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import com.gaebaljip.exceed.common.IntegrationTest; -import com.gaebaljip.exceed.common.ValidationMessage; import com.gaebaljip.exceed.dto.request.LoginRequest; class AuthControllerIntegrationTest extends IntegrationTest { @@ -29,34 +28,4 @@ void login() throws Exception { resultActions.andExpect(header().exists("Authorization")); resultActions.andExpect(cookie().exists("refreshToken")); } - - @Test() - @DisplayName("로그인 실패 - 비밀번호 형식 안 맞을 때") - void login_fail() throws Exception { - LoginRequest loginRequest = new LoginRequest("abcd1111!@gmail.com", "abcd"); - - ResultActions resultActions = - mockMvc.perform( - MockMvcRequestBuilders.post("/v1/auth/login") - .content(om.writeValueAsString(loginRequest)) - .contentType(MediaType.APPLICATION_JSON)); - - resultActions.andExpect(status().isBadRequest()); - } - - @Test() - @DisplayName("로그인 실패 - 이메일 형식 안 맞을 때") - void login_fail2() throws Exception { - LoginRequest loginRequest = new LoginRequest("abcd1111gmail.com", "Abc@123"); - - ResultActions resultActions = - mockMvc.perform( - MockMvcRequestBuilders.post("/v1/auth/login") - .content(om.writeValueAsString(loginRequest)) - .contentType(MediaType.APPLICATION_JSON)); - - resultActions.andExpectAll( - status().isBadRequest(), - jsonPath("$.error.reason").value(ValidationMessage.INVALID_EMAIL)); - } } diff --git a/BE/exceed/src/test/java/com/gaebaljip/exceed/auth/adapter/in/AuthControllerTest.java b/BE/exceed/src/test/java/com/gaebaljip/exceed/auth/adapter/in/AuthControllerTest.java new file mode 100644 index 00000000..50e36a6d --- /dev/null +++ b/BE/exceed/src/test/java/com/gaebaljip/exceed/auth/adapter/in/AuthControllerTest.java @@ -0,0 +1,53 @@ +package com.gaebaljip.exceed.auth.adapter.in; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import com.gaebaljip.exceed.auth.adapter.AuthController; +import com.gaebaljip.exceed.auth.application.port.AuthService; +import com.gaebaljip.exceed.common.ControllerTest; +import com.gaebaljip.exceed.common.ValidationMessage; +import com.gaebaljip.exceed.dto.request.LoginRequest; + +@WebMvcTest(AuthController.class) +public class AuthControllerTest extends ControllerTest { + @MockBean private AuthService authService; + + @Test() + @DisplayName("로그인 실패 - 비밀번호 형식 안 맞을 때") + void login_fail() throws Exception { + LoginRequest loginRequest = new LoginRequest("abcd1111!@gmail.com", "abcd"); + + ResultActions resultActions = + mockMvc.perform( + MockMvcRequestBuilders.post("/v1/auth/login") + .content(om.writeValueAsString(loginRequest)) + .contentType(MediaType.APPLICATION_JSON)); + + resultActions.andExpect(status().isBadRequest()); + } + + @Test() + @DisplayName("로그인 실패 - 이메일 형식 안 맞을 때") + void login_fail2() throws Exception { + LoginRequest loginRequest = new LoginRequest("abcd1111gmail.com", "Abc@123"); + + ResultActions resultActions = + mockMvc.perform( + MockMvcRequestBuilders.post("/v1/auth/login") + .content(om.writeValueAsString(loginRequest)) + .contentType(MediaType.APPLICATION_JSON)); + + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value(ValidationMessage.INVALID_EMAIL)); + } +} diff --git a/BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTest.java b/BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTest.java index 40180e00..bee896df 100644 --- a/BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTest.java +++ b/BE/exceed/src/test/java/com/gaebaljip/exceed/food/CreateFoodIntegrationTest.java @@ -1,6 +1,5 @@ package com.gaebaljip.exceed.food; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.jupiter.api.DisplayName; @@ -10,7 +9,6 @@ import org.springframework.test.web.servlet.ResultActions; import com.gaebaljip.exceed.common.IntegrationTest; -import com.gaebaljip.exceed.common.ValidationMessage; import com.gaebaljip.exceed.common.WithMockUser; import com.gaebaljip.exceed.dto.request.CreateFoodRequest; @@ -45,265 +43,4 @@ void createFood() throws Exception { // then resultActions.andExpect(status().isOk()); } - - @Test - @DisplayName("음식 추가 : 실패 - 이름이 없는 경우") - @WithMockUser - void createFoodFail() throws Exception { - // given - CreateFoodRequest request = - CreateFoodRequest.builder() - .calorie(1000.0) - .carbohydrate(100.0) - .dietaryFiber(10.0) - .fat(10.0) - .protein(10.0) - .servingSize(1.0) - .sodium(10.0) - .sugars(10.0) - .build(); - // when - ResultActions resultActions = - mockMvc.perform( - RestDocumentationRequestBuilders.post("/v1/food") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON)); - - // then - resultActions.andExpectAll( - status().isBadRequest(), - jsonPath("$.error.reason").value("이름을 " + ValidationMessage.NOT_BLANK)); - } - - @Test - @DisplayName("음식 추가 : 실패 - 칼로리가 없는 경우") - @WithMockUser - void createFoodFail2() throws Exception { - // given - CreateFoodRequest request = - CreateFoodRequest.builder() - .name("민초마라탕") - .carbohydrate(100.0) - .dietaryFiber(10.0) - .fat(10.0) - .protein(10.0) - .servingSize(1.0) - .sodium(10.0) - .sugars(10.0) - .build(); - // when - ResultActions resultActions = - mockMvc.perform( - RestDocumentationRequestBuilders.post("/v1/food") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON)); - - // then - resultActions.andExpectAll( - status().isBadRequest(), - jsonPath("$.error.reason").value("칼로리를 " + ValidationMessage.NOT_NULL)); - } - - @Test - @DisplayName("음식 추가 : 실패 - 탄수화물이 없는 경우") - @WithMockUser - void createFoodFail3() throws Exception { - // given - CreateFoodRequest request = - CreateFoodRequest.builder() - .name("민초마라탕") - .calorie(1000.0) - .dietaryFiber(10.0) - .fat(10.0) - .protein(10.0) - .servingSize(1.0) - .sodium(10.0) - .sugars(10.0) - .build(); - // when - ResultActions resultActions = - mockMvc.perform( - RestDocumentationRequestBuilders.post("/v1/food") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON)); - - // then - resultActions.andExpectAll( - status().isBadRequest(), - jsonPath("$.error.reason").value("탄수화물을 " + ValidationMessage.NOT_NULL)); - } - - @Test - @DisplayName("음식 추가 : 실패 - 식이섬유가 없는 경우") - @WithMockUser - void createFoodFail4() throws Exception { - // given - CreateFoodRequest request = - CreateFoodRequest.builder() - .name("민초마라탕") - .calorie(1000.0) - .carbohydrate(100.0) - .fat(10.0) - .protein(10.0) - .servingSize(1.0) - .sodium(10.0) - .sugars(10.0) - .build(); - // when - ResultActions resultActions = - mockMvc.perform( - RestDocumentationRequestBuilders.post("/v1/food") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON)); - - // then - resultActions.andExpectAll( - status().isBadRequest(), - jsonPath("$.error.reason").value("식이섬유를 " + ValidationMessage.NOT_NULL)); - } - - @Test - @DisplayName("음식 추가 : 실패 - 지방이 없는 경우") - @WithMockUser - void createFoodFail5() throws Exception { - // given - CreateFoodRequest request = - CreateFoodRequest.builder() - .name("민초마라탕") - .calorie(1000.0) - .carbohydrate(100.0) - .dietaryFiber(10.0) - .protein(10.0) - .servingSize(1.0) - .sodium(10.0) - .sugars(10.0) - .build(); - // when - ResultActions resultActions = - mockMvc.perform( - RestDocumentationRequestBuilders.post("/v1/food") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON)); - - // then - resultActions.andExpectAll( - status().isBadRequest(), - jsonPath("$.error.reason").value("지방을 " + ValidationMessage.NOT_NULL)); - } - - @Test - @DisplayName("음식 추가 : 실패 - 단백질이 없는 경우") - @WithMockUser - void createFoodFail6() throws Exception { - // given - CreateFoodRequest request = - CreateFoodRequest.builder() - .name("민초마라탕") - .calorie(1000.0) - .carbohydrate(100.0) - .dietaryFiber(10.0) - .fat(10.0) - .servingSize(1.0) - .sodium(10.0) - .sugars(10.0) - .build(); - // when - ResultActions resultActions = - mockMvc.perform( - RestDocumentationRequestBuilders.post("/v1/food") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON)); - - // then - resultActions.andExpectAll( - status().isBadRequest(), - jsonPath("$.error.reason").value("단백질을 " + ValidationMessage.NOT_NULL)); - } - - @Test - @DisplayName("음식 추가 : 실패 - 1회 제공량이 없는 경우") - @WithMockUser - void createFoodFail7() throws Exception { - // given - CreateFoodRequest request = - CreateFoodRequest.builder() - .name("민초마라탕") - .calorie(1000.0) - .carbohydrate(100.0) - .dietaryFiber(10.0) - .fat(10.0) - .protein(10.0) - .sodium(10.0) - .sugars(10.0) - .build(); - // when - ResultActions resultActions = - mockMvc.perform( - RestDocumentationRequestBuilders.post("/v1/food") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON)); - - // then - resultActions.andExpectAll( - status().isBadRequest(), - jsonPath("$.error.reason").value("1회 제공량을 " + ValidationMessage.NOT_NULL)); - } - - @Test - @DisplayName("음식 추가 : 실패 - 당이 없는 경우") - @WithMockUser - void createFoodFail8() throws Exception { - // given - CreateFoodRequest request = - CreateFoodRequest.builder() - .name("민초마라탕") - .calorie(1000.0) - .carbohydrate(100.0) - .dietaryFiber(10.0) - .fat(10.0) - .protein(10.0) - .servingSize(1.0) - .sodium(10.0) - .build(); - // when - ResultActions resultActions = - mockMvc.perform( - RestDocumentationRequestBuilders.post("/v1/food") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON)); - - // then - resultActions.andExpectAll( - status().isBadRequest(), - jsonPath("$.error.reason").value("당을 " + ValidationMessage.NOT_NULL)); - } - - @Test - @DisplayName("음식 추가 : 실패 - 나트륨이 없는 경우") - @WithMockUser - void createFoodFail9() throws Exception { - // given - CreateFoodRequest request = - CreateFoodRequest.builder() - .name("민초마라탕") - .calorie(1000.0) - .carbohydrate(100.0) - .dietaryFiber(10.0) - .fat(10.0) - .protein(10.0) - .servingSize(1.0) - .sugars(10.0) - .build(); - // when - ResultActions resultActions = - mockMvc.perform( - RestDocumentationRequestBuilders.post("/v1/food") - .content(om.writeValueAsString(request)) - .contentType(MediaType.APPLICATION_JSON)); - - // then - resultActions.andExpectAll( - status().isBadRequest(), - jsonPath("$.error.reason").value("나트륨을 " + ValidationMessage.NOT_NULL)); - } } diff --git a/BE/exceed/src/test/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodControllerTest.java b/BE/exceed/src/test/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodControllerTest.java new file mode 100644 index 00000000..fe40ea5d --- /dev/null +++ b/BE/exceed/src/test/java/com/gaebaljip/exceed/food/adapter/in/CreateFoodControllerTest.java @@ -0,0 +1,284 @@ +package com.gaebaljip.exceed.food.adapter.in; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders; +import org.springframework.test.web.servlet.ResultActions; + +import com.gaebaljip.exceed.common.ControllerTest; +import com.gaebaljip.exceed.common.ValidationMessage; +import com.gaebaljip.exceed.common.WithMockUser; +import com.gaebaljip.exceed.dto.request.CreateFoodRequest; +import com.gaebaljip.exceed.food.application.CreateFoodService; + +@WebMvcTest(CreateFoodController.class) +public class CreateFoodControllerTest extends ControllerTest { + @MockBean private CreateFoodService createFoodService; + + @Test + @DisplayName("음식 추가 : 실패 - 이름이 없는 경우") + @WithMockUser + void createFoodFail() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("이름을 " + ValidationMessage.NOT_BLANK)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 칼로리가 없는 경우") + @WithMockUser + void createFoodFail2() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("칼로리를 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 탄수화물이 없는 경우") + @WithMockUser + void createFoodFail3() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("탄수화물을 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 식이섬유가 없는 경우") + @WithMockUser + void createFoodFail4() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("식이섬유를 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 지방이 없는 경우") + @WithMockUser + void createFoodFail5() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("지방을 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 단백질이 없는 경우") + @WithMockUser + void createFoodFail6() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .servingSize(1.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("단백질을 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 1회 제공량이 없는 경우") + @WithMockUser + void createFoodFail7() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .sodium(10.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("1회 제공량을 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 당이 없는 경우") + @WithMockUser + void createFoodFail8() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sodium(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("당을 " + ValidationMessage.NOT_NULL)); + } + + @Test + @DisplayName("음식 추가 : 실패 - 나트륨이 없는 경우") + @WithMockUser + void createFoodFail9() throws Exception { + // given + CreateFoodRequest request = + CreateFoodRequest.builder() + .name("민초마라탕") + .calorie(1000.0) + .carbohydrate(100.0) + .dietaryFiber(10.0) + .fat(10.0) + .protein(10.0) + .servingSize(1.0) + .sugars(10.0) + .build(); + // when + ResultActions resultActions = + mockMvc.perform( + RestDocumentationRequestBuilders.post("/v1/food") + .content(om.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON)); + + // then + resultActions.andExpectAll( + status().isBadRequest(), + jsonPath("$.error.reason").value("나트륨을 " + ValidationMessage.NOT_NULL)); + } +}