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; } }