gaoluyang
9 小时以前 6de15528a3ba8f9c87d9aaffe895e69fdcdc9026
yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImplTest.java
@@ -9,6 +9,7 @@
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
import cn.iocoder.yudao.module.infra.api.file.FileApi;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptListReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserImportExcelVO;
@@ -23,6 +24,7 @@
import cn.iocoder.yudao.module.system.dal.mysql.dept.UserPostMapper;
import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper;
import cn.iocoder.yudao.module.system.enums.common.SexEnum;
import cn.iocoder.yudao.module.system.mq.producer.user.AdminUserProducer;
import cn.iocoder.yudao.module.system.service.dept.DeptService;
import cn.iocoder.yudao.module.system.service.dept.PostService;
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
@@ -36,6 +38,7 @@
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -85,6 +88,8 @@
    private ConfigApi configApi;
    @MockitoBean
    private OAuth2TokenService oauth2TokenService;
    @MockitoBean
    private AdminUserProducer adminUserProducer;
    @BeforeEach
    public void before() {
@@ -414,20 +419,20 @@
    @Test
    public void testImportUserList_01() {
        // 准备参数
        UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> {
            o.setEmail(randomEmail());
            o.setMobile(randomMobile());
        });
        UserImportExcelVO importUser = randomImportUser(o -> o.setUsername(randomString()));
        // mock 部门、岗位,让「部门」「岗位」两列能解析到
        mockDeptAndPostList("研发部", "普通员工");
        // mock 方法,模拟失败
        doThrow(new ServiceException(DEPT_NOT_FOUND)).when(deptService).validateDeptList(any());
        // 调用
        UserImportRespVO respVO = userService.importUserList(newArrayList(importUser), true);
        // 断言
        // 断言:失败明细的 key 定位到具体行
        assertEquals(0, respVO.getCreateUsernames().size());
        assertEquals(0, respVO.getUpdateUsernames().size());
        assertEquals(1, respVO.getFailureUsernames().size());
        assertEquals(DEPT_NOT_FOUND.getMsg(), respVO.getFailureUsernames().get(importUser.getUsername()));
        assertEquals(DEPT_NOT_FOUND.getMsg(),
                respVO.getFailureUsernames().get(buildRowKey(1, importUser.getUsername())));
    }
    /**
@@ -436,18 +441,9 @@
    @Test
    public void testImportUserList_02() {
        // 准备参数
        UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> {
            o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围
            o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围
            o.setEmail(randomEmail());
            o.setMobile(randomMobile());
        });
        // mock deptService 的方法
        DeptDO dept = randomPojo(DeptDO.class, o -> {
            o.setId(importUser.getDeptId());
            o.setStatus(CommonStatusEnum.ENABLE.getStatus());
        });
        when(deptService.getDept(eq(dept.getId()))).thenReturn(dept);
        UserImportExcelVO importUser = randomImportUser(o -> o.setUsername(randomString()));
        // mock 部门、岗位
        Long deptId = mockDeptAndPostList("研发部", "普通员工");
        // mock passwordEncoder 的方法
        when(passwordEncoder.encode(eq("yudaoyuanma"))).thenReturn("java");
@@ -456,8 +452,10 @@
        // 断言
        assertEquals(1, respVO.getCreateUsernames().size());
        AdminUserDO user = userMapper.selectByUsername(respVO.getCreateUsernames().get(0));
        assertPojoEquals(importUser, user);
        assertPojoEquals(importUser, user, "dept", "post", "password"); // dept、post 在库里存的是编号
        assertEquals("java", user.getPassword());
        assertEquals(deptId, user.getDeptId()); //「部门」列填的名称翻译成了部门编号
        assertEquals(1, userPostMapper.selectListByUserId(user.getId()).size()); //「岗位」列同步写入了用户-岗位关联
        assertEquals(0, respVO.getUpdateUsernames().size());
        assertEquals(0, respVO.getFailureUsernames().size());
    }
@@ -471,27 +469,20 @@
        AdminUserDO dbUser = randomAdminUserDO();
        userMapper.insert(dbUser);
        // 准备参数
        UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> {
            o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围
            o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围
            o.setUsername(dbUser.getUsername());
            o.setEmail(randomEmail());
            o.setMobile(randomMobile());
        });
        // mock deptService 的方法
        DeptDO dept = randomPojo(DeptDO.class, o -> {
            o.setId(importUser.getDeptId());
            o.setStatus(CommonStatusEnum.ENABLE.getStatus());
        });
        when(deptService.getDept(eq(dept.getId()))).thenReturn(dept);
        UserImportExcelVO importUser = randomImportUser(o -> o.setUsername(dbUser.getUsername()));
        // mock 部门、岗位
        mockDeptAndPostList("研发部", "普通员工");
        // 调用
        UserImportRespVO respVO = userService.importUserList(newArrayList(importUser), false);
        // 断言
        // 断言:提示里要告诉用户怎么改(勾选覆盖或换账号)
        assertEquals(0, respVO.getCreateUsernames().size());
        assertEquals(0, respVO.getUpdateUsernames().size());
        assertEquals(1, respVO.getFailureUsernames().size());
        assertEquals(USER_USERNAME_EXISTS.getMsg(), respVO.getFailureUsernames().get(importUser.getUsername()));
        String failureMessage = respVO.getFailureUsernames().get(buildRowKey(1, dbUser.getUsername()));
        assertNotNull(failureMessage);
        assertTrue(failureMessage.startsWith("用户账号已存在"));
        assertTrue(failureMessage.contains("是否覆盖"));
    }
    /**
@@ -503,19 +494,9 @@
        AdminUserDO dbUser = randomAdminUserDO();
        userMapper.insert(dbUser);
        // 准备参数
        UserImportExcelVO importUser = randomPojo(UserImportExcelVO.class, o -> {
            o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围
            o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围
            o.setUsername(dbUser.getUsername());
            o.setEmail(randomEmail());
            o.setMobile(randomMobile());
        });
        // mock deptService 的方法
        DeptDO dept = randomPojo(DeptDO.class, o -> {
            o.setId(importUser.getDeptId());
            o.setStatus(CommonStatusEnum.ENABLE.getStatus());
        });
        when(deptService.getDept(eq(dept.getId()))).thenReturn(dept);
        UserImportExcelVO importUser = randomImportUser(o -> o.setUsername(dbUser.getUsername()));
        // mock 部门、岗位
        Long deptId = mockDeptAndPostList("研发部", "普通员工");
        // 调用
        UserImportRespVO respVO = userService.importUserList(newArrayList(importUser), true);
@@ -523,10 +504,53 @@
        assertEquals(0, respVO.getCreateUsernames().size());
        assertEquals(1, respVO.getUpdateUsernames().size());
        AdminUserDO user = userMapper.selectByUsername(respVO.getUpdateUsernames().get(0));
        assertPojoEquals(importUser, user);
        assertPojoEquals(importUser, user, "dept", "post", "password"); // dept、post 在库里存的是编号
        assertEquals(deptId, user.getDeptId());
        assertEquals(dbUser.getPassword(), user.getPassword()); // 覆盖时不能把在用账号的密码改掉
        assertEquals(1, userPostMapper.selectListByUserId(user.getId()).size());
        assertEquals(0, respVO.getFailureUsernames().size());
    }
    /**
     * 生成一个「部门、岗位、密码」都填好的导入行:
     * 部门、岗位填的是名称(用于校验名称翻译成编号),密码留空(用于校验走系统配置的初始密码)
     */
    private UserImportExcelVO randomImportUser(Consumer<UserImportExcelVO> consumer) {
        return randomPojo(UserImportExcelVO.class, o -> {
            o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围
            o.setSex(randomEle(SexEnum.values()).getSex()); // 保证 sex 的范围
            o.setEmail(randomEmail());
            o.setMobile(randomMobile());
            o.setDept("研发部");
            o.setPost("普通员工");
            o.setPassword(null);
            consumer.accept(o);
        });
    }
    /** mock 部门、岗位的列表查询,让「部门」「岗位」两列填写的名称能解析到;返回部门的编号 */
    private Long mockDeptAndPostList(String deptName, String... postNames) {
        DeptDO dept = randomPojo(DeptDO.class, o -> {
            o.setName(deptName);
            o.setStatus(CommonStatusEnum.ENABLE.getStatus());
        });
        when(deptService.getDeptList(any(DeptListReqVO.class))).thenReturn(newArrayList(dept));
        List<PostDO> posts = new ArrayList<>();
        for (String postName : postNames) {
            posts.add(randomPojo(PostDO.class, o -> {
                o.setName(postName);
                o.setStatus(CommonStatusEnum.ENABLE.getStatus());
            }));
        }
        when(postService.getPostList(any(), any())).thenReturn(posts);
        return dept.getId();
    }
    /** 失败明细的 key:与 AdminUserServiceImpl#importUserList 里拼的行号文案保持一致 */
    private String buildRowKey(int rowIndex, String username) {
        return "第 " + rowIndex + " 行「" + username + "」";
    }
    @Test
    public void testValidateUserExists_notExists() {
        assertServiceException(() -> userService.validateUserExists(randomLongId()), USER_NOT_EXISTS);