From 825a575deb96cce822468bb9d9ac3e4eea0f91d1 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期四, 17 九月 2026 08:58:14 +0800
Subject: [PATCH] update

---
 backend/src/test/java/com/tourguide/modules/user/service/GuideReceivingServiceTest.java |   86 +++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 83 insertions(+), 3 deletions(-)

diff --git a/backend/src/test/java/com/tourguide/modules/user/service/GuideReceivingServiceTest.java b/backend/src/test/java/com/tourguide/modules/user/service/GuideReceivingServiceTest.java
index b5e4c36..edfcba8 100644
--- a/backend/src/test/java/com/tourguide/modules/user/service/GuideReceivingServiceTest.java
+++ b/backend/src/test/java/com/tourguide/modules/user/service/GuideReceivingServiceTest.java
@@ -8,8 +8,11 @@
 import com.tourguide.modules.operation.mapper.ScenicPricingMapper;
 import com.tourguide.modules.operation.service.PlatformSettingsService;
 import com.tourguide.modules.order.mapper.TourOrderMapper;
+import com.tourguide.modules.order.service.GuideSessionTransitionService;
 import com.tourguide.modules.user.dto.GuideReceivingOptionResponse;
+import com.tourguide.modules.user.dto.GuideReceivingStartRequest;
 import com.tourguide.modules.user.entity.GuideScenicConfig;
+import com.tourguide.modules.user.entity.GuideReceivingSession;
 import com.tourguide.modules.user.entity.GuideUser;
 import com.tourguide.modules.user.mapper.GuideRealtimeStatusMapper;
 import com.tourguide.modules.user.mapper.GuideReceivingSessionMapper;
@@ -22,6 +25,7 @@
 import java.util.Collections;
 
 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.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -35,6 +39,7 @@
     private GuideReceivingSessionMapper sessionMapper;
     private GuideRealtimeStatusMapper realtimeStatusMapper;
     private PlatformSettingsService platformSettingsService;
+    private TourOrderMapper orderMapper;
     private GuideReceivingService service;
 
     @BeforeEach
@@ -48,14 +53,49 @@
         sessionMapper = mock(GuideReceivingSessionMapper.class);
         realtimeStatusMapper = mock(GuideRealtimeStatusMapper.class);
         platformSettingsService = mock(PlatformSettingsService.class);
-        TourOrderMapper orderMapper = mock(TourOrderMapper.class);
+        orderMapper = mock(TourOrderMapper.class);
+        GuideSessionTransitionService sessionTransitionService = mock(GuideSessionTransitionService.class);
         service = new GuideReceivingService(guideUserService, guideScenicMapper, teamScenicMapper, scenicMapper,
                 meetingPointMapper, pricingMapper, sessionMapper, realtimeStatusMapper, platformSettingsService,
-                orderMapper);
+                orderMapper, sessionTransitionService);
     }
 
     @Test
