From 31d14763aa3685ffdb0933badf4c378300ebc170 Mon Sep 17 00:00:00 2001 From: Yiseul Park Date: Thu, 21 Sep 2023 17:20:52 +0900 Subject: [PATCH] =?UTF-8?q?[HIMIN-229]=20test:=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/docs/OrderDocumentationTest.java | 100 ++++++++++++++++++ .../setup/response/OrderResponseBuilder.java | 28 +++++ 2 files changed, 128 insertions(+) create mode 100644 src/test/java/com/prgrms/himin/order/docs/OrderDocumentationTest.java create mode 100644 src/test/java/com/prgrms/himin/setup/response/OrderResponseBuilder.java diff --git a/src/test/java/com/prgrms/himin/order/docs/OrderDocumentationTest.java b/src/test/java/com/prgrms/himin/order/docs/OrderDocumentationTest.java new file mode 100644 index 0000000..efabc07 --- /dev/null +++ b/src/test/java/com/prgrms/himin/order/docs/OrderDocumentationTest.java @@ -0,0 +1,100 @@ +package com.prgrms.himin.order.docs; + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; +import static org.springframework.restdocs.payload.PayloadDocumentation.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +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.payload.JsonFieldType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.prgrms.himin.order.api.OrderController; +import com.prgrms.himin.order.application.OrderService; +import com.prgrms.himin.order.dto.request.OrderCreateRequest; +import com.prgrms.himin.order.dto.request.SelectedMenuOptionRequest; +import com.prgrms.himin.order.dto.request.SelectedMenuRequest; +import com.prgrms.himin.order.dto.response.OrderResponse; +import com.prgrms.himin.setup.request.OrderCreateRequestBuilder; +import com.prgrms.himin.setup.request.SelectedMenuRequestBuilder; +import com.prgrms.himin.setup.response.OrderResponseBuilder; + +@AutoConfigureRestDocs +@AutoConfigureMockMvc(addFilters = false) +@WebMvcTest(OrderController.class) +class OrderDocumentationTest { + + @Autowired + MockMvc mvc; + + @Autowired + ObjectMapper objectMapper; + + @MockBean + OrderService orderService; + + @Test + @DisplayName("주문을 생성할 수 있다.") + void createOrder() throws Exception { + // given + SelectedMenuOptionRequest selectedMenuOptionRequest = new SelectedMenuOptionRequest(1L, List.of(1L, 2L, 3L)); + SelectedMenuRequest selectedMenuRequest = SelectedMenuRequestBuilder + .successBuild(1L, List.of(selectedMenuOptionRequest)); + OrderCreateRequest request = OrderCreateRequestBuilder + .successBuild(1L, 1L, List.of(selectedMenuRequest)); + + OrderResponse response = OrderResponseBuilder.successBuild(); + + given(orderService.createOrder(any(OrderCreateRequest.class))).willReturn(response); + + // when + ResultActions resultAction = mvc.perform(post("/api/orders") + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(request)) + ); + + // then + resultAction.andExpect(status().isOk()) + .andDo(document("order-create", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + requestFields( + fieldWithPath("memberId").type(JsonFieldType.NUMBER).description("회원 ID"), + fieldWithPath("shopId").type(JsonFieldType.NUMBER).description("가게 ID"), + fieldWithPath("address").type(JsonFieldType.STRING).description("주소"), + fieldWithPath("requirement").type(JsonFieldType.STRING).description("요청사항"), + fieldWithPath("selectedMenus[].menuId").type(JsonFieldType.NUMBER).description("메뉴 ID"), + fieldWithPath("selectedMenus[].quantity").type(JsonFieldType.NUMBER).description("수량"), + fieldWithPath("selectedMenus[].selectedMenuOptions[].menuOptionGroupId") + .type(JsonFieldType.NUMBER).description("메뉴옵션그룹 ID"), + fieldWithPath("selectedMenus[].selectedMenuOptions[].selectedMenuOptions[]") + .type(JsonFieldType.ARRAY).description("메뉴옵션") + ), + responseFields( + fieldWithPath("orderId").type(JsonFieldType.NUMBER).description("주문 ID"), + fieldWithPath("memberId").type(JsonFieldType.NUMBER).description("회원 ID"), + fieldWithPath("shopId").type(JsonFieldType.NUMBER).description("가게 ID"), + fieldWithPath("address").type(JsonFieldType.STRING).description("주소"), + fieldWithPath("requirement").type(JsonFieldType.STRING).description("요청사항"), + fieldWithPath("selectedMenus[].menuId").type(JsonFieldType.NUMBER).description("메뉴 ID"), + fieldWithPath("selectedMenus[].quantity").type(JsonFieldType.NUMBER).description("수량"), + fieldWithPath("selectedMenus[].selectedOptionIds[]").type(JsonFieldType.ARRAY).description("메뉴옵션"), + fieldWithPath("price").type(JsonFieldType.NUMBER).description("가격") + ))); + } +} diff --git a/src/test/java/com/prgrms/himin/setup/response/OrderResponseBuilder.java b/src/test/java/com/prgrms/himin/setup/response/OrderResponseBuilder.java new file mode 100644 index 0000000..cd824d5 --- /dev/null +++ b/src/test/java/com/prgrms/himin/setup/response/OrderResponseBuilder.java @@ -0,0 +1,28 @@ +package com.prgrms.himin.setup.response; + +import java.util.List; + +import com.prgrms.himin.order.dto.response.OrderResponse; +import com.prgrms.himin.order.dto.response.SelectedMenuResponse; + +public class OrderResponseBuilder { + + public static OrderResponse successBuild() { + List selectedMenuResponses = getSelectedMenuResponses(); + + return new OrderResponse( + 1L, + 1L, + 1L, + "성동구 사근동", + "문앞에 두고 문자부탁드려요", + selectedMenuResponses, + 20000 + ); + } + + private static List getSelectedMenuResponses() { + SelectedMenuResponse selectedMenuResponse = new SelectedMenuResponse(1L, 5, List.of(1L, 2L, 3L)); + return List.of(selectedMenuResponse); + } +}