diff --git a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/handler/auth/SysAuthHandlerTest.java b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/handler/auth/SysAuthHandlerTest.java new file mode 100644 index 0000000..b37b4d2 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/handler/auth/SysAuthHandlerTest.java @@ -0,0 +1,236 @@ +package cn.novalon.manage.sys.handler.auth; + +import cn.novalon.manage.sys.dto.request.LoginRequest; +import cn.novalon.manage.sys.dto.request.UserRegisterRequest; +import cn.novalon.manage.sys.dto.response.AuthResponse; +import cn.novalon.manage.sys.security.JwtTokenProvider; +import cn.novalon.manage.sys.core.domain.SysUser; +import cn.novalon.manage.sys.core.service.ISysUserService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.HttpStatus; +import org.springframework.mock.web.reactive.function.server.MockServerRequest; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.support.WebExchangeBindException; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import java.time.LocalDateTime; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class SysAuthHandlerTest { + + @Mock + private ISysUserService userService; + + @Mock + private PasswordEncoder passwordEncoder; + + @Mock + private JwtTokenProvider jwtTokenProvider; + + private SysAuthHandler authHandler; + private SysUser testUser; + + @BeforeEach + void setUp() { + authHandler = new SysAuthHandler(userService, passwordEncoder, jwtTokenProvider); + + testUser = new SysUser(); + testUser.setId(1L); + testUser.setUsername("testuser"); + testUser.setPassword("encoded_password"); + testUser.setEmail("test@example.com"); + testUser.setStatus(1); + } + + @Test + void testLogin_Success() { + LoginRequest loginRequest = new LoginRequest(); + loginRequest.setUsername("testuser"); + loginRequest.setPassword("password123"); + + when(userService.findByUsername("testuser")).thenReturn(Mono.just(testUser)); + when(passwordEncoder.matches("password123", "encoded_password")).thenReturn(true); + when(jwtTokenProvider.generateToken("testuser", 1L)).thenReturn("test_token"); + + ServerRequest request = MockServerRequest.builder() + .body(Mono.just(loginRequest)); + Mono response = authHandler.login(request); + + StepVerifier.create(response) + .expectNextMatches(serverResponse -> + serverResponse.statusCode() == HttpStatus.OK) + .verifyComplete(); + + verify(userService).findByUsername("testuser"); + verify(passwordEncoder).matches("password123", "encoded_password"); + verify(jwtTokenProvider).generateToken("testuser", 1L); + } + + @Test + void testLogin_EmptyUsername() { + LoginRequest loginRequest = new LoginRequest(); + loginRequest.setUsername(""); + loginRequest.setPassword("password123"); + + ServerRequest request = MockServerRequest.builder() + .body(Mono.just(loginRequest)); + Mono response = authHandler.login(request); + + StepVerifier.create(response) + .expectNextMatches(serverResponse -> + serverResponse.statusCode() == HttpStatus.BAD_REQUEST) + .verifyComplete(); + } + + @Test + void testLogin_EmptyPassword() { + LoginRequest loginRequest = new LoginRequest(); + loginRequest.setUsername("testuser"); + loginRequest.setPassword(""); + + ServerRequest request = MockServerRequest.builder() + .body(Mono.just(loginRequest)); + Mono response = authHandler.login(request); + + StepVerifier.create(response) + .expectNextMatches(serverResponse -> + serverResponse.statusCode() == HttpStatus.BAD_REQUEST) + .verifyComplete(); + } + + @Test + void testLogin_UserNotFound() { + LoginRequest loginRequest = new LoginRequest(); + loginRequest.setUsername("unknown"); + loginRequest.setPassword("password123"); + + when(userService.findByUsername("unknown")).thenReturn(Mono.empty()); + + ServerRequest request = MockServerRequest.builder() + .body(Mono.just(loginRequest)); + Mono response = authHandler.login(request); + + StepVerifier.create(response) + .expectNextMatches(serverResponse -> + serverResponse.statusCode() == HttpStatus.UNAUTHORIZED) + .verifyComplete(); + + verify(userService).findByUsername("unknown"); + } + + @Test + void testLogin_WrongPassword() { + LoginRequest loginRequest = new LoginRequest(); + loginRequest.setUsername("testuser"); + loginRequest.setPassword("wrongpassword"); + + when(userService.findByUsername("testuser")).thenReturn(Mono.just(testUser)); + when(passwordEncoder.matches("wrongpassword", "encoded_password")).thenReturn(false); + + ServerRequest request = MockServerRequest.builder() + .body(Mono.just(loginRequest)); + Mono response = authHandler.login(request); + + StepVerifier.create(response) + .expectNextMatches(serverResponse -> + serverResponse.statusCode() == HttpStatus.UNAUTHORIZED) + .verifyComplete(); + + verify(userService).findByUsername("testuser"); + verify(passwordEncoder).matches("wrongpassword", "encoded_password"); + } + + @Test + void testLogin_UserDisabled() { + testUser.setStatus(0); + + LoginRequest loginRequest = new LoginRequest(); + loginRequest.setUsername("testuser"); + loginRequest.setPassword("password123"); + + when(userService.findByUsername("testuser")).thenReturn(Mono.just(testUser)); + when(passwordEncoder.matches("password123", "encoded_password")).thenReturn(true); + + ServerRequest request = MockServerRequest.builder() + .body(Mono.just(loginRequest)); + Mono response = authHandler.login(request); + + StepVerifier.create(response) + .expectNextMatches(serverResponse -> + serverResponse.statusCode() == HttpStatus.UNAUTHORIZED) + .verifyComplete(); + + verify(userService).findByUsername("testuser"); + verify(passwordEncoder).matches("password123", "encoded_password"); + } + + @Test + void testRegister_Success() { + UserRegisterRequest registerRequest = new UserRegisterRequest(); + registerRequest.setUsername("newuser"); + registerRequest.setPassword("password123"); + registerRequest.setEmail("new@example.com"); + + when(userService.findByUsername("newuser")).thenReturn(Mono.empty()); + when(passwordEncoder.encode("password123")).thenReturn("encoded_password"); + when(userService.createUser(any(SysUser.class))).thenReturn(Mono.just(testUser)); + + ServerRequest request = MockServerRequest.builder() + .body(Mono.just(registerRequest)); + Mono response = authHandler.register(request); + + StepVerifier.create(response) + .expectNextMatches(serverResponse -> + serverResponse.statusCode() == HttpStatus.CREATED) + .verifyComplete(); + + verify(userService).findByUsername("newuser"); + verify(passwordEncoder).encode("password123"); + verify(userService).createUser(any(SysUser.class)); + } + + @Test + void testRegister_UsernameExists() { + UserRegisterRequest registerRequest = new UserRegisterRequest(); + registerRequest.setUsername("testuser"); + registerRequest.setPassword("password123"); + registerRequest.setEmail("new@example.com"); + + when(userService.findByUsername("testuser")).thenReturn(Mono.just(testUser)); + when(passwordEncoder.encode("password123")).thenReturn("encoded_password"); + when(userService.createUser(any(SysUser.class))).thenReturn(Mono.just(testUser)); + + ServerRequest request = MockServerRequest.builder() + .body(Mono.just(registerRequest)); + Mono response = authHandler.register(request); + + StepVerifier.create(response) + .expectErrorMatches(ex -> ex.getMessage().contains("用户名已存在")) + .verify(); + + verify(userService).findByUsername("testuser"); + } + + @Test + void testLogout() { + ServerRequest request = MockServerRequest.builder().build(); + Mono response = authHandler.logout(request); + + StepVerifier.create(response) + .expectNextMatches(serverResponse -> + serverResponse.statusCode() == HttpStatus.OK) + .verifyComplete(); + } +} \ No newline at end of file diff --git a/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/handler/stats/StatsHandlerTest.java b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/handler/stats/StatsHandlerTest.java new file mode 100644 index 0000000..7e2f897 --- /dev/null +++ b/novalon-manage-api/manage-sys/src/test/java/cn/novalon/manage/sys/handler/stats/StatsHandlerTest.java @@ -0,0 +1,60 @@ +package cn.novalon.manage.sys.handler.stats; + +import cn.novalon.manage.sys.core.service.ISysUserService; +import cn.novalon.manage.sys.core.service.ISysRoleService; +import cn.novalon.manage.sys.core.service.IOperationLogService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.HttpStatus; +import org.springframework.mock.web.reactive.function.server.MockServerRequest; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class StatsHandlerTest { + + @Mock + private ISysUserService userService; + + @Mock + private ISysRoleService roleService; + + @Mock + private IOperationLogService operationLogService; + + private StatsHandler statsHandler; + + @BeforeEach + void setUp() { + statsHandler = new StatsHandler(userService, roleService, operationLogService); + } + + @Test + void testGetOverview() { + when(userService.count()).thenReturn(Mono.just(100L)); + when(roleService.count()).thenReturn(Mono.just(10L)); + when(operationLogService.count()).thenReturn(Mono.just(1000L)); + when(operationLogService.countToday()).thenReturn(Mono.just(50L)); + + ServerRequest request = MockServerRequest.builder().build(); + Mono response = statsHandler.getOverview(request); + + StepVerifier.create(response) + .expectNextMatches(serverResponse -> + serverResponse.statusCode() == HttpStatus.OK) + .verifyComplete(); + + verify(userService).count(); + verify(roleService).count(); + verify(operationLogService).count(); + verify(operationLogService).countToday(); + } +} \ No newline at end of file