package com.tourguide.modules.user.service; import com.tourguide.common.exception.BusinessException; import com.tourguide.modules.system.service.AdminPermissionService; import com.tourguide.modules.user.dto.LoginRequest; import com.tourguide.modules.user.entity.AdminUser; import com.tourguide.modules.user.mapper.MiniUserMapper; import com.tourguide.security.JwtTokenService; import com.tourguide.security.TokenSessionService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.security.crypto.password.PasswordEncoder; 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 AuthServiceAdminLoginTest { private AdminUserService adminUserService; private PasswordEncoder passwordEncoder; private JwtTokenService jwtTokenService; private AuthService authService; @BeforeEach void setUp() { adminUserService = mock(AdminUserService.class); passwordEncoder = mock(PasswordEncoder.class); jwtTokenService = mock(JwtTokenService.class); authService = new AuthService( adminUserService, mock(AdminPermissionService.class), mock(MiniUserService.class), mock(GuideUserService.class), mock(GuideAutoDisableService.class), mock(MiniUserMapper.class), passwordEncoder, jwtTokenService, mock(TokenSessionService.class)); } @Test void disabledAdminShouldReceiveExplicitMessageAndNoToken() { LoginRequest request = loginRequest(); AdminUser user = adminUser(0); when(adminUserService.findByUsername(request.getUsername())).thenReturn(user); assertThatThrownBy(() -> authService.loginAdmin(request)) .isInstanceOf(BusinessException.class) .hasMessage("账号已被禁用,请联系管理员") .extracting(error -> ((BusinessException) error).getCode()) .isEqualTo(403); verify(passwordEncoder, never()).matches(any(), any()); verify(jwtTokenService, never()).createToken(any(), any(), any(), any()); } @Test void enabledAdminWithWrongPasswordShouldKeepGenericMessage() { LoginRequest request = loginRequest(); AdminUser user = adminUser(1); when(adminUserService.findByUsername(request.getUsername())).thenReturn(user); when(passwordEncoder.matches(request.getPassword(), user.getPassword())).thenReturn(false); assertThatThrownBy(() -> authService.loginAdmin(request)) .isInstanceOf(BusinessException.class) .hasMessage("用户名或密码错误") .extracting(error -> ((BusinessException) error).getCode()) .isEqualTo(401); verify(jwtTokenService, never()).createToken(any(), any(), any(), any()); } private LoginRequest loginRequest() { LoginRequest request = new LoginRequest(); request.setUsername("disabled-admin"); request.setPassword("Password123!"); return request; } private AdminUser adminUser(int status) { AdminUser user = new AdminUser(); user.setId(8L); user.setUsername("disabled-admin"); user.setPassword("encoded-password"); user.setRoleCode("OPERATOR"); user.setStatus(status); return user; } }