package com.tourguide.modules.order.service; import com.tourguide.modules.operation.service.PlatformSettingsService; import com.tourguide.modules.order.domain.OrderStatus; import com.tourguide.modules.order.entity.TourOrder; import com.tourguide.modules.order.mapper.TourOrderMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.math.BigDecimal; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class OrderAutoRefundServiceTest { private TourOrderMapper orderMapper; private OrderRefundService orderRefundService; private OrderAutoRefundService autoRefundService; @BeforeEach void setUp() { orderMapper = mock(TourOrderMapper.class); orderRefundService = mock(OrderRefundService.class); autoRefundService = new OrderAutoRefundService( orderMapper, mock(PlatformSettingsService.class), orderRefundService); } @Test void shouldRequestRefundAfterClaimingOrder() { TourOrder order = paidCancelledOrder(); when(orderMapper.claimUnacceptedOrderForRefund(9L)).thenReturn(1); when(orderMapper.selectById(9L)).thenReturn(order); autoRefundService.refundIfStillUnaccepted(9L); verify(orderRefundService).requestRefund(order); } @Test void shouldSkipRefundWhenOrderWasAlreadyAccepted() { when(orderMapper.claimUnacceptedOrderForRefund(9L)).thenReturn(0); autoRefundService.refundIfStillUnaccepted(9L); verify(orderMapper, never()).selectById(9L); verify(orderRefundService, never()).requestRefund(org.mockito.ArgumentMatchers.any()); } private TourOrder paidCancelledOrder() { TourOrder order = new TourOrder(); order.setId(9L); order.setOrderNo("MJ202607290009"); order.setStatus(OrderStatus.CANCELLED.getCode()); order.setPaymentMethod("WECHAT"); order.setPaymentOrderNo("PY202608031700000000000000000001"); order.setAmount(new BigDecimal("40.00")); order.setPaymentAmount(new BigDecimal("36.00")); return order; } }