feat: 效果修改
All checks were successful
缓存序列化结构检查 / cache-schema-check (push) Has been skipped

This commit is contained in:
2026-07-14 11:32:30 +08:00
parent d0f10e5479
commit 4da632bd5c
3 changed files with 439 additions and 38 deletions

View File

@@ -5,6 +5,11 @@ import com.codechecker.cache.diff.SchemaChange;
import com.codechecker.cache.diff.Severity;
import org.junit.jupiter.api.Test;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -20,33 +25,69 @@ class ReportBuilderTest {
report.setModifier("dongzi");
report.setModifyTime("2026-07-13 16:54:17");
SchemaChange detail = new SchemaChange(ChangeType.WRAPPER_ADDED);
detail.setSeverity(Severity.P0);
detail.setKeyPattern("tenant:db:content:*");
detail.setWriteLocation("Helper#put:10");
detail.setFieldPath("vo");
detail.setMessage("新增包装层 vo");
report.getChanges().add(detail);
SchemaChange addedMsg = new SchemaChange(ChangeType.FIELD_ADDED);
addedMsg.setSeverity(Severity.P1);
addedMsg.setKeyPattern("saas:period-config:migration:current");
addedMsg.setFieldPath("message");
addedMsg.setMessage("新增字段 message");
SchemaChange addedErr = new SchemaChange(ChangeType.FIELD_ADDED);
addedErr.setSeverity(Severity.P1);
addedErr.setKeyPattern("saas:period-config:migration:current");
addedErr.setFieldPath("lastError");
addedErr.setMessage("新增字段 lastError");
report.getChanges().add(addedMsg);
report.getChanges().add(addedErr);
KeyStructureChange key = new KeyStructureChange();
key.setKeyPattern("tenant:db:content:*");
key.setOldSkeletonJson("{\"dbName\":\"\",\"linkList\":[{\"id\":\"\"}]}");
key.setNewSkeletonJson("{\"vo\":{\"dbName\":\"\",\"linkList\":[{\"id\":\"\"}]},\"expiresAtMs\":0}");
key.setSeverity(Severity.P0);
key.setKeyPattern("saas:period-config:migration:current");
key.setOldSkeletonJson(
"{\"taskId\":\"\",\"status\":\"\",\"progress\":{\"totalTenants\":0}}");
key.setNewSkeletonJson(
"{\"taskId\":\"\",\"status\":\"\",\"progress\":{\"totalTenants\":0},\"message\":\"\",\"lastError\":\"\"}");
key.setSeverity(Severity.P1);
key.getFieldDetails().add(addedMsg);
key.getFieldDetails().add(addedErr);
report.getKeyChanges().add(key);
String md = new ReportBuilder("[缓存结构变更]").toMarkdown(report);
assertTrue(md.startsWith("## [缓存结构变更] jnpf-java-cloud"));
assertTrue(md.contains("> **分支**: code/redis_change_detection_v1.0"));
assertTrue(md.contains("> **时间**: 2026-07-13 16:54:17"));
assertTrue(md.contains("- **Key --> tenant:db:content:*\u200b**"));
assertTrue(md.contains("<font color=\"info\">{\"dbName\":\"\",\"linkList\":[{\"id\":\"\"}]}</font>"));
assertTrue(md.contains("<font color=\"warning\">{\"vo\":{\"dbName\":\"\",\"linkList\":[{\"id\":\"\"}]},\"expiresAtMs\":0}</font>"));
assertTrue(md.contains("- Key --> <font color=\"warning\">saas:period-config:migration:current\u200b</font>"));
assertTrue(md.contains("value 值从"));
assertTrue(md.contains("变更为"));
// 新增字段仅在新骨架中 warning 标注
assertTrue(md.contains("<font color=\"warning\">`\"message\":\"\"`</font>"));
assertTrue(md.contains("<font color=\"warning\">`\"lastError\":\"\"`</font>"));
// 旧骨架不应出现这两个字段的 warning
int oldSection = md.indexOf("value 值从");
int newSection = md.indexOf("变更为");
String oldPart = md.substring(oldSection, newSection);
assertFalse(oldPart.contains("<font color=\"warning\">`\"message\":\"\"`</font>"));
assertFalse(md.contains("### P0"));
assertFalse(md.contains("位置"));
assertFalse(md.contains("模式"));
assertFalse(md.contains("汇总"));
}
@Test
void removedFieldsHighlightedOnlyInOldSkeleton() {
SchemaChange removed = new SchemaChange(ChangeType.FIELD_REMOVED);
removed.setFieldPath("lastError");
removed.setMessage("删除字段 lastError");
String oldJson = "{\"taskId\":\"\",\"lastError\":\"\"}";
String newJson = "{\"taskId\":\"\"}";
Set<String> oldPaths = SkeletonAnnotator.pathsForOldSkeleton(Collections.singletonList(removed));
Set<String> newPaths = SkeletonAnnotator.pathsForNewSkeleton(Collections.singletonList(removed));
assertEquals(Collections.singleton("lastError"), oldPaths);
assertTrue(newPaths.isEmpty());
String oldMd = SkeletonAnnotator.annotateAsCodeBlock(oldJson, oldPaths);
String newMd = SkeletonAnnotator.annotateAsCodeBlock(newJson, newPaths);
assertTrue(oldMd.contains("<font color=\"warning\">`\"lastError\":\"\"`</font>"));
assertFalse(newMd.contains("lastError"));
assertTrue(newMd.startsWith("`"));
}
@Test
@@ -60,6 +101,7 @@ class ReportBuilderTest {
detail.setSeverity(Severity.P0);
detail.setKeyPattern("k1");
detail.setWriteLocation("Foo#bar:1");
detail.setFieldPath("x");
detail.setMessage("删除字段 x");
report.getChanges().add(detail);
@@ -67,6 +109,7 @@ class ReportBuilderTest {
key.setKeyPattern("k1");
key.setOldSkeletonJson("{\"x\":\"\"}");
key.setNewSkeletonJson("{}");
key.getFieldDetails().add(detail);
report.getKeyChanges().add(key);
String console = new ReportBuilder("[缓存结构变更]").toConsole(report);
@@ -75,8 +118,16 @@ class ReportBuilderTest {
assertTrue(console.contains("**删除字段**: x"));
assertTrue(console.contains("======== 企微 Markdown ========"));
assertTrue(console.contains("value 值从"));
assertTrue(console.contains("- **Key --> k1\u200b**"));
assertTrue(console.contains("<font color=\"info\">"));
assertTrue(console.contains("<font color=\"warning\">"));
assertTrue(console.contains("<font color=\"warning\">`\"x\":\"\"`</font>"));
}
@Test
void pathAwareNestedHighlight() {
String json = "{\"vo\":{\"dbName\":\"\",\"id\":\"\"},\"expiresAtMs\":0}";
Set<String> paths = new LinkedHashSet<>();
paths.add("vo.dbName");
String out = SkeletonAnnotator.annotate(json, paths);
assertTrue(out.contains("<font color=\"warning\">\"dbName\":\"\"</font>"));
assertFalse(out.contains("<font color=\"warning\">\"id\":\"\"</font>"));
}
}