package com.example.erp.module.usr; import com.example.erp.common.exception.BizException; import com.example.erp.config.UserPrincipal; import com.example.erp.module.usr.dto.UserCreateReqDTO; import com.example.erp.module.usr.entity.StaffEntity; import com.example.erp.module.usr.entity.UsrUserEntity; import com.example.erp.module.usr.entity.UserPermissionEntity; import com.example.erp.module.usr.mapper.PermissionGroupMapper; import com.example.erp.module.usr.mapper.StaffMapper; import com.example.erp.common.constants.UsrErrorCode; import com.example.erp.module.usr.mapper.UserPermissionMapper; import com.example.erp.module.usr.mapper.UsrUserMapper; import com.example.erp.module.usr.service.impl.UserServiceImpl; import com.example.erp.module.usr.vo.UserCreateRespVO; import org.junit.jupiter.api.BeforeEach; 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 org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import java.util.List; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class UserServiceTest { @Mock private UsrUserMapper userMapper; @Mock private StaffMapper staffMapper; @Mock private PermissionGroupMapper permGroupMapper; @Mock private UserPermissionMapper userPermissionMapper; @Mock private BCryptPasswordEncoder passwordEncoder; @InjectMocks private UserServiceImpl userService; private UserCreateReqDTO req; private UserPrincipal superAdmin; private UserPrincipal normalUser; @BeforeEach void setUp() { req = new UserCreateReqDTO(); req.setUserCode("UC001"); req.setUsername("testuser"); req.setUserType("普通用户"); req.setLanguage("中文"); superAdmin = new UserPrincipal("u1", "admin", "超级管理员", "b1"); normalUser = new UserPrincipal("u2", "user", "普通用户", "b1"); } @Test void createUser_normalUser_throws40300() { BizException ex = assertThrows(BizException.class, () -> userService.createUser(req, normalUser)); assertEquals(40300, ex.getCode()); } @Test void createUser_success_insertsUserAndReturnsVO() { when(userMapper.selectCount(any())).thenReturn(0L); when(passwordEncoder.encode(anyString())).thenReturn("$2a$10$hashed"); when(userMapper.insert(any(UsrUserEntity.class))).thenReturn(1); UserCreateRespVO vo = userService.createUser(req, superAdmin); assertNotNull(vo.getUserId()); assertEquals("UC001", vo.getUserCode()); assertEquals("testuser", vo.getUsername()); verify(userMapper).insert(any(UsrUserEntity.class)); } @Test void createUser_duplicateUserCode_throws40902() { when(userMapper.selectCount(any())).thenReturn(1L); BizException ex = assertThrows(BizException.class, () -> userService.createUser(req, superAdmin)); assertEquals(40902, ex.getCode()); } @Test void createUser_duplicateUsername_throws40901() { when(userMapper.selectCount(any())).thenReturn(0L, 1L); BizException ex = assertThrows(BizException.class, () -> userService.createUser(req, superAdmin)); assertEquals(40901, ex.getCode()); } @Test @SuppressWarnings("unchecked") void createUser_withPermGroups_insertsPermissions() { req.setPermGroupIds(List.of("g1", "g2")); when(userMapper.selectCount(any())).thenReturn(0L); when(passwordEncoder.encode(anyString())).thenReturn("$2a$10$hashed"); when(userMapper.insert(any(UsrUserEntity.class))).thenReturn(1); userService.createUser(req, superAdmin); verify(userPermissionMapper).insert(argThat((java.util.Collection c) -> c.size() == 2)); } @Test void createUser_invalidEmployeeId_throws40001() { req.setEmployeeId("bad-staff-id"); when(userMapper.selectCount(any())).thenReturn(0L); when(staffMapper.selectOne(any())).thenReturn(null); BizException ex = assertThrows(BizException.class, () -> userService.createUser(req, superAdmin)); assertEquals(UsrErrorCode.EMPLOYEE_NOT_FOUND, ex.getCode()); } }