package com.tourguide.modules.user.service; import com.tourguide.common.exception.BusinessException; import com.tourguide.modules.order.mapper.TourOrderMapper; import com.tourguide.modules.user.domain.ClientType; import com.tourguide.modules.user.entity.GuideUser; import com.tourguide.modules.user.mapper.GuideUserMapper; import com.tourguide.security.JwtTokenService; import com.tourguide.security.TokenPayload; import com.tourguide.security.TokenSessionService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; 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 GuideAccountServiceTest { private GuideUserMapper guideUserMapper; private TourOrderMapper tourOrderMapper; private TokenSessionService tokenSessionService; private GuideAccountService accountService; private TokenPayload payload; @BeforeEach void setUp() { guideUserMapper = mock(GuideUserMapper.class); tourOrderMapper = mock(TourOrderMapper.class); JwtTokenService jwtTokenService = mock(JwtTokenService.class); tokenSessionService = mock(TokenSessionService.class); accountService = new GuideAccountService( guideUserMapper, tourOrderMapper, jwtTokenService, tokenSessionService); payload = new TokenPayload(8L, "guide_user", "GUIDE_USER", ClientType.GUIDE, "token-id"); when(jwtTokenService.parse("guide-token")).thenReturn(payload); } @Test void shouldRejectCancellationWhenActiveOrderExists() { when(tourOrderMapper.selectCount(any())).thenReturn(1L); assertThatThrownBy(() -> accountService.cancel(8L, "guide-token")) .isInstanceOf(BusinessException.class) .hasMessage("存在未完成订单,暂时无法注销账号"); verify(guideUserMapper, never()).updateById(any()); verify(tokenSessionService, never()).remove(payload); } @Test void shouldMarkGuideCancelledAndRemoveCurrentSession() { GuideUser user = new GuideUser(); user.setId(8L); user.setUsername("13800138000"); user.setMobile("13800138000"); user.setCertificateNo("CERT-8"); user.setIdCardNo("11010519491231002X"); user.setStatus(GuideUserService.STATUS_ENABLED); user.setAutoDisableWhitelisted(1); when(tourOrderMapper.selectCount(any())).thenReturn(0L); when(guideUserMapper.selectById(8L)).thenReturn(user); accountService.cancel(8L, "guide-token"); ArgumentCaptor userCaptor = ArgumentCaptor.forClass(GuideUser.class); verify(guideUserMapper).updateById(userCaptor.capture()); assertThat(userCaptor.getValue().getStatus()).isEqualTo(GuideUserService.STATUS_CANCELLED); assertThat(userCaptor.getValue().getAutoDisableWhitelisted()).isZero(); assertThat(userCaptor.getValue().getUsername()).startsWith("deleted_").hasSize(32); assertThat(userCaptor.getValue().getMobile()).isNull(); assertThat(userCaptor.getValue().getCertificateNo()).isNull(); assertThat(userCaptor.getValue().getIdCardNo()).isNull(); verify(tokenSessionService).remove(payload); } }