test: 提升ShareTrackingController测试覆盖率

- 新增2个测试覆盖时间范围和参数处理
  * getShareMetrics提供时间范围的场景
  * registerShareSource处理null参数的场景

覆盖率提升:
- 总体分支覆盖率: 63% → 63.3% (+2个分支)
- Controller包: 80% → 84% (+4%)
- ShareTrackingController: 70% → 更高
- 新增测试用例: 2个
- 距离70%目标: 还需42个分支
This commit is contained in:
Your Name
2026-03-03 11:58:22 +08:00
parent 4f5060724b
commit 81934725f3
2 changed files with 50 additions and 1 deletions

View File

@@ -90,7 +90,11 @@
"Bash(mvn clean test jacoco:report -DskipTests=false 2>&1 | tail -100)",
"Bash(mvn test -Dtest=ShortLinkControllerTest 2>&1 | tail -50)",
"Bash(mvn clean test jacoco:report 2>&1 | grep -A 20 \"Results:\" | head -25)",
"Bash(mvn clean test jacoco:report 2>&1 | tail -100)"
"Bash(mvn clean test jacoco:report 2>&1 | tail -100)",
"Bash(git commit -m \"test: 提升Controller测试覆盖率 - 新增IP提取和分页边界测试\n\n- ShortLinkController: 新增3个测试覆盖IP地址提取逻辑\n * X-Forwarded-For头部处理\n * RemoteAddr回退逻辑\n * 空白X-Forwarded-For处理\n \n- UserExperienceController: 新增4个测试覆盖分页边界条件\n * size=0时返回空列表\n * 负数page处理\n * Math.max边界逻辑\n \n覆盖率提升\n- 总体分支覆盖率: 62% → 63%\n- Controller包: 73% → 80% \\(+7%\\)\n- 新增测试用例: 7个\n- 距离70%目标: 还需44个分支\")",
"Bash(mvn test -Dtest=ShareTrackingControllerTest 2>&1 | tail -30)",
"Bash(mvn clean test jacoco:report 2>&1 | grep -E \"Tests run:|Total\" | tail -5)",
"Bash(git add -A && git commit -m \"test: 提升ShareTrackingController测试覆盖率\n\n- 新增2个测试覆盖时间范围和参数处理\n * getShareMetrics提供时间范围的场景\n * registerShareSource处理null参数的场景\n \n覆盖率提升\n- 总体分支覆盖率: 63% → 63.3% \\(+2个分支\\)\n- Controller包: 80% → 84% \\(+4%\\)\n- ShareTrackingController: 70% → 更高\n- 新增测试用例: 2个\n- 距离70%目标: 还需42个分支\")"
]
}
}

View File

@@ -229,4 +229,49 @@ class ShareTrackingControllerTest {
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(200));
}
@Test
void getShareMetrics_shouldUseProvidedTimeRange() throws Exception {
OffsetDateTime start = OffsetDateTime.now().minusDays(30);
OffsetDateTime end = OffsetDateTime.now();
ShareMetricsResponse metrics = new ShareMetricsResponse();
metrics.setActivityId(1L);
when(trackingService.getShareMetrics(eq(1L), any(), any())).thenReturn(metrics);
mockMvc.perform(get("/api/v1/share/metrics")
.param("activityId", "1")
.param("startTime", start.toString())
.param("endTime", end.toString())
.accept(MediaType.APPLICATION_JSON)
.header("X-API-Key", TestAuthSupport.RAW_API_KEY)
.header("Authorization", "Bearer test-token"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(200));
verify(trackingService).getShareMetrics(eq(1L), any(), any());
}
@Test
void registerShareSource_shouldHandleNullParams() throws Exception {
ShareTrackingResponse response = new ShareTrackingResponse("track-5", "ghi789", "https://example.com", 1L, 6L);
when(trackingService.createShareTracking(eq(1L), eq(6L), eq("email"), any())).thenReturn(response);
mockMvc.perform(post("/api/v1/share/register-source")
.param("activityId", "1")
.param("userId", "6")
.param("channel", "email")
.accept(MediaType.APPLICATION_JSON)
.header("X-API-Key", TestAuthSupport.RAW_API_KEY)
.header("Authorization", "Bearer test-token"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(200));
ArgumentCaptor<Map<String, String>> paramsCaptor = ArgumentCaptor.forClass(Map.class);
verify(trackingService).createShareTracking(eq(1L), eq(6L), eq("email"), paramsCaptor.capture());
Map<String, String> capturedParams = paramsCaptor.getValue();
assertThat(capturedParams).containsKey("channel");
assertThat(capturedParams).containsKey("registered_at");
assertThat(capturedParams.get("channel")).isEqualTo("email");
}
}