From 747c76a3c58f2dc27956c2ed6275c873833156d1 Mon Sep 17 00:00:00 2001 From: minjung Date: Wed, 29 Nov 2023 17:49:15 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Feat:=20cart=20controller=20test=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cart/controller/CartControllerTest.java | 106 ++++++++++++++++++ .../domain/cart/dummy/DummyCart.java | 20 ++++ 2 files changed, 126 insertions(+) create mode 100644 src/test/java/ybe/mini/travelserver/domain/cart/controller/CartControllerTest.java create mode 100644 src/test/java/ybe/mini/travelserver/domain/cart/dummy/DummyCart.java diff --git a/src/test/java/ybe/mini/travelserver/domain/cart/controller/CartControllerTest.java b/src/test/java/ybe/mini/travelserver/domain/cart/controller/CartControllerTest.java new file mode 100644 index 0000000..1f1b689 --- /dev/null +++ b/src/test/java/ybe/mini/travelserver/domain/cart/controller/CartControllerTest.java @@ -0,0 +1,106 @@ +package ybe.mini.travelserver.domain.cart.controller; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.HttpStatus; +import ybe.mini.travelserver.domain.cart.dto.request.CartCreateRequest; +import ybe.mini.travelserver.domain.cart.dto.response.CartCreateResponse; +import ybe.mini.travelserver.domain.cart.dto.response.CartDeleteResponse; +import ybe.mini.travelserver.domain.cart.dto.response.CartGetResponse; +import ybe.mini.travelserver.domain.cart.dummy.DummyCart; +import ybe.mini.travelserver.domain.cart.service.CartService; +import ybe.mini.travelserver.domain.member.dummy.DummyPrincipal; +import ybe.mini.travelserver.global.common.ResponseDto; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.then; +import static ybe.mini.travelserver.domain.accommodation.entity.AreaCode.SEOUL; + +@ExtendWith(MockitoExtension.class) +class CartControllerTest implements DummyPrincipal, DummyCart { + + @Mock + private CartService cartService; + + @InjectMocks + private CartController cartController; + + @DisplayName("장바구니를 조회") + @Test + void getCart() { + // given + CartGetResponse cartGetResponse = + CartGetResponse.fromEntity(dummyCart(), dummyRoom(dummyAccommodation()), dummyAccommodation()); + CartGetResponse cartGetResponse1 = + CartGetResponse.fromEntity(dummyCart(), dummyRoom(dummyAccommodation()), dummyAccommodation()); + List cartGetResponseList = + List.of(cartGetResponse, cartGetResponse1); + given(cartService.getMyCarts(anyLong())).willReturn(cartGetResponseList); + + // when + ResponseDto> responseDto = + cartController.getAllCart(dummyPrincipalDetails()); + + // then + assertEquals(HttpStatus.OK.value(), responseDto.status()); + assertEquals(responseDto.data(), cartGetResponseList); + then(cartService).should().getMyCarts(anyLong()); + } + + @DisplayName("장바구니를 생성") + @Test + void createCart() { + // given + CartCreateRequest cartCreateRequest = + CartCreateRequest.builder() + .accommodationId(142785L) + .guestNumber(1) + .keyword("가락관광호텔") + .areaCode(SEOUL) + .checkIn("20241120") + .checkOut("20241123") + .roomTypeId(11430L) + .build(); + CartCreateResponse cartCreateResponse = new CartCreateResponse(1L); + + given(cartService.createCart(anyLong(), any())) + .willReturn(cartCreateResponse); + + // when + ResponseDto responseDto = + cartController.createCart(dummyPrincipalDetails(), cartCreateRequest); + + // then + assertEquals(HttpStatus.CREATED.value(), responseDto.status()); + assertEquals(responseDto.data(), cartCreateResponse); + then(cartService).should().createCart(anyLong(), any()); + + } + + @DisplayName("장바구니를 삭제") + @Test + void deleteCart() { + // given + Long cartId = 1L; + CartDeleteResponse cartDeleteResponse = new CartDeleteResponse(1L); + given(cartService.deleteCart(anyLong())).willReturn(cartDeleteResponse); + + // when + ResponseDto responseDto = + cartController.deleteCart(dummyPrincipalDetails(), cartId); + + // then + assertEquals(HttpStatus.OK.value(), responseDto.status()); + assertEquals(responseDto.data(), cartDeleteResponse); + then(cartService).should().deleteCart(anyLong()); + } + +} \ No newline at end of file diff --git a/src/test/java/ybe/mini/travelserver/domain/cart/dummy/DummyCart.java b/src/test/java/ybe/mini/travelserver/domain/cart/dummy/DummyCart.java new file mode 100644 index 0000000..c8aa847 --- /dev/null +++ b/src/test/java/ybe/mini/travelserver/domain/cart/dummy/DummyCart.java @@ -0,0 +1,20 @@ +package ybe.mini.travelserver.domain.cart.dummy; + +import ybe.mini.travelserver.domain.cart.entity.Cart; +import ybe.mini.travelserver.domain.member.dummy.DummyMember; +import ybe.mini.travelserver.domain.room.DummyObjectForRoom; + +import java.time.LocalDate; + +public interface DummyCart extends DummyMember, DummyObjectForRoom { + default Cart dummyCart() { + return Cart.builder() + .id(1L) + .member(dummyMember()) + .checkIn(LocalDate.of(2023, 12, 29)) + .checkOut(LocalDate.of(2023, 12, 30)) + .room(dummyRoom(dummyAccommodation())) + .guestNumber(2) + .build(); + } +} From 62632aec8e1fa224e8f2c3a95f8927b63355c0d9 Mon Sep 17 00:00:00 2001 From: minjung Date: Wed, 29 Nov 2023 20:52:53 +0900 Subject: [PATCH 2/2] =?UTF-8?q?Feat:=20cart=20service=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/cart/service/CartService.java | 1 + .../cart/controller/CartControllerTest.java | 9 +- .../domain/cart/dummy/DummyCart.java | 1 + .../domain/cart/service/CartServiceTest.java | 119 ++++++++++++++++++ .../domain/room/DummyObjectForRoom.java | 1 + 5 files changed, 127 insertions(+), 4 deletions(-) diff --git a/src/main/java/ybe/mini/travelserver/domain/cart/service/CartService.java b/src/main/java/ybe/mini/travelserver/domain/cart/service/CartService.java index 7f89ec9..fb61813 100644 --- a/src/main/java/ybe/mini/travelserver/domain/cart/service/CartService.java +++ b/src/main/java/ybe/mini/travelserver/domain/cart/service/CartService.java @@ -50,6 +50,7 @@ public CartCreateResponse createCart(Long userId, CartCreateRequest cartCreateRe return new CartCreateResponse(createdCart.getId()); } + // TODO @Transactional(readOnly = true) public List getMyCarts(Long userId) { return cartRepository.findALLByMemberId(userId).stream() diff --git a/src/test/java/ybe/mini/travelserver/domain/cart/controller/CartControllerTest.java b/src/test/java/ybe/mini/travelserver/domain/cart/controller/CartControllerTest.java index 1f1b689..ce9682d 100644 --- a/src/test/java/ybe/mini/travelserver/domain/cart/controller/CartControllerTest.java +++ b/src/test/java/ybe/mini/travelserver/domain/cart/controller/CartControllerTest.java @@ -19,7 +19,8 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; import static ybe.mini.travelserver.domain.accommodation.entity.AreaCode.SEOUL; @@ -33,8 +34,8 @@ class CartControllerTest implements DummyPrincipal, DummyCart { @InjectMocks private CartController cartController; - @DisplayName("장바구니를 조회") @Test + @DisplayName("장바구니 조회") void getCart() { // given CartGetResponse cartGetResponse = @@ -55,8 +56,8 @@ void getCart() { then(cartService).should().getMyCarts(anyLong()); } - @DisplayName("장바구니를 생성") @Test + @DisplayName("장바구니 생성") void createCart() { // given CartCreateRequest cartCreateRequest = @@ -85,8 +86,8 @@ void createCart() { } - @DisplayName("장바구니를 삭제") @Test + @DisplayName("장바구니 삭제") void deleteCart() { // given Long cartId = 1L; diff --git a/src/test/java/ybe/mini/travelserver/domain/cart/dummy/DummyCart.java b/src/test/java/ybe/mini/travelserver/domain/cart/dummy/DummyCart.java index c8aa847..a86ad2a 100644 --- a/src/test/java/ybe/mini/travelserver/domain/cart/dummy/DummyCart.java +++ b/src/test/java/ybe/mini/travelserver/domain/cart/dummy/DummyCart.java @@ -17,4 +17,5 @@ default Cart dummyCart() { .guestNumber(2) .build(); } + } diff --git a/src/test/java/ybe/mini/travelserver/domain/cart/service/CartServiceTest.java b/src/test/java/ybe/mini/travelserver/domain/cart/service/CartServiceTest.java index e69de29..b7e25d1 100644 --- a/src/test/java/ybe/mini/travelserver/domain/cart/service/CartServiceTest.java +++ b/src/test/java/ybe/mini/travelserver/domain/cart/service/CartServiceTest.java @@ -0,0 +1,119 @@ +package ybe.mini.travelserver.domain.cart.service; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import ybe.mini.travelserver.domain.accommodation.repository.AccommodationRepository; +import ybe.mini.travelserver.domain.cart.dto.request.CartCreateRequest; +import ybe.mini.travelserver.domain.cart.dto.response.CartCreateResponse; +import ybe.mini.travelserver.domain.cart.dto.response.CartGetResponse; +import ybe.mini.travelserver.domain.cart.dummy.DummyCart; +import ybe.mini.travelserver.domain.cart.entity.Cart; +import ybe.mini.travelserver.domain.cart.repository.CartRepository; +import ybe.mini.travelserver.domain.member.dummy.DummyPrincipal; +import ybe.mini.travelserver.domain.member.repository.MemberRepository; +import ybe.mini.travelserver.domain.room.repository.RoomRepository; +import ybe.mini.travelserver.global.api.TourAPIService; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.then; +import static ybe.mini.travelserver.domain.accommodation.entity.AreaCode.SEOUL; + +@ExtendWith(MockitoExtension.class) +class CartServiceTest implements DummyPrincipal, DummyCart { + @InjectMocks + CartService cartService; + + @Mock + MemberRepository memberRepository; + + @Mock + CartRepository cartRepository; + + @Mock + RoomRepository roomRepository; + + @Mock + AccommodationRepository accommodationRepository; + + @Mock + TourAPIService tourAPIService; + + @Test + @DisplayName("장바구니 생성") + void createCart_success(){ + // given + CartCreateRequest cartCreateRequest = + CartCreateRequest.builder() + .accommodationId(dummyAccommodation().getId()) + .guestNumber(1) + .keyword("가락관광호텔") + .areaCode(SEOUL) + .checkIn("20241120") + .checkOut("20241123") + .roomTypeId(dummyRoom(dummyAccommodation()).getRoomTypeId()) + .build(); + CartCreateResponse cartCreateResponse = new CartCreateResponse(1L); + + given(tourAPIService.bringAccommodation(any(), any())).willReturn(dummyAccommodation()); + given(tourAPIService.bringRoom(anyLong(), anyLong())).willReturn(dummyRoom(dummyAccommodation())); + given(roomRepository.findByRoomTypeId(any())).willReturn(Optional.ofNullable(dummyRoom(dummyAccommodation()))); + given(accommodationRepository.findById(any())).willReturn(Optional.ofNullable(dummyAccommodation())); + given(memberRepository.findById(any())).willReturn(Optional.ofNullable(dummyMember())); + given(cartRepository.save(any(Cart.class))).willReturn(dummyCart()); + + + // when + CartCreateResponse response = + cartService.createCart(dummyMember().getId(), cartCreateRequest); + + // then + assertEquals(response, cartCreateResponse); + + } + + @Test + @DisplayName("장바구니 조회") + void getMyCarts_success() { + // given + List cartList = Arrays.asList(dummyCart(), dummyCart()); + List cartGetResponseList = cartList.stream() + .map((Cart cart) -> CartGetResponse.fromEntity( + cart, cart.getRoom(), cart.getRoom().getAccommodation()) + ).toList(); + + given(cartRepository.findALLByMemberId(anyLong())).willReturn(cartList); + + // when + List response = cartService.getMyCarts(dummyCart().getId()); + + // then + assertEquals(cartGetResponseList, response); + then(cartRepository).should().findALLByMemberId(dummyCart().getId()); + + } + + @Test + @DisplayName("장바구니 삭제") + void deleteCart_success() { + // given + given(cartRepository.findById(anyLong())).willReturn(Optional.ofNullable(dummyCart())); + + // when + Long actual = cartService.deleteCart(dummyCart().getId()).id(); + + // then + Long expected = dummyCart().getId(); + assertEquals(actual, expected); + } +} \ No newline at end of file diff --git a/src/test/java/ybe/mini/travelserver/domain/room/DummyObjectForRoom.java b/src/test/java/ybe/mini/travelserver/domain/room/DummyObjectForRoom.java index 5fd5f77..a87ff0c 100644 --- a/src/test/java/ybe/mini/travelserver/domain/room/DummyObjectForRoom.java +++ b/src/test/java/ybe/mini/travelserver/domain/room/DummyObjectForRoom.java @@ -35,6 +35,7 @@ default Room dummyRoom2(Accommodation accommodation) { default Accommodation dummyAccommodation() { return Accommodation.builder() + .id(1L) .name("세인트존스 호텔") .location(Location.builder() .address("강원특별자치도 강릉시 창해로 307 ")