From 046151140f2cacf7b57a126156c0993b017130e7 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 3 Mar 2026 10:57:14 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E6=8F=90=E5=8D=87UserExperienceControl?= =?UTF-8?q?ler=E6=B5=8B=E8=AF=95=E8=A6=86=E7=9B=96=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增4个测试用例,覆盖分页边界和未测试端点 - 测试invited-friends分页超出范围返回空列表 - 测试rewards分页超出范围返回空列表 - 测试getShareMeta端点(默认模板) - 测试getShareMeta端点(自定义模板) 覆盖率提升: - UserExperienceController: 50% → 更高 - Controller包: 63% → 67% (+4%) - 总体分支: 57.8% (374/646) - 测试用例: 8 → 12 (+4) --- .claude/settings.local.json | 6 +- .../UserExperienceControllerTest.java | 66 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 85a0030..53a82be 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -67,7 +67,11 @@ "Bash(mvn clean test jacoco:report -q 2>&1 | tail -3)", "Bash(git add -A && git commit -m \"test: 提升PosterRenderService测试覆盖率\n\n- 新增6个测试用例,覆盖更多分支场景\n - 测试template为null时使用默认模板\n - 测试button元素的background和borderRadius\n - 测试null content处理\n - 测试rect元素渲染(有/无background)\n\n覆盖率提升:\n- PosterRenderService: 59% → 68% \\(+9%\\)\n- Service包: 70% → 72% \\(+2%\\)\n- 总体分支: 56% \\(367/646\\)\" 2>&1 | grep -E \"\\(test:|新增|覆盖率|files changed|insertions\\)\")", "Bash(mvn test -Dtest=PosterRenderServiceTest 2>&1 | tail -20)", - "Bash(git add -A && git commit -m \"test: 继续提升PosterRenderService测试覆盖率\n\n- 新增5个测试用例,覆盖background处理的所有分支\n - 测试background图片加载成功场景\n - 测试background图片加载失败降级到背景色\n - 测试background为空白字符串时使用背景色\n - 测试HTML渲染中的background-image样式\n - 测试URL编码异常处理\n\n覆盖率提升:\n- PosterRenderService: 68% → 74% \\(+6%\\)\n- Service包: 72% → 74% \\(+2%\\)\n- 总体分支: 57% \\(372/646\\)\n- 测试用例: 8 → 13 \\(+5\\)\" 2>&1 | grep -E \"\\(test:|新增|覆盖率|files changed|insertions\\)\")" + "Bash(git add -A && git commit -m \"test: 继续提升PosterRenderService测试覆盖率\n\n- 新增5个测试用例,覆盖background处理的所有分支\n - 测试background图片加载成功场景\n - 测试background图片加载失败降级到背景色\n - 测试background为空白字符串时使用背景色\n - 测试HTML渲染中的background-image样式\n - 测试URL编码异常处理\n\n覆盖率提升:\n- PosterRenderService: 68% → 74% \\(+6%\\)\n- Service包: 72% → 74% \\(+2%\\)\n- 总体分支: 57% \\(372/646\\)\n- 测试用例: 8 → 13 \\(+5\\)\" 2>&1 | grep -E \"\\(test:|新增|覆盖率|files changed|insertions\\)\")", + "Bash(mvn test -Dtest=ActivityServiceCoverageTest -q 2>&1 | grep -E \"\\(Tests run|BUILD\\)\")", + "Bash(mvn test -Dtest=ActivityServiceCoverageTest 2>&1 | grep \"Tests run:\" | tail -1)", + "Bash(mvn test -Dtest=UserExperienceControllerTest 2>&1 | tail -20)", + "Bash(git add -A && git commit -m \"test: 提升UserExperienceController测试覆盖率\n\n- 新增4个测试用例,覆盖分页边界和未测试端点\n - 测试invited-friends分页超出范围返回空列表\n - 测试rewards分页超出范围返回空列表\n - 测试getShareMeta端点(默认模板)\n - 测试getShareMeta端点(自定义模板)\n\n覆盖率提升:\n- UserExperienceController: 50% → 更高\n- Controller包: 63% → 67% \\(+4%\\)\n- 总体分支: 57.8% \\(374/646\\)\n- 测试用例: 8 → 12 \\(+4\\)\" 2>&1 | grep -E \"\\(test:|新增|覆盖率|files changed|insertions\\)\")" ] } } diff --git a/src/test/java/com/mosquito/project/controller/UserExperienceControllerTest.java b/src/test/java/com/mosquito/project/controller/UserExperienceControllerTest.java index 078cff8..71e2b47 100644 --- a/src/test/java/com/mosquito/project/controller/UserExperienceControllerTest.java +++ b/src/test/java/com/mosquito/project/controller/UserExperienceControllerTest.java @@ -174,4 +174,70 @@ class UserExperienceControllerTest { .andExpect(jsonPath("$.code").value(200)) .andExpect(jsonPath("$.data[0].type").value("points")); } + + @Test + void shouldReturnEmptyList_whenInvitedFriendsPaginationExceedsSize() throws Exception { + UserInviteEntity a = new UserInviteEntity(); a.setInviteeUserId(10L); a.setStatus("clicked"); + when(userInviteRepository.findByActivityIdAndInviterUserId(anyLong(), anyLong())).thenReturn(List.of(a)); + + mockMvc.perform(get("/api/v1/me/invited-friends") + .param("activityId", "1") + .param("userId", "2") + .param("page", "10") + .param("size", "20") + .header("X-API-Key", TestAuthSupport.RAW_API_KEY) + .header("Authorization", "Bearer test-token")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data").isEmpty()); + } + + @Test + void shouldReturnEmptyList_whenRewardsPaginationExceedsSize() throws Exception { + var r1 = new com.mosquito.project.persistence.entity.UserRewardEntity(); r1.setType("points"); r1.setPoints(100); r1.setCreatedAt(java.time.OffsetDateTime.now()); + when(userRewardRepository.findByActivityIdAndUserIdOrderByCreatedAtDesc(anyLong(), anyLong())).thenReturn(java.util.List.of(r1)); + + mockMvc.perform(get("/api/v1/me/rewards") + .param("activityId", "1") + .param("userId", "2") + .param("page", "10") + .param("size", "20") + .header("X-API-Key", TestAuthSupport.RAW_API_KEY) + .header("Authorization", "Bearer test-token")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data").isEmpty()); + } + + @Test + void shouldReturnShareMeta() throws Exception { + Map meta = Map.of("title", "活动标题", "description", "活动描述"); + when(shareConfigService.getShareMeta(anyLong(), anyLong(), anyString())).thenReturn(meta); + + mockMvc.perform(get("/api/v1/me/share-meta") + .param("activityId", "1") + .param("userId", "2") + .header("X-API-Key", TestAuthSupport.RAW_API_KEY) + .header("Authorization", "Bearer test-token")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data.title").value("活动标题")) + .andExpect(jsonPath("$.data.description").value("活动描述")); + } + + @Test + void shouldReturnShareMeta_withCustomTemplate() throws Exception { + Map meta = Map.of("title", "自定义模板"); + when(shareConfigService.getShareMeta(anyLong(), anyLong(), eq("custom"))).thenReturn(meta); + + mockMvc.perform(get("/api/v1/me/share-meta") + .param("activityId", "1") + .param("userId", "2") + .param("template", "custom") + .header("X-API-Key", TestAuthSupport.RAW_API_KEY) + .header("Authorization", "Bearer test-token")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data.title").value("自定义模板")); + } }