|
|
@@ -32,7 +32,7 @@ class ClasspathOutlookExamSprintReportRendererTest {
|
|
|
void renderBuildsOutlookHtmlAlignedWithDesignDraftDynamicStructure() throws Exception {
|
|
|
ClasspathOutlookExamSprintReportRenderer renderer = new ClasspathOutlookExamSprintReportRenderer(OBJECT_MAPPER);
|
|
|
|
|
|
- String html = renderer.render(unmodeledOutlookContent(callerVocabularyPayload()), Instant.parse("2026-01-03T08:00:00Z"));
|
|
|
+ String html = renderer.render(unmodeledOutlookContent(callerVocabularyPayloadWithComplex(true)), Instant.parse("2026-01-03T08:00:00Z"));
|
|
|
|
|
|
assertThat(html)
|
|
|
.contains("class=\"analysis-table\"")
|
|
|
@@ -138,9 +138,46 @@ class ClasspathOutlookExamSprintReportRendererTest {
|
|
|
.contains("王雷宇")
|
|
|
.doesNotContain("{{syllabusMasterySection}}")
|
|
|
.doesNotContain("{{pastPaperVocabularySection}}")
|
|
|
+ .doesNotContain("{{moduleThreeSection}}")
|
|
|
.doesNotContain("{{studySuggestionSection}}");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 覆盖展望报告模块三按 Complex 开关展示的场景,当 Complex=false 时,模块三标题和案例内容都不应出现在 HTML 中。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void renderHidesModuleThreeWhenComplexIsFalse() throws Exception {
|
|
|
+ ClasspathOutlookExamSprintReportRenderer renderer = new ClasspathOutlookExamSprintReportRenderer(OBJECT_MAPPER);
|
|
|
+
|
|
|
+ String html = renderer.render(unmodeledOutlookContent(callerVocabularyPayloadWithComplex(false)), Instant.parse("2026-01-03T08:00:00Z"));
|
|
|
+
|
|
|
+ assertThat(html)
|
|
|
+ .contains("模块一:个人学情分析")
|
|
|
+ .contains("模块二:科学备考建议")
|
|
|
+ .doesNotContain("模块三:上届学员提分案例")
|
|
|
+ .doesNotContain("class='student-case'")
|
|
|
+ .doesNotContain("王雷宇")
|
|
|
+ .doesNotContain("{{moduleThreeSection}}")
|
|
|
+ .doesNotContain("+19分");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 覆盖展望报告模块三按 Complex 开关展示的场景,当 Complex=true 时,模块三标题和案例内容应正常渲染。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void renderShowsModuleThreeWhenComplexIsTrue() throws Exception {
|
|
|
+ ClasspathOutlookExamSprintReportRenderer renderer = new ClasspathOutlookExamSprintReportRenderer(OBJECT_MAPPER);
|
|
|
+
|
|
|
+ String html = renderer.render(unmodeledOutlookContent(callerVocabularyPayloadWithComplex(true)), Instant.parse("2026-01-03T08:00:00Z"));
|
|
|
+
|
|
|
+ assertThat(html)
|
|
|
+ .contains("模块三:上届学员提分案例")
|
|
|
+ .contains("class='student-case'")
|
|
|
+ .contains("王雷宇")
|
|
|
+ .doesNotContain("{{moduleThreeSection}}")
|
|
|
+ .contains("+19分");
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 覆盖官方词汇 payload 计算出 0 值区间时,对应柱状图高度应保持为 0 且不被最小高度兜底抬高。
|
|
|
*/
|
|
|
@@ -233,7 +270,7 @@ class ClasspathOutlookExamSprintReportRendererTest {
|
|
|
void renderDeclaresBatikCjkFontFamilyOnEveryInlineSvg() throws Exception {
|
|
|
ClasspathOutlookExamSprintReportRenderer renderer = new ClasspathOutlookExamSprintReportRenderer(OBJECT_MAPPER);
|
|
|
|
|
|
- String html = renderer.render(unmodeledOutlookContent(callerVocabularyPayload()), Instant.parse("2026-01-03T08:00:00Z"));
|
|
|
+ String html = renderer.render(unmodeledOutlookContent(callerVocabularyPayloadWithComplex(true)), Instant.parse("2026-01-03T08:00:00Z"));
|
|
|
|
|
|
assertThat(html)
|
|
|
.contains("<svg class='syllabus-donut-chart' font-family=\"'MiSans VF', MiSans, ReportFont, sans-serif\"")
|
|
|
@@ -383,7 +420,7 @@ class ClasspathOutlookExamSprintReportRendererTest {
|
|
|
void renderCaseStudyRingAnchorsCenterCopyAsCircleCenteredLabelGroup() throws Exception {
|
|
|
ClasspathOutlookExamSprintReportRenderer renderer = new ClasspathOutlookExamSprintReportRenderer(OBJECT_MAPPER);
|
|
|
|
|
|
- String html = renderer.render(unmodeledOutlookContent(callerVocabularyPayload()), Instant.parse("2026-01-03T08:00:00Z"));
|
|
|
+ String html = renderer.render(unmodeledOutlookContent(callerVocabularyPayloadWithComplex(true)), Instant.parse("2026-01-03T08:00:00Z"));
|
|
|
|
|
|
String caseStudySvg = extractSvgByAriaLabel(html, "上届学员提分案例图示");
|
|
|
|
|
|
@@ -471,6 +508,12 @@ class ClasspathOutlookExamSprintReportRendererTest {
|
|
|
""");
|
|
|
}
|
|
|
|
|
|
+ private JsonNode callerVocabularyPayloadWithComplex(boolean complex) throws Exception {
|
|
|
+ ObjectNode payload = (ObjectNode) callerVocabularyPayload();
|
|
|
+ payload.put("Complex", complex);
|
|
|
+ return payload;
|
|
|
+ }
|
|
|
+
|
|
|
private JsonNode callerVocabularyPayloadWithZeroValueBars() throws Exception {
|
|
|
ObjectNode payload = (ObjectNode) callerVocabularyPayload();
|
|
|
payload.withArray("StudentWordsLatest").forEach(node -> {
|
|
|
@@ -483,7 +526,7 @@ class ClasspathOutlookExamSprintReportRendererTest {
|
|
|
}
|
|
|
|
|
|
private JsonNode callerVocabularyPayloadWithMismatchedPastPaperCounts() throws Exception {
|
|
|
- ObjectNode payload = (ObjectNode) callerVocabularyPayload();
|
|
|
+ ObjectNode payload = (ObjectNode) callerVocabularyPayloadWithComplex(true);
|
|
|
payload.put("TestPaperMastedWordCount", 4);
|
|
|
payload.putArray("TestPaperUnMasterWords")
|
|
|
.add("lot")
|
|
|
@@ -493,7 +536,7 @@ class ClasspathOutlookExamSprintReportRendererTest {
|
|
|
}
|
|
|
|
|
|
private JsonNode normalizedCallerVocabularyPayloadWithStudentNameAliases() throws Exception {
|
|
|
- ObjectNode payload = (ObjectNode) callerVocabularyPayload();
|
|
|
+ ObjectNode payload = (ObjectNode) callerVocabularyPayloadWithComplex(true);
|
|
|
payload.put("StudentName", "20260318测试");
|
|
|
payload.put("studentName", "20260318测试");
|
|
|
return payload;
|