feat: 完善系统配置审计通知功能并优化异常处理

- 新增异常处理体系(BaseException及其子类)
- 优化密码、邮箱、用户名等基础类型
- 添加字典管理、登录日志、操作日志的E2E测试
- 完善API集成测试和安全测试
- 添加性能测试配置和脚本
- 优化OpenAPI配置和全局异常处理器
This commit is contained in:
张翔
2026-03-24 14:05:35 +08:00
parent be5d5ede90
commit e4721053bd
47 changed files with 3006 additions and 816 deletions
@@ -1,60 +1,297 @@
package cn.novalon.manage.db.dao;
import cn.novalon.manage.db.entity.SysUserQueryCriteria;
import cn.novalon.manage.db.dao.QueryField;
import cn.novalon.manage.db.dao.QueryUtil;
import org.junit.jupiter.api.Test;
import org.springframework.data.relational.core.query.Criteria;
import org.springframework.data.relational.core.query.Query;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
/**
* QueryUtil详细测试
* QueryUtil详细测试 - 提升分支覆盖率
*
* @author 张翔
* @date 2026-03-24
*/
class QueryUtilDetailedTest {
@Test
void testBlurrySearchCriteria() {
SysUserQueryCriteria criteria = new SysUserQueryCriteria();
criteria.setKeyword("search");
Query query = QueryUtil.getQuery(criteria);
System.out.println("生成的Query: " + query);
System.out.println("生成的Criteria: " + query.getCriteria());
assertTrue(true, "模糊搜索功能已实现");
}
@Test
void testBlurrySearchWithDeletedFilter() {
SysUserQueryCriteria criteria = new SysUserQueryCriteria();
criteria.setKeyword("search");
Query query = QueryUtil.getQuery(criteria, true);
System.out.println("带deletedAt过滤的Query: " + query);
System.out.println("带deletedAt过滤的Criteria: " + query.getCriteria());
assertTrue(true, "模糊搜索和deletedAt过滤功能已实现");
}
@Test
void testOrCriteriaLogic() {
String[] blurrys = {"username", "email"};
String val = "search";
Criteria criteria = Criteria.empty();
for (String s : blurrys) {
criteria = criteria.or(s).like("%" + val + "%");
static class TestQuery {
@QueryField(propName = "name", type = QueryField.Type.EQUAL)
private String name;
@QueryField(propName = "age", type = QueryField.Type.GREATER_THAN)
private Integer age;
@QueryField(propName = "score", type = QueryField.Type.LESS_THAN)
private Integer score;
@QueryField(propName = "status", type = QueryField.Type.INNER_LIKE)
private String status;
@QueryField(propName = "email", type = QueryField.Type.LEFT_LIKE)
private String email;
@QueryField(propName = "phone", type = QueryField.Type.RIGHT_LIKE)
private String phone;
@QueryField(propName = "roles", type = QueryField.Type.IN)
private List<String> roles;
@QueryField(propName = "keyword", blurry = "name,description,content")
private String keyword;
@QueryField(propName = "deletedAt", type = QueryField.Type.IS_NULL)
private String deletedAt;
@QueryField(propName = "updatedAt", type = QueryField.Type.IS_NOT_NULL)
private String updatedAt;
@QueryField(propName = "orField", type = QueryField.Type.OR,
orPropVal = QueryField.Type.IS_NULL,
orPropNames = {"field1", "field2"})
private String orField;
public TestQuery() {}
public TestQuery(String name, Integer age, Integer score, String status, String email,
String phone, List<String> roles, String keyword, String deletedAt,
String updatedAt, String orField) {
this.name = name;
this.age = age;
this.score = score;
this.status = status;
this.email = email;
this.phone = phone;
this.roles = roles;
this.keyword = keyword;
this.deletedAt = deletedAt;
this.updatedAt = updatedAt;
this.orField = orField;
}
System.out.println("循环构建的Criteria: " + criteria);
String criteriaStr = criteria.toString();
System.out.println("Criteria字符串: " + criteriaStr);
assertTrue(criteriaStr.contains("username"), "应该包含username");
assertTrue(criteriaStr.contains("email"), "应该包含email");
assertTrue(criteriaStr.contains("OR"), "应该包含OR");
public String getName() { return name; }
public Integer getAge() { return age; }
public Integer getScore() { return score; }
public String getStatus() { return status; }
public String getEmail() { return email; }
public String getPhone() { return phone; }
public List<String> getRoles() { return roles; }
public String getKeyword() { return keyword; }
public String getDeletedAt() { return deletedAt; }
public String getUpdatedAt() { return updatedAt; }
public String getOrField() { return orField; }
}
@Test
void testNullQuery() {
Query query = QueryUtil.getQuery(null);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testQueryWithDeletedAtFilter() {
TestQuery testQuery = new TestQuery();
Query query = QueryUtil.getQuery(testQuery, true);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testQueryWithoutDeletedAtFilter() {
TestQuery testQuery = new TestQuery();
Query query = QueryUtil.getQuery(testQuery, false);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testEqualCondition() {
TestQuery testQuery = new TestQuery("John", null, null, null, null, null, null, null, null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testGreaterThanCondition() {
TestQuery testQuery = new TestQuery(null, 18, null, null, null, null, null, null, null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testLessThanCondition() {
TestQuery testQuery = new TestQuery(null, null, 100, null, null, null, null, null, null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testInnerLikeCondition() {
TestQuery testQuery = new TestQuery(null, null, null, "active", null, null, null, null, null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testLeftLikeCondition() {
TestQuery testQuery = new TestQuery(null, null, null, null, "@example.com", null, null, null, null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testRightLikeCondition() {
TestQuery testQuery = new TestQuery(null, null, null, null, null, "123", null, null, null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testInCondition() {
TestQuery testQuery = new TestQuery(null, null, null, null, null, null,
Arrays.asList("admin", "user"), null, null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testInConditionWithEmptyList() {
TestQuery testQuery = new TestQuery(null, null, null, null, null, null,
Collections.emptyList(), null, null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testBlurrySearchSingleField() {
TestQuery testQuery = new TestQuery(null, null, null, null, null, null, null, "test", null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testBlurrySearchMultipleFields() {
TestQuery testQuery = new TestQuery(null, null, null, null, null, null, null, "keyword", null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testIsNullCondition() {
TestQuery testQuery = new TestQuery(null, null, null, null, null, null, null, null, "null", null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testIsNotNullCondition() {
TestQuery testQuery = new TestQuery(null, null, null, null, null, null, null, null, null, "value", null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testOrConditionIsNull() {
TestQuery testQuery = new TestQuery(null, null, null, null, null, null, null, null, null, null, "value");
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testEmptyStringValue() {
TestQuery testQuery = new TestQuery("", null, null, null, null, null, null, null, null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testNullFieldValue() {
TestQuery testQuery = new TestQuery(null, null, null, null, null, null, null, null, null, null, null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testMultipleConditions() {
TestQuery testQuery = new TestQuery("John", 18, 100, "active", "@example.com",
"123", Arrays.asList("admin"), "test", null, "value", null);
Query query = QueryUtil.getQuery(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testQueryAllWithoutDeletedAtFilter() {
TestQuery testQuery = new TestQuery("John", 18, 100, "active", "@example.com",
"123", Arrays.asList("admin"), "test", null, "value", null);
Query query = QueryUtil.getQueryAll(testQuery);
assertNotNull(query);
Criteria criteria = query.getCriteria();
assertNotNull(criteria);
}
@Test
void testIsBlankWithNull() {
assertTrue(QueryUtil.isBlank(null));
}
@Test
void testIsBlankWithEmptyString() {
assertTrue(QueryUtil.isBlank(""));
}
@Test
void testIsBlankWithWhitespace() {
assertTrue(QueryUtil.isBlank(" "));
}
@Test
void testIsBlankWithValidString() {
assertFalse(QueryUtil.isBlank("test"));
}
@Test
void testIsBlankWithMixedWhitespace() {
assertFalse(QueryUtil.isBlank(" test "));
}
}