feat: 扩展用户管理统一搜索范围
- 支持按账号、昵称、电话、邮件和角色名搜索 - 补充搜索提示、特殊字符处理及前后端测试
This commit is contained in:
@@ -2,6 +2,7 @@ package tech.easyflow.admin.controller.system;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.mybatisflex.core.query.QueryWrapper;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.mockito.MockedStatic;
|
||||
import org.testng.annotations.Test;
|
||||
import tech.easyflow.auth.service.AuthCredentialKeyService;
|
||||
@@ -15,7 +16,9 @@ import tech.easyflow.system.service.SysAccountService;
|
||||
import tech.easyflow.system.service.SysRoleService;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
@@ -27,12 +30,79 @@ import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import static org.testng.Assert.assertFalse;
|
||||
import static org.testng.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* {@link SysAccountController} 创建账号测试。
|
||||
*/
|
||||
public class SysAccountControllerTest {
|
||||
|
||||
/**
|
||||
* 验证统一关键字覆盖账号字段和关联角色名称,并保留租户关联条件。
|
||||
*/
|
||||
@Test
|
||||
public void buildQueryWrapperShouldSearchAccountFieldsAndRoleName() {
|
||||
SysAccountController controller = new SysAccountController(
|
||||
mock(SysAccountService.class),
|
||||
mock(AuthCredentialKeyService.class),
|
||||
mock(SysRoleService.class)
|
||||
);
|
||||
HttpServletRequest request = mock(HttpServletRequest.class);
|
||||
when(request.getParameter("keyword")).thenReturn(" search-user ");
|
||||
|
||||
QueryWrapper queryWrapper = controller.buildQueryWrapper(request);
|
||||
|
||||
String sql = queryWrapper.toSQL().toLowerCase(Locale.ROOT);
|
||||
assertTrue(sql.contains("login_name"), sql);
|
||||
assertTrue(sql.contains("nickname"), sql);
|
||||
assertTrue(sql.contains("mobile"), sql);
|
||||
assertTrue(sql.contains("email"), sql);
|
||||
assertTrue(sql.contains("exists"), sql);
|
||||
assertTrue(sql.contains("tb_sys_account_role"), sql);
|
||||
assertTrue(sql.contains("tb_sys_role"), sql);
|
||||
assertTrue(sql.contains("role_name"), sql);
|
||||
assertTrue(sql.contains("tenant_id"), sql);
|
||||
assertTrue(sql.contains("search-user"), sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证空关键字不会产生额外筛选条件。
|
||||
*/
|
||||
@Test
|
||||
public void buildQueryWrapperShouldIgnoreBlankKeyword() {
|
||||
SysAccountController controller = new SysAccountController(
|
||||
mock(SysAccountService.class),
|
||||
mock(AuthCredentialKeyService.class),
|
||||
mock(SysRoleService.class)
|
||||
);
|
||||
HttpServletRequest request = mock(HttpServletRequest.class);
|
||||
when(request.getParameter("keyword")).thenReturn(" ");
|
||||
when(request.getParameterMap()).thenReturn(Collections.emptyMap());
|
||||
|
||||
QueryWrapper queryWrapper = controller.buildQueryWrapper(request);
|
||||
|
||||
assertFalse(queryWrapper.hasCondition());
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证 LIKE 通配符和反斜杠按普通字符参与搜索。
|
||||
*/
|
||||
@Test
|
||||
public void buildQueryWrapperShouldEscapeLikePatternCharacters() {
|
||||
SysAccountController controller = new SysAccountController(
|
||||
mock(SysAccountService.class),
|
||||
mock(AuthCredentialKeyService.class),
|
||||
mock(SysRoleService.class)
|
||||
);
|
||||
HttpServletRequest request = mock(HttpServletRequest.class);
|
||||
when(request.getParameter("keyword")).thenReturn("a_b%c\\d");
|
||||
|
||||
String sql = controller.buildQueryWrapper(request).toSQL();
|
||||
|
||||
assertTrue(sql.contains("a\\\\_b\\\\%c\\\\\\\\d"), sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证创建用户时保留表单选择的部门,不被操作者部门覆盖。
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user