Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE/TEST] DTO Validation test #358

Merged
merged 6 commits into from
Jul 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -29,7 +31,7 @@ public class CreateFoodController {

@PostMapping("/food")
public ApiResponse<CustomBody<Void>> createFood(
@RequestBody CreateFoodRequest request, @AuthenticationMemberId Long memberId) {
@RequestBody @Valid CreateFoodRequest request, @AuthenticationMemberId Long memberId) {
createFoodUseCase.execute(request, memberId);
return ApiResponseGenerator.success(HttpStatus.OK);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +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());
}
}
Original file line number Diff line number Diff line change
@@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import com.gaebaljip.exceed.common.WithMockUser;
import com.gaebaljip.exceed.dto.request.CreateFoodRequest;

class CreateFoodIntegrationTestDTO extends IntegrationTest {
class CreateFoodIntegrationTest extends IntegrationTest {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DTO Validation Testκ°€ λͺ©μ μ΄λ©΄, Controller κ³„μΈ΅λ§Œ ν…ŒμŠ€νŠΈν•˜λŠ” 건 μ–΄λ–€κ°€μš”?
λ§Œμ•½ κ·Έλ ‡λ‹€λ©΄, ControllerTest 클래슀λ₯Ό μƒμ†λ°›μœΌλ©΄ 쒋을 것 κ°™μ•„μš”.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그게 μ’‹κ² λ„€μš”


@Test
@DisplayName("μŒμ‹ μΆ”κ°€ : 성곡")
Expand Down
Original file line number Diff line number Diff line change
@@ -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));
}
}
Loading
Loading