liujie
2026-09-09 39f6fca28e3f78abe48f08e474ec011abb990b36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package com.tourguide.modules.user.service;
 
import com.tourguide.modules.operation.entity.OperationCity;
import com.tourguide.modules.operation.entity.OperationScenicSpot;
import com.tourguide.modules.operation.mapper.OperationCityMapper;
import com.tourguide.modules.operation.mapper.OperationScenicSpotMapper;
import com.tourguide.modules.user.dto.GuideScenicConfigResponse;
import com.tourguide.modules.user.entity.GuideScenicConfig;
import com.tourguide.modules.user.entity.GuideUser;
import com.tourguide.modules.user.mapper.GuideAutoDisableConfigMapper;
import com.tourguide.modules.user.mapper.GuideApplicationMapper;
import com.tourguide.modules.user.mapper.GuideScenicConfigMapper;
import com.tourguide.modules.user.mapper.GuideTeamMapper;
import com.tourguide.modules.user.mapper.GuideTeamScenicConfigMapper;
import com.tourguide.modules.user.mapper.GuideUserMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.security.crypto.password.PasswordEncoder;
 
import java.util.Collections;
import java.util.List;
 
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.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
 
class GuideUserScenicConfigServiceTest {
    private GuideUserMapper userMapper;
    private GuideScenicConfigMapper scenicConfigMapper;
    private GuideTeamScenicConfigMapper teamScenicConfigMapper;
    private OperationScenicSpotMapper scenicSpotMapper;
    private OperationCityMapper cityMapper;
    private GuideUserService service;
 
    @BeforeEach
    void setUp() {
        userMapper = mock(GuideUserMapper.class);
        scenicConfigMapper = mock(GuideScenicConfigMapper.class);
        teamScenicConfigMapper = mock(GuideTeamScenicConfigMapper.class);
        scenicSpotMapper = mock(OperationScenicSpotMapper.class);
        cityMapper = mock(OperationCityMapper.class);
        service = new GuideUserService(
                userMapper,
                mock(GuideTeamMapper.class),
                mock(GuideApplicationMapper.class),
                teamScenicConfigMapper,
                scenicConfigMapper,
                mock(GuideAutoDisableConfigMapper.class),
                scenicSpotMapper,
                cityMapper,
                mock(PasswordEncoder.class));
 
        GuideUser guide = new GuideUser();
        guide.setId(12L);
        when(userMapper.selectById(12L)).thenReturn(guide);
    }
 
    @Test
    void addScenicConfigShouldUseEnabledOperationScenicData() {
        OperationScenicSpot scenicSpot = new OperationScenicSpot();
        scenicSpot.setId(21L);
        scenicSpot.setScenicName("青城山景区");
        scenicSpot.setCityId(31L);
        scenicSpot.setStatus(1);
        when(scenicSpotMapper.selectById(21L)).thenReturn(scenicSpot);
 
        OperationCity city = new OperationCity();
        city.setId(31L);
        city.setCityName("成都市");
        when(cityMapper.selectById(31L)).thenReturn(city);
        when(scenicConfigMapper.selectList(any())).thenAnswer(invocation -> {
            GuideScenicConfig saved = new GuideScenicConfig();
            saved.setId(41L);
            saved.setGuideId(12L);
            saved.setScenicName("青城山景区");
            saved.setCityName("成都市");
            return Collections.singletonList(saved);
        });
 
        List<GuideScenicConfigResponse> result = service.addScenicConfig(12L, 21L);
 
        ArgumentCaptor<GuideScenicConfig> captor = ArgumentCaptor.forClass(GuideScenicConfig.class);
        verify(scenicConfigMapper).upsert(captor.capture());
        assertThat(captor.getValue().getGuideId()).isEqualTo(12L);
        assertThat(captor.getValue().getScenicName()).isEqualTo("青城山景区");
        assertThat(captor.getValue().getCityName()).isEqualTo("成都市");
        assertThat(result).hasSize(1);
    }
 
    @Test
    void addScenicConfigShouldRejectDisabledScenicSpot() {
        OperationScenicSpot scenicSpot = new OperationScenicSpot();
        scenicSpot.setId(21L);
        scenicSpot.setStatus(0);
        when(scenicSpotMapper.selectById(21L)).thenReturn(scenicSpot);
 
        assertThatThrownBy(() -> service.addScenicConfig(12L, 21L))
                .hasMessage("景区不存在或未启用");
        verify(scenicConfigMapper, never()).upsert(any(GuideScenicConfig.class));
    }
 
    @Test
    void addScenicConfigShouldRejectScenicOutsideGuidesTeam() {
        GuideUser guide = new GuideUser();
        guide.setId(12L);
        guide.setTeamId(51L);
        when(userMapper.selectById(12L)).thenReturn(guide);
 
        OperationScenicSpot scenicSpot = new OperationScenicSpot();
        scenicSpot.setId(21L);
        scenicSpot.setScenicName("青城山景区");
        scenicSpot.setCityId(31L);
        scenicSpot.setStatus(1);
        when(scenicSpotMapper.selectById(21L)).thenReturn(scenicSpot);
 
        OperationCity city = new OperationCity();
        city.setId(31L);
        city.setCityName("成都市");
        when(cityMapper.selectById(31L)).thenReturn(city);
 
        assertThatThrownBy(() -> service.addScenicConfig(12L, 21L))
                .isInstanceOf(com.tourguide.common.exception.BusinessException.class)
                .hasMessage("只能配置所属讲解队下的景区");
        verify(scenicConfigMapper, never()).upsert(any(GuideScenicConfig.class));
    }
 
    @Test
    void deleteScenicConfigShouldRejectAnotherGuidesConfig() {
        GuideScenicConfig config = new GuideScenicConfig();
        config.setId(41L);
        config.setGuideId(99L);
        when(scenicConfigMapper.selectById(41L)).thenReturn(config);
 
        assertThatThrownBy(() -> service.deleteScenicConfig(12L, 41L))
                .hasMessage("导游景区配置不存在");
        verify(scenicConfigMapper, never()).deleteById(41L);
    }
}