liujie
2026-09-11 4f6f15b818704079ff2e4e4719b798f48d68a335
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
package com.tourguide.modules.user.service;
 
import com.tourguide.modules.operation.entity.OperationCity;
import com.tourguide.modules.operation.mapper.OperationCityMapper;
import com.tourguide.modules.user.dto.GuideRegistrationResponse;
import com.tourguide.modules.user.dto.GuideRegistrationSubmitRequest;
import com.tourguide.modules.user.dto.GuideRegistrationTokenResponse;
import com.tourguide.modules.user.dto.SmsCodeResponse;
import com.tourguide.modules.user.entity.GuideApplication;
import com.tourguide.modules.user.entity.GuideUser;
import com.tourguide.modules.user.mapper.GuideApplicationMapper;
import com.tourguide.modules.user.mapper.GuideTeamMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
 
import java.time.LocalDate;
 
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
 
class GuideRegistrationServiceTest {
    private StringRedisTemplate redisTemplate;
    private ValueOperations<String, String> valueOperations;
    private GuideApplicationMapper applicationMapper;
    private GuideVerificationCodeService verificationCodeService;
    private GuideUserService guideUserService;
    private GuideRegistrationService service;
 
    @SuppressWarnings("unchecked")
    @BeforeEach
    void setUp() {
        redisTemplate = mock(StringRedisTemplate.class);
        valueOperations = mock(ValueOperations.class);
        applicationMapper = mock(GuideApplicationMapper.class);
        when(redisTemplate.opsForValue()).thenReturn(valueOperations);
        when(valueOperations.get("tourguide:guide-registration:token:registration-token"))
                .thenReturn("13800138000");
        when(applicationMapper.selectCount(any())).thenReturn(0L);
 
        guideUserService = mock(GuideUserService.class);
        when(guideUserService.findByPhone("13800138000")).thenReturn(null);
        OperationCityMapper cityMapper = mock(OperationCityMapper.class);
        OperationCity city = new OperationCity();
        city.setId(1L);
        city.setCityName("成都市");
        city.setStatus(1);
        when(cityMapper.selectById(1L)).thenReturn(city);
        doAnswer(invocation -> {
            GuideApplication application = invocation.getArgument(0);
            application.setId(10L);
            return 1;
        }).when(applicationMapper).insert(any(GuideApplication.class));
 
        verificationCodeService = mock(GuideVerificationCodeService.class);
        service = new GuideRegistrationService(
                verificationCodeService, redisTemplate, applicationMapper,
                guideUserService, cityMapper, mock(GuideTeamMapper.class));
    }
 
    @Test
    void shouldUseRegistrationSceneForSmsCode() {
        when(verificationCodeService.send("13800138000", "registration"))
                .thenReturn(new SmsCodeResponse(300, 30));
 
        SmsCodeResponse response = service.sendCode("13800138000");
 
        assertThat(response.getExpireSeconds()).isEqualTo(300);
        verify(verificationCodeService).send("13800138000", "registration");
    }
 
    @Test
    void shouldVerifyRegistrationSceneAndCreateToken() {
        GuideRegistrationTokenResponse response = service.verifyPhone("13800138000", "794535");
 
        assertThat(response.getRegistrationToken()).isNotBlank();
        verify(verificationCodeService).verifyAndConsume("13800138000", "794535", "registration");
    }
 
    @Test
    void shouldAllowCancelledGuideToRegisterAgain() {
        GuideUser guide = new GuideUser();
        guide.setStatus(GuideUserService.STATUS_CANCELLED);
        when(guideUserService.findByPhone("13800138000")).thenReturn(guide);
 
        GuideRegistrationTokenResponse response = service.verifyPhone("13800138000", "794535");
 
        assertThat(response.getRegistrationToken()).isNotBlank();
        verify(verificationCodeService).verifyAndConsume("13800138000", "794535", "registration");
    }
 
    @Test
    void shouldCreatePendingApplicationAndConsumeToken() {
        GuideRegistrationSubmitRequest request = new GuideRegistrationSubmitRequest();
        request.setRealName("张导游");
        request.setGender(1);
        request.setAgeRange("26-35岁");
        request.setWorkYearRange("3-5年");
        request.setGuideType("personal");
        request.setIdCardNo("11010519491231002X");
        request.setIdCardFrontUrl("/uploads/guide-applications/front.jpg");
        request.setIdCardBackUrl("/uploads/guide-applications/back.jpg");
        request.setGuideCertificateUrl("/uploads/guide-applications/guide.jpg");
        request.setCertificateValidUntil(LocalDate.now().plusYears(1));
        request.setBankCardNo("6222021234567890123");
        request.setBankCityId(1L);
 
        GuideRegistrationResponse response = service.submit("registration-token", request);
 
        assertThat(response.getId()).isEqualTo(10L);
        assertThat(response.getAuditStatus()).isEqualTo("pending");
        verify(applicationMapper).insert(any(GuideApplication.class));
        verify(redisTemplate).delete("tourguide:guide-registration:token:registration-token");
    }
}