package com.tourguide.modules.order.service; import com.tourguide.common.exception.BusinessException; import com.tourguide.modules.order.domain.OrderStatus; import com.tourguide.modules.order.dto.GuideOrderResponse; import com.tourguide.modules.order.entity.TourOrder; import com.tourguide.modules.order.mapper.TourOrderMapper; import com.tourguide.modules.user.entity.GuideReceivingSession; import com.tourguide.modules.user.mapper.GuideRealtimeStatusMapper; import com.tourguide.modules.user.mapper.GuideReceivingSessionMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; 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 GuideTourOrderServiceTest { private TourOrderMapper orderMapper; private GuideReceivingSessionMapper sessionMapper; private GuideRealtimeStatusMapper realtimeStatusMapper; private GuideTourOrderService service; @BeforeEach void setUp() { orderMapper = mock(TourOrderMapper.class); sessionMapper = mock(GuideReceivingSessionMapper.class); realtimeStatusMapper = mock(GuideRealtimeStatusMapper.class); service = new GuideTourOrderService(orderMapper, sessionMapper, realtimeStatusMapper); } @Test void shouldStartAllOrdersInReceivingSession() { TourOrder order = order(OrderStatus.PENDING_MEETING); GuideReceivingSession session = session("ASSIGNED"); when(orderMapper.selectOne(any())).thenReturn(order); when(sessionMapper.selectForUpdate(20L, 8L)).thenReturn(session); when(sessionMapper.startSession(20L, 8L)).thenReturn(1); when(orderMapper.startSessionOrders(eq(20L), any())).thenReturn(2); GuideOrderResponse response = service.start(8L, 10L); assertThat(response.getStatus()).isEqualTo("serving"); assertThat(response.getLectureStartTime()).isNotNull(); assertThat(order.getArrivedAt()).isNotNull(); verify(realtimeStatusMapper).disableReceiving(8L); } @Test void shouldTreatRepeatedStartAsSuccess() { TourOrder order = order(OrderStatus.IN_SERVICE); when(orderMapper.selectOne(any())).thenReturn(order); GuideOrderResponse response = service.start(8L, 10L); assertThat(response.getStatus()).isEqualTo("serving"); verify(sessionMapper, never()).selectForUpdate(any(), any()); } @Test void shouldRejectOrderOutsidePendingMeetingState() { TourOrder order = order(OrderStatus.COMPLETED); when(orderMapper.selectOne(any())).thenReturn(order); assertThatThrownBy(() -> service.start(8L, 10L)) .isInstanceOf(BusinessException.class) .hasMessage("当前订单不能开始讲解"); } private TourOrder order(OrderStatus status) { TourOrder order = new TourOrder(); order.setId(10L); order.setGuideId(8L); order.setReceivingSessionId(20L); order.setStatus(status.getCode()); order.setPeopleCount(2); return order; } private GuideReceivingSession session(String status) { GuideReceivingSession session = new GuideReceivingSession(); session.setId(20L); session.setGuideId(8L); session.setStatus(status); return session; } }