diff --git a/module-auth/pom.xml b/module-auth/pom.xml index 74dc828..6b884c8 100644 --- a/module-auth/pom.xml +++ b/module-auth/pom.xml @@ -85,5 +85,17 @@ org.springframework.boot spring-boot-starter-data-redis + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.h2database + h2 + test + diff --git a/module-auth/src/test/java/com/ether/pms/auth/service/PasswordServiceTest.java b/module-auth/src/test/java/com/ether/pms/auth/service/PasswordServiceTest.java new file mode 100644 index 0000000..e355c55 --- /dev/null +++ b/module-auth/src/test/java/com/ether/pms/auth/service/PasswordServiceTest.java @@ -0,0 +1,46 @@ +package com.ether.pms.auth.service; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(MockitoExtension.class) +class PasswordServiceTest { + + @InjectMocks + private PasswordService passwordService; + + @Test + void encode_shouldReturnNonNullValue() { + String encoded = passwordService.encode("Test123!"); + assertNotNull(encoded); + assertNotEquals("Test123!", encoded); + } + + @Test + void matches_shouldReturnTrue_forCorrectPassword() { + String encoded = passwordService.encode("Test123!"); + assertTrue(passwordService.matches("Test123!", encoded)); + } + + @Test + void matches_shouldReturnFalse_forWrongPassword() { + String encoded = passwordService.encode("Test123!"); + assertFalse(passwordService.matches("Wrong123!", encoded)); + } + + @Test + void isPasswordWeak_shouldReturnTrue_forCommonWeakPasswords() { + assertTrue(passwordService.isPasswordWeak("password123")); + assertTrue(passwordService.isPasswordWeak("admin123")); + assertTrue(passwordService.isPasswordWeak("qwerty123")); + } + + @Test + void isPasswordWeak_shouldReturnFalse_forStrongPasswords() { + assertFalse(passwordService.isPasswordWeak("Str0ng!Pass")); + } +} diff --git a/module-auth/src/test/java/com/ether/pms/auth/service/UserServiceTest.java b/module-auth/src/test/java/com/ether/pms/auth/service/UserServiceTest.java new file mode 100644 index 0000000..2418b30 --- /dev/null +++ b/module-auth/src/test/java/com/ether/pms/auth/service/UserServiceTest.java @@ -0,0 +1,136 @@ +package com.ether.pms.auth.service; + +import com.ether.pms.auth.entity.User; +import com.ether.pms.auth.repository.RoleRepository; +import com.ether.pms.auth.repository.UserRepository; +import com.ether.pms.common.BusinessException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class UserServiceTest { + + @Mock + private UserRepository userRepository; + + @Mock + private RoleRepository roleRepository; + + @Mock + private PasswordService passwordService; + + @InjectMocks + private UserService userService; + + @Test + void findById_shouldReturnUser_whenExists() { + UUID userId = UUID.randomUUID(); + User mockUser = new User(); + mockUser.setId(userId); + mockUser.setUsername("testuser"); + + when(userRepository.findById(userId)).thenReturn(Optional.of(mockUser)); + + User result = userService.findById(userId); + + assertNotNull(result); + assertEquals("testuser", result.getUsername()); + } + + @Test + void findById_shouldThrowException_whenNotExists() { + UUID userId = UUID.randomUUID(); + when(userRepository.findById(userId)).thenReturn(Optional.empty()); + + assertThrows(BusinessException.class, () -> userService.findById(userId)); + } + + @Test + void findByUsername_shouldReturnUser_whenExists() { + User mockUser = new User(); + mockUser.setUsername("testuser"); + + when(userRepository.findByUsername("testuser")).thenReturn(Optional.of(mockUser)); + + User result = userService.findByUsername("testuser"); + + assertNotNull(result); + assertEquals("testuser", result.getUsername()); + } + + @Test + void create_shouldThrowException_whenUsernameExists() { + User newUser = new User(); + newUser.setUsername("existinguser"); + newUser.setPassword("Test123!"); + + when(userRepository.existsByUsername("existinguser")).thenReturn(true); + + assertThrows(BusinessException.class, () -> userService.create(newUser)); + } + + @Test + void create_shouldThrowException_whenPasswordTooWeak() { + User newUser = new User(); + newUser.setUsername("newuser"); + newUser.setPassword("weak"); + + when(userRepository.existsByUsername("newuser")).thenReturn(false); + doThrow(new IllegalArgumentException("密码太弱")) + .when(passwordService).validatePassword("weak"); + + assertThrows(BusinessException.class, () -> userService.create(newUser)); + } + + @Test + void create_shouldEncodePassword_whenValid() { + User newUser = new User(); + newUser.setUsername("newuser"); + newUser.setPassword("Valid123!"); + + when(userRepository.existsByUsername("newuser")).thenReturn(false); + doNothing().when(passwordService).validatePassword("Valid123!"); + when(passwordService.isPasswordWeak("Valid123!")).thenReturn(false); + when(passwordService.encode("Valid123!")).thenReturn("encodedPassword"); + when(userRepository.save(any(User.class))).thenReturn(newUser); + + User result = userService.create(newUser); + + assertNotNull(result); + verify(passwordService).encode("Valid123!"); + } + + @Test + void updatePassword_shouldThrowException_whenOldPasswordWrong() { + UUID userId = UUID.randomUUID(); + User existingUser = new User(); + existingUser.setId(userId); + existingUser.setPassword("encodedOld"); + + when(userRepository.findById(userId)).thenReturn(Optional.of(existingUser)); + when(passwordService.matches("wrongOld", "encodedOld")).thenReturn(false); + + assertThrows(BusinessException.class, + () -> userService.updatePassword(userId, "wrongOld", "New123!")); + } + + @Test + void delete_shouldCallRepository() { + UUID userId = UUID.randomUUID(); + doNothing().when(userRepository).deleteById(userId); + + userService.delete(userId); + + verify(userRepository).deleteById(userId); + } +} diff --git a/pom.xml b/pom.xml index 5944112..511fe03 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,20 @@ redisson-spring-boot-starter ${redisson.version} + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test + + + + com.h2database + h2 + 2.2.224 + test +