-    void shouldEnablePremiumOptionsForWhitelistedGuideBelowRuleThresholds() {
+    void shouldEnablePremiumOptionsForGuideWithExplicitPermission() {
+        when(guideUserService.findEnabledById(8L)).thenReturn(explicitPremiumGuide());
+        when(platformSettingsService.getSettings()).thenReturn(strictSettings());
+        when(guideScenicMapper.selectList(any())).thenReturn(Collections.singletonList(scenicConfig()));
+        when(scenicMapper.selectList(any())).thenReturn(Collections.singletonList(scenicSpot()));
+        when(meetingPointMapper.selectList(any())).thenReturn(Collections.emptyList());
+        when(pricingMapper.selectList(any())).thenReturn(Collections.singletonList(premiumPricing()));
+
+        GuideReceivingOptionResponse response = service.options(8L);
+
+        assertThat(response.isPremiumEnabled()).isTrue();
+    }
+
+    @Test
+    void shouldExposeConfiguredServicePricesForGuideOptions() {
+        when(guideUserService.findEnabledById(8L)).thenReturn(explicitPremiumGuide());
+        when(platformSettingsService.getSettings()).thenReturn(strictSettings());
+        when(guideScenicMapper.selectList(any())).thenReturn(Collections.singletonList(scenicConfig()));
+        when(scenicMapper.selectList(any())).thenReturn(Collections.singletonList(scenicSpot()));
+        when(meetingPointMapper.selectList(any())).thenReturn(Collections.emptyList());
+        ScenicPricing pricing = premiumPricing();
+        pricing.setOriginalPrice(new BigDecimal("860.00"));
+        pricing.setDiscountPrice(new BigDecimal("836.00"));
+        when(pricingMapper.selectList(any())).thenReturn(Collections.singletonList(pricing));
+
+        GuideReceivingOptionResponse response = service.options(8L);
+
+        GuideReceivingOptionResponse.ServiceOption option = response.getScenics().get(0).getServices().get(0);
+        assertThat(option.getOriginalPrice()).isEqualByComparingTo("860.00");
+        assertThat(option.getDiscountPrice()).isEqualByComparingTo("836.00");
+        assertThat(response.getScenics().get(0).getFirstOrderLeadMinutes()).isEqualTo(12);
+    }
+
+    @Test
+    void shouldEnablePremiumOptionsForLegacyWhitelistedGuideBelowRuleThresholds() {
         when(guideUserService.findEnabledById(8L)).thenReturn(whitelistedGuide());
         when(platformSettingsService.getSettings()).thenReturn(strictSettings());
         when(guideScenicMapper.selectList(any())).thenReturn(Collections.singletonList(scenicConfig()));
@@ -66,6 +106,39 @@
         GuideReceivingOptionResponse response = service.options(8L);
 
         assertThat(response.isPremiumEnabled()).isTrue();
+    }
+
+    @Test
+    void shouldRejectStartingPremiumServiceWithoutPermission() {
+        when(guideUserService.findEnabledById(8L)).thenReturn(nonWhitelistedGuide());
+        when(platformSettingsService.getSettings()).thenReturn(strictSettings());
+        when(scenicMapper.selectOne(any())).thenReturn(scenicSpot());
+        when(guideScenicMapper.selectList(any())).thenReturn(Collections.singletonList(scenicConfig()));
+        when(meetingPointMapper.selectCount(any())).thenReturn(1L);
+        when(pricingMapper.selectList(any())).thenReturn(Collections.singletonList(premiumPricing()));
+
+        GuideReceivingStartRequest request = new GuideReceivingStartRequest();
+        request.setScenicSpotId(3L);
+        request.setMeetingPointId(4L);
+        request.setReceivingMode("GROUP");
+        request.setServiceTypes(Collections.singletonList("GROUP_PREMIUM"));
+
+        assertThatThrownBy(() -> service.start(8L, request))
+                .isInstanceOf(com.tourguide.common.exception.BusinessException.class)
+                .hasMessage("premium service requirements are not met");
+    }
+
+    @Test
+    void shouldReturnAssignedSessionWithActiveOrderWhenReceivingIsDisabled() {
+        when(guideUserService.findEnabledById(8L)).thenReturn(nonWhitelistedGuide());
+        GuideReceivingSession session = new GuideReceivingSession();
+        session.setId(20L);
+        session.setGuideId(8L);
+        session.setStatus("ASSIGNED");
+        when(sessionMapper.selectOne(any())).thenReturn(session);
+        when(orderMapper.selectCount(any())).thenReturn(1L);
+
+        assertThat(service.current(8L)).isSameAs(session);
     }
 
     @Test
@@ -92,6 +165,12 @@
         return guide;
     }
 
+    private GuideUser explicitPremiumGuide() {
+        GuideUser guide = nonWhitelistedGuide();
+        guide.setPremiumEnabled(1);
+        return guide;
+    }
+
     private GuideUser nonWhitelistedGuide() {
         GuideUser guide = whitelistedGuide();
         guide.setAutoDisableWhitelisted(0);
@@ -110,6 +189,7 @@
         scenic.setId(3L);
         scenic.setScenicName("Test Scenic");
         scenic.setStatus(1);
+        scenic.setFirstOrderLeadMinutes(12);
         return scenic;
     }
 

--
Gitblit v1.7.1