| | |
| | | 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; |
| | |
| | | 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); |
| | | |
| | |
| | | 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 |