liujie
2026-09-09 39f6fca28e3f78abe48f08e474ec011abb990b36
backend/src/test/java/com/tourguide/modules/order/service/MiniTourOrderCommandServiceTest.java
@@ -6,8 +6,10 @@
import com.tourguide.modules.operation.mapper.OperationScenicSpotMapper;
import com.tourguide.modules.operation.mapper.ScenicMeetingPointMapper;
import com.tourguide.modules.operation.mapper.ScenicPricingMapper;
import com.tourguide.modules.operation.dto.PlatformSettingsResponse;
import com.tourguide.modules.operation.service.PlatformSettingsService;
import com.tourguide.modules.order.domain.OrderStatus;
import com.tourguide.modules.order.domain.PaymentMethod;
import com.tourguide.modules.order.dto.MiniOrderCreateRequest;
import com.tourguide.modules.order.dto.TourOrderResponse;
import com.tourguide.modules.order.entity.TourOrder;
@@ -42,6 +44,7 @@
    private PlatformSettingsService platformSettingsService;
    private GuideNotificationService notificationService;
    private OrderRefundService orderRefundService;
    private GuideOrderMatchingService matchingService;
    private MiniTourOrderCommandService commandService;
    @BeforeEach
@@ -55,13 +58,93 @@
        platformSettingsService = mock(PlatformSettingsService.class);
        notificationService = mock(GuideNotificationService.class);
        orderRefundService = mock(OrderRefundService.class);
        matchingService = mock(GuideOrderMatchingService.class);
        commandService = new MiniTourOrderCommandService(
                orderMapper, miniUserService, scenicSpotMapper, meetingPointMapper, pricingMapper,
                guideUserMapper, platformSettingsService, notificationService, orderRefundService);
                guideUserMapper, platformSettingsService, notificationService, orderRefundService,
                matchingService, false);
    }
    @Test
    void createShouldKeepOrderPendingPaymentUntilPaymentSucceeds() {
        MiniOrderCreateRequest request = prepareCreateOrder();
        TourOrderResponse response = commandService.create(7L, request);
        ArgumentCaptor<TourOrder> captor = ArgumentCaptor.forClass(TourOrder.class);
        verify(orderMapper).insert(captor.capture());
        TourOrder order = captor.getValue();
        assertThat(order.getStatus()).isEqualTo(OrderStatus.PENDING_PAYMENT.getCode());
        assertThat(order.getPaymentMethod()).isNull();
        assertThat(order.getPaymentOrderNo()).isNull();
        assertThat(order.getPaymentAmount()).isNull();
        assertThat(order.getPaymentTime()).isNull();
        assertThat(order.getSettlementDays()).isEqualTo(7);
        assertThat(response.getStatus()).isEqualTo(OrderStatus.PENDING_PAYMENT.getCode());
        verify(matchingService, never()).match(any());
    }
    @Test
    void createShouldRejectVisitorWithUnfinishedOrder() {
        MiniUser visitor = new MiniUser();
        visitor.setId(7L);
        when(miniUserService.findEnabledById(7L)).thenReturn(visitor);
        when(orderMapper.selectCount(any())).thenReturn(1L);
        assertThatThrownBy(() -> commandService.create(7L, new MiniOrderCreateRequest()))
                .isInstanceOf(com.tourguide.common.exception.BusinessException.class)
                .hasMessage("您有一个未完成的订单,请先完成或取消后再下单");
        verify(orderMapper, never()).insert(any(TourOrder.class));
    }
    @Test
    void createShouldMarkOrderPaidAndStartMatchingWhenPaymentIsSkipped() {
        MiniOrderCreateRequest request = prepareCreateOrder();
        commandService = new MiniTourOrderCommandService(
                orderMapper, miniUserService, scenicSpotMapper, meetingPointMapper, pricingMapper,
                guideUserMapper, platformSettingsService, notificationService, orderRefundService,
                matchingService, true);
        TourOrderResponse response = commandService.create(7L, request);
        ArgumentCaptor<TourOrder> captor = ArgumentCaptor.forClass(TourOrder.class);
        verify(orderMapper).insert(captor.capture());
        TourOrder order = captor.getValue();
        assertThat(order.getStatus()).isEqualTo(OrderStatus.PENDING_ACCEPT.getCode());
        assertThat(order.getPaymentMethod()).isEqualTo(PaymentMethod.TEMPORARY_BYPASS.getCode());
        assertThat(order.getPaymentOrderNo()).startsWith("TEMPMJ");
        assertThat(order.getPaymentAmount()).isEqualByComparingTo("144.00");
        assertThat(order.getPaymentTime()).isNotNull();
        assertThat(response.getStatus()).isEqualTo(OrderStatus.PENDING_ACCEPT.getCode());
        verify(matchingService).match(99L);
    }
    @Test
    void cancelPendingMeetingOrderShouldNotifyAssignedGuide() {
        MiniUser visitor = new MiniUser();
        visitor.setId(7L);
        when(miniUserService.findEnabledById(7L)).thenReturn(visitor);
        TourOrder order = new TourOrder();
        order.setId(99L);
        order.setOrderNo("MJ202607300001");
        order.setVisitorId(7L);
        order.setGuideId(8L);
        order.setStatus(OrderStatus.PENDING_MEETING.getCode());
        order.setPaymentTime(LocalDateTime.now());
        order.setPaymentAmount(new BigDecimal("36.00"));
        when(orderMapper.selectForUpdate(99L)).thenReturn(order);
        commandService.cancel(7L, 99L);
        assertThat(order.getStatus()).isEqualTo(OrderStatus.CANCELLED.getCode());
        assertThat(order.getCancelledAt()).isNotNull();
        verify(orderRefundService).requestRefund(order);
        verify(notificationService).notifyVisitorCancelledOrder(order);
    }
    private MiniOrderCreateRequest prepareCreateOrder() {
        MiniUser visitor = new MiniUser();
        visitor.setId(7L);
        visitor.setNickname("游客");
@@ -89,6 +172,9 @@
        pricing.setDiscountPrice(new BigDecimal("36.00"));
        pricing.setMaxParticipants(10);
        when(pricingMapper.selectOne(any())).thenReturn(pricing);
        PlatformSettingsResponse settings = new PlatformSettingsResponse();
        settings.setSettlementDays(7);
        when(platformSettingsService.getSettings()).thenReturn(settings);
        doAnswer(invocation -> {
            TourOrder order = invocation.getArgument(0);
            order.setId(99L);
@@ -100,54 +186,6 @@
        request.setMeetingPointId(12L);
        request.setServicePackageId(13L);
        request.setPeopleCount(4);
        TourOrderResponse response = commandService.create(7L, request);
        ArgumentCaptor<TourOrder> captor = ArgumentCaptor.forClass(TourOrder.class);
        verify(orderMapper).insert(captor.capture());
        TourOrder order = captor.getValue();
        assertThat(order.getStatus()).isEqualTo(OrderStatus.PENDING_PAYMENT.getCode());
        assertThat(order.getPaymentMethod()).isNull();
        assertThat(order.getPaymentOrderNo()).isNull();
        assertThat(order.getPaymentAmount()).isNull();
        assertThat(order.getPaymentTime()).isNull();
        assertThat(response.getStatus()).isEqualTo(OrderStatus.PENDING_PAYMENT.getCode());
    }
    @Test
    void createShouldRejectVisitorWithUnfinishedOrder() {
        MiniUser visitor = new MiniUser();
        visitor.setId(7L);
        when(miniUserService.findEnabledById(7L)).thenReturn(visitor);
        when(orderMapper.selectCount(any())).thenReturn(1L);
        assertThatThrownBy(() -> commandService.create(7L, new MiniOrderCreateRequest()))
                .isInstanceOf(com.tourguide.common.exception.BusinessException.class)
                .hasMessage("您有一个未完成的订单,请先完成或取消后再下单");
        verify(orderMapper, never()).insert(any(TourOrder.class));
    }
    @Test
    void cancelPendingMeetingOrderShouldNotifyAssignedGuide() {
        MiniUser visitor = new MiniUser();
        visitor.setId(7L);
        when(miniUserService.findEnabledById(7L)).thenReturn(visitor);
        TourOrder order = new TourOrder();
        order.setId(99L);
        order.setOrderNo("MJ202607300001");
        order.setVisitorId(7L);
        order.setGuideId(8L);
        order.setStatus(OrderStatus.PENDING_MEETING.getCode());
        order.setPaymentTime(LocalDateTime.now());
        order.setPaymentAmount(new BigDecimal("36.00"));
        when(orderMapper.selectForUpdate(99L)).thenReturn(order);
        commandService.cancel(7L, 99L);
        assertThat(order.getStatus()).isEqualTo(OrderStatus.CANCELLED.getCode());
        verify(orderRefundService).requestRefund(order);
        verify(notificationService).notifyVisitorCancelledOrder(order);
        return request;
    }
}