| | |
| | | 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; |
| | |
| | | private PlatformSettingsService platformSettingsService; |
| | | private GuideNotificationService notificationService; |
| | | private OrderRefundService orderRefundService; |
| | | private GuideOrderMatchingService matchingService; |
| | | private MiniTourOrderCommandService commandService; |
| | | |
| | | @BeforeEach |
| | |
| | | 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()); |
| | | verify(orderRefundService).requestRefund(order); |
| | | verify(notificationService).notifyVisitorCancelledOrder(order); |
| | | } |
| | | |
| | | private MiniOrderCreateRequest prepareCreateOrder() { |
| | | MiniUser visitor = new MiniUser(); |
| | | visitor.setId(7L); |
| | | visitor.setNickname("游客"); |
| | |
| | | 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); |
| | |
| | | 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; |
| | | } |
| | | } |