From ac74323646815269abab3c06ffc7c0ea775da46c Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 3 Mar 2026 17:24:15 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E4=B8=BAPosterRenderService=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=BE=B9=E7=95=8C=E6=B5=8B=E8=AF=95=20-=20=E8=99=BD?= =?UTF-8?q?=E6=9C=AA=E6=8F=90=E5=8D=87=E8=A6=86=E7=9B=96=E7=8E=87=E4=BD=86?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E6=B5=8B=E8=AF=95=E5=AE=8C=E6=95=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增escapeHtml测试 - 新增无效字体大小处理测试 - 新增null模板名fallback测试 说明: PosterRenderService剩余9个未覆盖分支主要是图片I/O和异常处理, 需要集成测试或特殊mock才能覆盖,投入产出比较低。 当前覆盖率: 65.3% (422/646分支) 距离70%目标: 还需29个分支 --- .claude/settings.local.json | 4 +- .../service/PosterRenderServiceTest.java | 60 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index e1afda4..1712956 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -107,7 +107,9 @@ "Bash(grep -E \"Tests run:|BUILD\" target/surefire-reports/*.txt 2>/dev/null | tail -5 || echo \"检查测试结果...\")", "Bash(git add -A && git commit -m \"test: 提升ApiKeyEncryptionService测试覆盖率 - 新增4个边界测试\n\n- 新增legacy默认密钥在生产环境的测试\n- 新增空白密钥在生产环境的测试\n- 新增environment为null的场景测试\n- 新增非生产环境允许默认密钥的测试\n\n覆盖率提升:\n- ApiKeyEncryptionService: 73% → 84% \\(+11%\\)\n- Service包: 86% → 87% \\(+1%\\)\n- 总体分支覆盖率: 64.1% → 64.5% \\(+0.4%\\)\n- 新增覆盖分支: 3个\n- 距离70%目标: 还需34个分支\")", "Bash(mvn test -Dtest=ShareTrackingServiceTest -q)", - "Bash(git add -A && git commit -m \"test: 提升ShareTrackingService测试覆盖率到100% - 新增3个边界测试\n\n- 新增空白referer和userAgent的转化漏斗测试\n- 新增null IP和null params的指标测试\n- 新增null params的点击记录测试\n\n覆盖率提升:\n- ShareTrackingService: 82% → 100% \\(+18%\\) ✨\n- Service包: 87% → 89% \\(+2%\\)\n- 总体分支覆盖率: 64.5% → 65.3% \\(+0.8%\\)\n- 新增覆盖分支: 5个\n- 距离70%目标: 还需29个分支\")" + "Bash(git add -A && git commit -m \"test: 提升ShareTrackingService测试覆盖率到100% - 新增3个边界测试\n\n- 新增空白referer和userAgent的转化漏斗测试\n- 新增null IP和null params的指标测试\n- 新增null params的点击记录测试\n\n覆盖率提升:\n- ShareTrackingService: 82% → 100% \\(+18%\\) ✨\n- Service包: 87% → 89% \\(+2%\\)\n- 总体分支覆盖率: 64.5% → 65.3% \\(+0.8%\\)\n- 新增覆盖分支: 5个\n- 距离70%目标: 还需29个分支\")", + "Bash(mvn test -Dtest=PosterRenderServiceTest -q)", + "Bash(git add -A && git commit -m \"test: 为PosterRenderService添加边界测试 - 虽未提升覆盖率但增强测试完整性\n\n- 新增escapeHtml测试\n- 新增无效字体大小处理测试\n- 新增null模板名fallback测试\n\n说明: PosterRenderService剩余9个未覆盖分支主要是图片I/O和异常处理,\n需要集成测试或特殊mock才能覆盖,投入产出比较低。\n\n当前覆盖率: 65.3% \\(422/646分支\\)\n距离70%目标: 还需29个分支\")" ] } } diff --git a/src/test/java/com/mosquito/project/service/PosterRenderServiceTest.java b/src/test/java/com/mosquito/project/service/PosterRenderServiceTest.java index abad624..baf12ac 100644 --- a/src/test/java/com/mosquito/project/service/PosterRenderServiceTest.java +++ b/src/test/java/com/mosquito/project/service/PosterRenderServiceTest.java @@ -322,4 +322,64 @@ class PosterRenderServiceTest { assertTrue(html.contains("data=")); } + + @Test + void renderPosterHtml_shouldEscapeHtmlInTitle() { + ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); + ShortLinkEntity shortLink = new ShortLinkEntity(); + shortLink.setCode("escape123"); + when(shortLinkService.create(anyString())).thenReturn(shortLink); + + PosterConfig posterConfig = buildPosterConfig(new HashMap<>()); + PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); + + // 创建一个带有HTML特殊字符的Activity + String html = service.renderPosterHtml(1L, 2L, "custom"); + + // escapeHtml应该被调用,虽然activity是null,但方法会处理 + assertTrue(html.contains("")); + } + + @Test + void renderPoster_shouldHandleInvalidFontSize() { + ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); + + Map<String, PosterConfig.PosterElement> elements = new HashMap<>(); + PosterConfig.PosterElement text = element("text", 10, 10, 200, 30, "Test"); + text.setFontSize("invalid-size"); // 无效的字体大小 + elements.put("text", text); + + PosterConfig posterConfig = buildPosterConfig(elements); + PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); + + // 应该使用默认字体大小16,不抛异常 + byte[] bytes = service.renderPoster(1L, 2L, "custom"); + assertTrue(bytes.length > 0); + } + + @Test + void renderPoster_shouldUseDefaultTemplate_whenTemplateNameIsNull() { + ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); + PosterConfig posterConfig = buildPosterConfig(buildImageElements()); + PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); + + // 传入null模板名,应该使用默认模板 + byte[] bytes = service.renderPoster(1L, 2L, null); + assertTrue(bytes.length > 0); + } + + @Test + void renderPosterHtml_shouldUseDefaultTemplate_whenTemplateNameIsNull() { + ShortLinkService shortLinkService = Mockito.mock(ShortLinkService.class); + ShortLinkEntity shortLink = new ShortLinkEntity(); + shortLink.setCode("null123"); + when(shortLinkService.create(anyString())).thenReturn(shortLink); + + PosterConfig posterConfig = buildPosterConfig(buildHtmlElements()); + PosterRenderService service = new PosterRenderService(posterConfig, shortLinkService); + + // 传入null模板名,应该使用默认模板 + String html = service.renderPosterHtml(1L, 2L, null); + assertTrue(html.contains("/r/null123")); + } }