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.entity.GuideApplication; 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 valueOperations; private GuideApplicationMapper applicationMapper; 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 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)); service = new GuideRegistrationService( mock(GuideVerificationCodeService.class), redisTemplate, applicationMapper, guideUserService, cityMapper, mock(GuideTeamMapper.class)); } @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"); } }