This commit is contained in:
@@ -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>"));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user