package com.tourguide.modules.order.service;
|
|
import com.tourguide.common.exception.BusinessException;
|
import com.tourguide.modules.order.domain.OrderStatus;
|
import com.tourguide.modules.order.domain.RefundStatus;
|
import com.tourguide.modules.order.entity.TourOrder;
|
import com.tourguide.modules.order.mapper.TourOrderMapper;
|
import com.tourguide.modules.review.mapper.OrderReviewMapper;
|
import com.tourguide.modules.system.service.GuideNotificationService;
|
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.Test;
|
|
import java.math.BigDecimal;
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.when;
|
|
class TourOrderServiceTest {
|
private TourOrderMapper orderMapper;
|
private TourOrderService orderService;
|
|
@BeforeEach
|
void setUp() {
|
orderMapper = mock(TourOrderMapper.class);
|
orderService = new TourOrderService(orderMapper, mock(OrderReviewMapper.class),
|
mock(GuideNotificationService.class));
|
}
|
|
@Test
|
void shouldRefundRequestedAmount() {
|
TourOrder order = refundableOrder();
|
when(orderMapper.selectForUpdate(1L)).thenReturn(order);
|
|
orderService.refund(1L, new BigDecimal("100.00"));
|
|
assertThat(order.getRefundAmount()).isEqualByComparingTo("100.00");
|
assertThat(order.getRefundStatus()).isEqualTo(RefundStatus.REFUNDED.getCode());
|
assertThat(order.getStatus()).isEqualTo(OrderStatus.REFUNDED.getCode());
|
verify(orderMapper).updateById(order);
|
}
|
|
@Test
|
void shouldRejectAmountGreaterThanPayment() {
|
TourOrder order = refundableOrder();
|
when(orderMapper.selectForUpdate(1L)).thenReturn(order);
|
|
assertThatThrownBy(() -> orderService.refund(1L, new BigDecimal("156.01")))
|
.isInstanceOf(BusinessException.class)
|
.hasMessage("退款金额不能超过当前可退金额");
|
}
|
|
private TourOrder refundableOrder() {
|
TourOrder order = new TourOrder();
|
order.setId(1L);
|
order.setOrderNo("123465");
|
order.setStatus(OrderStatus.COMPLETED.getCode());
|
order.setRefundStatus(RefundStatus.NONE.getCode());
|
order.setAmount(new BigDecimal("256.10"));
|
order.setPaymentAmount(new BigDecimal("156.00"));
|
order.setPaymentMethod("WECHAT");
|
return order;
|
}
|
}
|