liujie
2026-09-11 4f6f15b818704079ff2e4e4719b798f48d68a335
backend/src/test/java/com/tourguide/modules/review/service/OrderReviewServiceTest.java
@@ -4,11 +4,18 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.builder.MapperBuilderAssistant;
import com.tourguide.modules.order.mapper.TourOrderMapper;
import com.tourguide.modules.order.domain.OrderStatus;
import com.tourguide.modules.order.entity.TourOrder;
import com.tourguide.modules.review.dto.OrderReviewCreateRequest;
import com.tourguide.modules.review.dto.GuideRatingItemResponse;
import com.tourguide.modules.review.dto.GuideRatingResponse;
import com.tourguide.modules.review.entity.OrderReview;
import com.tourguide.modules.review.mapper.OrderReviewMapper;
import com.tourguide.modules.review.dto.OrderReviewResponse;
import com.tourguide.modules.system.service.GuideNotificationService;
import com.tourguide.modules.user.entity.GuideUser;
import com.tourguide.modules.user.mapper.GuideUserMapper;
import com.tourguide.modules.user.service.GuideAutoDisableService;
@@ -55,6 +62,7 @@
        review.setGuideId(12L);
        review.setScore(new BigDecimal("5.0"));
        review.setContent("讲解专业");
        review.setImageUrls("[\"/uploads/review-images/example.jpg\"]");
        review.setReviewedAt(LocalDateTime.of(2026, 7, 29, 10, 30));
        review.setStatus(1);
@@ -75,7 +83,59 @@
        assertThat(response.getRows()).hasSize(1);
        assertThat(response.getRows().get(0).getDateText()).isEqualTo("2026年7月29日");
        assertThat(response.getRows().get(0).getComment()).isEqualTo("讲解专业");
        assertThat(response.getRows().get(0).getImages()).isEmpty();
        assertThat(response.getRows().get(0).getImages())
                .containsExactly("/uploads/review-images/example.jpg");
    }
    @Test
    void reviewResponsesShouldParseLegacyImageFormats() {
        OrderReview review = new OrderReview();
        review.setImageUrls("/uploads/review-images/one.jpg,/uploads/review-images/two.jpg");
        assertThat(new GuideRatingItemResponse(review).getImages())
                .containsExactly("/uploads/review-images/one.jpg", "/uploads/review-images/two.jpg");
        assertThat(new OrderReviewResponse(review).getImages())
                .containsExactly("/uploads/review-images/one.jpg", "/uploads/review-images/two.jpg");
    }
    @Test
    void createShouldNotifyGuideAfterReviewIsSaved() {
        OrderReviewMapper reviewMapper = mock(OrderReviewMapper.class);
        TourOrderMapper orderMapper = mock(TourOrderMapper.class);
        GuideUserMapper guideUserMapper = mock(GuideUserMapper.class);
        GuideNotificationService notificationService = mock(GuideNotificationService.class);
        OrderReviewService reviewService = new OrderReviewService(
                reviewMapper, orderMapper, guideUserMapper, mock(GuideAutoDisableService.class),
                new ObjectMapper(), notificationService);
        TourOrder order = new TourOrder();
        order.setId(99L);
        order.setOrderNo("ORDER-99");
        order.setVisitorId(7L);
        order.setGuideId(8L);
        order.setStatus(OrderStatus.COMPLETED.getCode());
        when(orderMapper.selectById(99L)).thenReturn(order);
        when(reviewMapper.countByOrderId(99L)).thenReturn(0L);
        GuideUser guide = new GuideUser();
        guide.setId(8L);
        guide.setStatus(1);
        when(guideUserMapper.selectById(8L)).thenReturn(guide);
        when(reviewMapper.selectAverageScore(8L)).thenReturn(new BigDecimal("5.00"));
        OrderReviewCreateRequest request = new OrderReviewCreateRequest();
        request.setOrderId(99L);
        request.setScore(new BigDecimal("5.00"));
        request.setContent("服务很好");
        request.setImages(Collections.singletonList("/uploads/review-images/example.jpg"));
        reviewService.create(7L, request);
        ArgumentCaptor<OrderReview> reviewCaptor = ArgumentCaptor.forClass(OrderReview.class);
        verify(reviewMapper).insert(reviewCaptor.capture());
        assertThat(reviewCaptor.getValue().getImageUrls())
                .isEqualTo("[\"/uploads/review-images/example.jpg\"]");
        verify(notificationService).notifyOrderReviewed(order);
    }
    @Test