Skip to content

Commit df6a531

Browse files
authored
Merge pull request #222 from Team-BC-1/test/buyBidProductController
구매 입찰 기능 테스트 코드 추가
2 parents ce34c21 + 08067b9 commit df6a531

File tree

5 files changed

+306
-0
lines changed

5 files changed

+306
-0
lines changed

src/main/java/bc1/gream/domain/buy/dto/response/BuyBidResponseDto.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package bc1.gream.domain.buy.dto.response;
22

3+
import lombok.Builder;
4+
5+
@Builder // 테스트용
36
public record BuyBidResponseDto(
47
Long price,
58
Long buyId
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package bc1.gream.domain.buy.controller;
2+
3+
import static org.mockito.ArgumentMatchers.any;
4+
import static org.mockito.BDDMockito.given;
5+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
6+
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
7+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
8+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
9+
10+
import bc1.gream.domain.buy.dto.request.BuyBidRequestDto;
11+
import bc1.gream.domain.buy.dto.response.BuyBidResponseDto;
12+
import bc1.gream.domain.buy.provider.BuyBidProvider;
13+
import bc1.gream.domain.order.validator.ProductValidator;
14+
import bc1.gream.domain.product.entity.Product;
15+
import bc1.gream.domain.user.entity.User;
16+
import bc1.gream.global.security.WithMockCustomUser;
17+
import bc1.gream.test.ProductTest;
18+
import bc1.gream.test.UserTest;
19+
import com.fasterxml.jackson.databind.ObjectMapper;
20+
import org.junit.jupiter.api.BeforeEach;
21+
import org.junit.jupiter.api.DisplayName;
22+
import org.junit.jupiter.api.Test;
23+
import org.springframework.beans.factory.annotation.Autowired;
24+
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
25+
import org.springframework.boot.test.mock.mockito.MockBean;
26+
import org.springframework.http.MediaType;
27+
import org.springframework.test.context.ActiveProfiles;
28+
import org.springframework.test.web.servlet.MockMvc;
29+
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
30+
import org.springframework.web.context.WebApplicationContext;
31+
32+
@WebMvcTest(controllers = BuyBidController.class)
33+
@WithMockCustomUser
34+
@ActiveProfiles("test")
35+
class BuyBidControllerTest implements UserTest, ProductTest {
36+
37+
@Autowired
38+
protected ObjectMapper objectMapper;
39+
@MockBean
40+
BuyBidProvider buyBidProvider;
41+
@MockBean
42+
ProductValidator productValidator;
43+
@Autowired
44+
private MockMvc mockMvc;
45+
@Autowired
46+
private WebApplicationContext context;
47+
48+
@BeforeEach
49+
void setUp() {
50+
this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
51+
.alwaysDo(print()).build();
52+
}
53+
54+
@Test
55+
@DisplayName("구매 입찰 컨트롤러의 기능 중 새로운 구매 입찰을 만드는 기능 성공 테스트")
56+
void 구매_입찰신청_성공_테스트() throws Exception {
57+
58+
// given
59+
BuyBidRequestDto requestDto = BuyBidRequestDto.builder()
60+
.price(4000L)
61+
.build();
62+
63+
String json = objectMapper.writeValueAsString(requestDto);
64+
65+
BuyBidResponseDto responseDto = BuyBidResponseDto.builder()
66+
.buyId(1L)
67+
.price(requestDto.price())
68+
.build();
69+
70+
Long productId = 1L;
71+
given(productValidator.validateBy(any(Long.class))).willReturn(TEST_PRODUCT);
72+
given(buyBidProvider.buyBidProduct(any(User.class), any(BuyBidRequestDto.class), any(Product.class))).willReturn(responseDto);
73+
74+
// when - then
75+
mockMvc.perform(post("/api/buy/{productId}", productId)
76+
.content(json)
77+
.contentType(MediaType.APPLICATION_JSON))
78+
.andExpectAll(
79+
status().isOk(),
80+
jsonPath("$.code").value(0),
81+
jsonPath("$.message").value("정상 처리 되었습니다"),
82+
jsonPath("$.data.buyId").value(1L)
83+
);
84+
}
85+
86+
@Test
87+
void buyCancelBid() {
88+
}
89+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package bc1.gream.domain.buy.provider;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.mockito.ArgumentMatchers.any;
5+
import static org.mockito.BDDMockito.given;
6+
import static org.mockito.Mockito.times;
7+
import static org.mockito.Mockito.verify;
8+
9+
import bc1.gream.domain.buy.dto.request.BuyBidRequestDto;
10+
import bc1.gream.domain.buy.dto.response.BuyBidResponseDto;
11+
import bc1.gream.domain.buy.entity.Buy;
12+
import bc1.gream.domain.buy.repository.BuyRepository;
13+
import bc1.gream.domain.buy.service.command.BuyCommandService;
14+
import bc1.gream.domain.buy.service.query.BuyQueryService;
15+
import bc1.gream.domain.coupon.entity.Coupon;
16+
import bc1.gream.domain.coupon.entity.CouponStatus;
17+
import bc1.gream.domain.coupon.service.command.CouponCommandService;
18+
import bc1.gream.domain.coupon.service.qeury.CouponQueryService;
19+
import bc1.gream.domain.user.entity.User;
20+
import bc1.gream.test.BuyTest;
21+
import bc1.gream.test.CouponTest;
22+
import bc1.gream.test.ProductTest;
23+
import bc1.gream.test.UserTest;
24+
import org.junit.jupiter.api.DisplayName;
25+
import org.junit.jupiter.api.Test;
26+
import org.junit.jupiter.api.extension.ExtendWith;
27+
import org.mockito.InjectMocks;
28+
import org.mockito.Mock;
29+
import org.mockito.junit.jupiter.MockitoExtension;
30+
31+
@ExtendWith(MockitoExtension.class)
32+
class BuyBidProviderTest implements CouponTest, UserTest, ProductTest, BuyTest {
33+
34+
@InjectMocks
35+
private BuyBidProvider buyBidProvider;
36+
@Mock
37+
private BuyRepository buyRepository;
38+
@Mock
39+
private BuyCommandService buyCommandService;
40+
@Mock
41+
private BuyQueryService buyQueryService;
42+
@Mock
43+
private CouponQueryService couponQueryService;
44+
@Mock
45+
private CouponCommandService couponCommandService;
46+
47+
@Test
48+
@DisplayName("구매입찰 Provider의 기능 중 상품 구매 입찰신청 기능 성공 테스트")
49+
void 상품_구매_입찰신청_성공_테스트() {
50+
51+
// given
52+
BuyBidRequestDto requestDto = BuyBidRequestDto.builder()
53+
.price(4000L)
54+
.couponId(1L)
55+
.period(7)
56+
.build();
57+
58+
given(couponQueryService.checkCoupon(requestDto.couponId(), TEST_BUYER, CouponStatus.AVAILABLE)).willReturn(TEST_COUPON_FIX);
59+
given(buyRepository.save(any(Buy.class))).willReturn(TEST_BUY);
60+
61+
// when
62+
BuyBidResponseDto responseDto = buyBidProvider.buyBidProduct(TEST_BUYER, requestDto, TEST_PRODUCT);
63+
64+
// then
65+
verify(couponCommandService, times(1)).changeCouponStatus(any(Coupon.class), any(CouponStatus.class));
66+
verify(buyQueryService, times(1)).userPointCheck(any(User.class), any(Long.class));
67+
assertThat(responseDto.price()).isEqualTo(TEST_BUY_PRICE);
68+
}
69+
70+
@Test
71+
void 상품_구매_입찰_추가_Provider_쿠폰_없을때_성공_테스트() {
72+
73+
// given
74+
BuyBidRequestDto requestDto = BuyBidRequestDto.builder()
75+
.price(4000L)
76+
.period(7)
77+
.build();
78+
79+
given(buyRepository.save(any(Buy.class))).willReturn(TEST_BUY);
80+
81+
// when
82+
BuyBidResponseDto responseDto = buyBidProvider.buyBidProduct(TEST_BUYER, requestDto, TEST_PRODUCT);
83+
84+
// then
85+
verify(buyQueryService, times(1)).userPointCheck(any(User.class), any(Long.class));
86+
assertThat(responseDto.price()).isEqualTo(TEST_BUY_PRICE);
87+
}
88+
89+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package bc1.gream.domain.buy.service.query;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
6+
import bc1.gream.domain.buy.repository.BuyRepository;
7+
import bc1.gream.global.common.ResultCase;
8+
import bc1.gream.global.exception.GlobalException;
9+
import bc1.gream.test.UserTest;
10+
import org.junit.jupiter.api.Test;
11+
import org.junit.jupiter.api.extension.ExtendWith;
12+
import org.mockito.InjectMocks;
13+
import org.mockito.Mock;
14+
import org.mockito.junit.jupiter.MockitoExtension;
15+
import org.springframework.test.util.ReflectionTestUtils;
16+
17+
@ExtendWith(MockitoExtension.class)
18+
class BuyQueryServiceTest implements UserTest {
19+
20+
@InjectMocks
21+
private BuyQueryService buyQueryService;
22+
@Mock
23+
private BuyRepository buyRepository;
24+
25+
@Test
26+
void findBuyById() {
27+
}
28+
29+
@Test
30+
void findAllBuyBidsOf() {
31+
}
32+
33+
@Test
34+
void getRecentBuyBidOf() {
35+
}
36+
37+
@Test
38+
void findAllBuyBidCoupon() {
39+
}
40+
41+
@Test
42+
void 유저의_포인트_체크하는_기능_성공_테스트() {
43+
44+
// given
45+
ReflectionTestUtils.setField(TEST_USER, "point", 10000L);
46+
47+
// when - then
48+
buyQueryService.userPointCheck(TEST_USER, 5000L);
49+
}
50+
51+
@Test
52+
void 유저의_포인트_체크하는_기능_실패_테스트() {
53+
54+
// given
55+
ReflectionTestUtils.setField(TEST_USER, "point", 3000L);
56+
57+
// when
58+
GlobalException exception = assertThrows(GlobalException.class, () -> {
59+
buyQueryService.userPointCheck(TEST_USER, 5000L);
60+
});
61+
62+
// then
63+
assertThat(exception.getResultCase()).isEqualTo(ResultCase.NOT_ENOUGH_POINT);
64+
assertThat(exception.getResultCase().getCode()).isEqualTo(1007);
65+
assertThat(exception.getResultCase().getMessage()).isEqualTo("유저의 포인트가 부족합니다");
66+
}
67+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package bc1.gream.domain.order.validator;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
import static org.mockito.ArgumentMatchers.any;
6+
import static org.mockito.BDDMockito.given;
7+
8+
import bc1.gream.domain.product.entity.Product;
9+
import bc1.gream.domain.product.repository.ProductRepository;
10+
import bc1.gream.global.exception.GlobalException;
11+
import bc1.gream.test.ProductTest;
12+
import java.util.Optional;
13+
import org.junit.jupiter.api.Test;
14+
import org.junit.jupiter.api.extension.ExtendWith;
15+
import org.mockito.InjectMocks;
16+
import org.mockito.Mock;
17+
import org.mockito.junit.jupiter.MockitoExtension;
18+
19+
@ExtendWith(MockitoExtension.class)
20+
class ProductValidatorTest implements ProductTest {
21+
22+
@InjectMocks
23+
private ProductValidator productValidator;
24+
@Mock
25+
private ProductRepository productRepository;
26+
27+
@Test
28+
void 상품_검증_성공_테스트() {
29+
30+
// given
31+
given(productRepository.findById(any(Long.class))).willReturn(Optional.of(TEST_PRODUCT));
32+
33+
// when
34+
Product product = productValidator.validateBy(TEST_PRODUCT_ID);
35+
36+
// then
37+
assertThat(product.getBrand()).isEqualTo(TEST_PRODUCT.getBrand());
38+
assertThat(product.getPrice()).isEqualTo(TEST_PRODUCT.getPrice());
39+
assertThat(product.getName()).isEqualTo(TEST_PRODUCT.getName());
40+
}
41+
42+
@Test
43+
void 상품_검증_실패_테스트() {
44+
45+
// given
46+
given(productRepository.findById(any())).willReturn(Optional.empty());
47+
48+
// when
49+
GlobalException exception = assertThrows(GlobalException.class, () -> {
50+
productValidator.validateBy(TEST_PRODUCT_ID);
51+
});
52+
// then
53+
assertThat(exception.getResultCase().getCode()).isEqualTo(2001);
54+
assertThat(exception.getResultCase().getMessage()).isEqualTo("해당 상품은 존재하지 않습니다.");
55+
56+
}
57+
58+
}

0 commit comments

Comments
 (0)