|
@@ -149,6 +149,42 @@ class ClasspathOutlookExamSprintReportRendererTest {
|
|
|
assertCssRuleContains(html, ".header-generated-at", "width: 33.3333%;", "text-align: right;");
|
|
assertCssRuleContains(html, ".header-generated-at", "width: 33.3333%;", "text-align: right;");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 覆盖展望报告主标题动态展示场景,当调用方提供 StageExaminName 时,应使用该考试名称生成页面标题。
|
|
|
|
|
+ */
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void renderUsesStageExaminNameForDynamicReportTitle() throws Exception {
|
|
|
|
|
+ ClasspathOutlookExamSprintReportRenderer renderer = new ClasspathOutlookExamSprintReportRenderer(OBJECT_MAPPER);
|
|
|
|
|
+ ObjectNode payload = (ObjectNode) callerVocabularyPayload();
|
|
|
|
|
+ payload.put("StageExaminName", "中考");
|
|
|
|
|
+
|
|
|
|
|
+ String html = renderer.render(unmodeledOutlookContent(payload), Instant.parse("2026-05-13T02:08:54.657335Z"));
|
|
|
|
|
+
|
|
|
|
|
+ assertThat(html)
|
|
|
|
|
+ .contains("<title>中考英语临考词汇突击潜力展望报告</title>")
|
|
|
|
|
+ .contains("<h1 class=\"report-title\">中考英语临考词汇突击潜力展望报告</h1>")
|
|
|
|
|
+ .doesNotContain("<title>高考英语临考词汇突击潜力展望报告</title>")
|
|
|
|
|
+ .doesNotContain("<h1 class=\"report-title\">高考英语临考词汇突击潜力展望报告</h1>");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 覆盖展望报告主标题安全渲染场景,当 StageExaminName 包含 HTML 片段时,应转义后写入标题。
|
|
|
|
|
+ */
|
|
|
|
|
+ @Test
|
|
|
|
|
+ void renderEscapesStageExaminNameInDynamicReportTitle() throws Exception {
|
|
|
|
|
+ ClasspathOutlookExamSprintReportRenderer renderer = new ClasspathOutlookExamSprintReportRenderer(OBJECT_MAPPER);
|
|
|
|
|
+ ObjectNode payload = (ObjectNode) callerVocabularyPayload();
|
|
|
|
|
+ payload.put("StageExaminName", "注入考试<script>alert(1)</script>");
|
|
|
|
|
+
|
|
|
|
|
+ String html = renderer.render(unmodeledOutlookContent(payload), Instant.parse("2026-05-13T02:08:54.657335Z"));
|
|
|
|
|
+
|
|
|
|
|
+ assertThat(html)
|
|
|
|
|
+ .contains("<title>注入考试<script>alert(1)</script>英语临考词汇突击潜力展望报告</title>")
|
|
|
|
|
+ .contains("<h1 class=\"report-title\">注入考试<script>alert(1)</script>英语临考词汇突击潜力展望报告</h1>")
|
|
|
|
|
+ .doesNotContain("<title>注入考试<script>alert(1)</script>英语临考词汇突击潜力展望报告</title>")
|
|
|
|
|
+ .doesNotContain("<h1 class=\"report-title\">注入考试<script>alert(1)</script>英语临考词汇突击潜力展望报告</h1>");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Test
|
|
@Test
|
|
|
void renderUsesCompactModuleOneCardLayout() throws Exception {
|
|
void renderUsesCompactModuleOneCardLayout() throws Exception {
|
|
|
ClasspathOutlookExamSprintReportRenderer renderer = new ClasspathOutlookExamSprintReportRenderer(OBJECT_MAPPER);
|
|
ClasspathOutlookExamSprintReportRenderer renderer = new ClasspathOutlookExamSprintReportRenderer(OBJECT_MAPPER);
|