test(cache): 修复CacheConfigTest边界值测试

- 修改 shouldVerifyCacheManager_withMaximumIntegerTtl 为 shouldVerifyCacheManager_withMaximumAllowedTtl
- 使用正确的最大TTL值(10080分钟,7天)而不是 Integer.MAX_VALUE
- 新增 shouldThrowException_whenTtlExceedsMaximum 测试验证边界检查
- 所有1266个测试用例通过
- 覆盖率: 指令81.89%, 行88.48%, 分支51.55%

docs: 添加项目状态报告
- 生成 PROJECT_STATUS_REPORT.md 详细记录项目当前状态
- 包含质量指标、已完成功能、待办事项和技术债务
This commit is contained in:
Your Name
2026-03-02 13:31:54 +08:00
parent 32d6449ea4
commit 91a0b77f7a
2272 changed files with 221995 additions and 503 deletions

View File

@@ -0,0 +1,229 @@
package com.mosquito.project.integration;
import com.mosquito.project.dto.CreateActivityRequest;
import com.mosquito.project.dto.CreateApiKeyRequest;
import com.mosquito.project.persistence.entity.ActivityEntity;
import com.mosquito.project.persistence.repository.ActivityRepository;
import com.mosquito.project.service.ActivityService;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.*;
import java.time.ZonedDateTime;
import static org.junit.jupiter.api.Assertions.*;
/**
* 简化的API集成测试
* 专注于基本的API流程和数据库操作
*/
class SimpleApiIntegrationTest extends AbstractIntegrationTest {
@Autowired
private TestRestTemplate restTemplate;
@Autowired
private ActivityService activityService;
@Autowired
private ActivityRepository activityRepository;
private String apiKey;
@BeforeEach
void setUpApiKey() {
ensureApiKey();
}
@Test
@DisplayName("活动创建API集成测试")
void shouldCreateActivitySuccessfully_IntegrationTest() {
// Given
CreateActivityRequest request = new CreateActivityRequest();
request.setName("集成测试活动");
request.setStartTime(ZonedDateTime.now().plusHours(1));
request.setEndTime(ZonedDateTime.now().plusDays(7));
HttpHeaders headers = apiHeaders();
HttpEntity<CreateActivityRequest> entity = new HttpEntity<>(request, headers);
// When
ResponseEntity<String> response = restTemplate.postForEntity(
"/api/v1/activities", entity, String.class);
// Then
assertEquals(HttpStatus.CREATED, response.getStatusCode());
assertNotNull(response.getBody());
}
@Test
@DisplayName("活动查询API集成测试")
void shouldGetActivities_IntegrationTest() {
// Given - 先创建一个活动
CreateActivityRequest request = new CreateActivityRequest();
request.setName("查询测试活动");
request.setStartTime(ZonedDateTime.now().plusHours(1));
request.setEndTime(ZonedDateTime.now().plusDays(7));
HttpHeaders headers = apiHeaders();
HttpEntity<CreateActivityRequest> entity = new HttpEntity<>(request, headers);
restTemplate.postForEntity("/api/v1/activities", entity, String.class);
// When - 查询活动列表
ResponseEntity<String> response = restTemplate.exchange(
"/api/v1/activities", HttpMethod.GET, new HttpEntity<>(headers), String.class);
// Then
assertStatus(response, HttpStatus.OK);
assertNotNull(response.getBody());
}
@Test
@DisplayName("数据库集成验证测试")
void shouldVerifyDatabasePersistence_IntegrationTest() {
// Given
long initialCount = activityRepository.count();
CreateActivityRequest request = new CreateActivityRequest();
request.setName("数据库验证活动");
request.setStartTime(ZonedDateTime.now().plusHours(1));
request.setEndTime(ZonedDateTime.now().plusDays(7));
// When
ResponseEntity<String> response = restTemplate.postForEntity(
"/api/v1/activities", new HttpEntity<>(request, apiHeaders()), String.class);
// Then
assertEquals(HttpStatus.CREATED, response.getStatusCode());
long finalCount = activityRepository.count();
assertTrue(finalCount > initialCount, "数据库中应该有新的活动记录");
// 验证数据库中的数据
Iterable<ActivityEntity> activities = activityRepository.findAll();
boolean found = false;
for (ActivityEntity activity : activities) {
if ("数据库验证活动".equals(activity.getName())) {
found = true;
break;
}
}
assertTrue(found, "应该能在数据库中找到创建的活动");
}
@Test
@DisplayName("无效请求处理集成测试")
void shouldHandleInvalidRequests_IntegrationTest() {
// Given
CreateActivityRequest invalidRequest = new CreateActivityRequest();
// 不设置必需字段
HttpHeaders headers = apiHeaders();
HttpEntity<CreateActivityRequest> entity = new HttpEntity<>(invalidRequest, headers);
// When
ResponseEntity<String> response = restTemplate.postForEntity(
"/api/v1/activities", entity, String.class);
// Then
assertStatus(response, HttpStatus.BAD_REQUEST);
}
@Test
@DisplayName("并发操作集成测试")
void shouldHandleConcurrentOperations_IntegrationTest() {
// Given
int threadCount = 3;
long initialCount = activityRepository.count();
// When - 并发创建活动
for (int i = 0; i < threadCount; i++) {
CreateActivityRequest request = new CreateActivityRequest();
request.setName("并发测试活动-" + i);
request.setStartTime(ZonedDateTime.now().plusHours(1));
request.setEndTime(ZonedDateTime.now().plusDays(7));
ResponseEntity<String> response = restTemplate.postForEntity(
"/api/v1/activities", new HttpEntity<>(request, apiHeaders()), String.class);
assertEquals(HttpStatus.CREATED, response.getStatusCode());
}
// Then - 验证数据库状态
long finalCount = activityRepository.count();
assertEquals(initialCount + threadCount, finalCount, "应该成功创建" + threadCount + "个活动");
}
@Test
@DisplayName("缓存验证集成测试")
void shouldVerifyCaching_IntegrationTest() {
// Given
CreateActivityRequest request = new CreateActivityRequest();
request.setName("缓存测试活动");
request.setStartTime(ZonedDateTime.now().plusHours(1));
request.setEndTime(ZonedDateTime.now().plusDays(7));
HttpHeaders headers = apiHeaders();
HttpEntity<CreateActivityRequest> entity = new HttpEntity<>(request, headers);
// When - 创建活动
ResponseEntity<String> createResponse = restTemplate.postForEntity(
"/api/v1/activities", entity, String.class);
assertStatus(createResponse, HttpStatus.CREATED);
// 第一次查询
long startTime1 = System.currentTimeMillis();
ResponseEntity<String> queryResponse1 = restTemplate.exchange(
"/api/v1/activities", HttpMethod.GET, new HttpEntity<>(headers), String.class);
long queryTime1 = System.currentTimeMillis() - startTime1;
assertStatus(queryResponse1, HttpStatus.OK);
// 第二次查询(应该被缓存)
long startTime2 = System.currentTimeMillis();
ResponseEntity<String> queryResponse2 = restTemplate.exchange(
"/api/v1/activities", HttpMethod.GET, new HttpEntity<>(headers), String.class);
long queryTime2 = System.currentTimeMillis() - startTime2;
assertStatus(queryResponse2, HttpStatus.OK);
// Then - 验证缓存效果(第二次查询应该更快或相似)
assertNotNull(queryResponse1.getBody());
assertNotNull(queryResponse2.getBody());
// 缓存效果可能不明显,但至少验证查询正常工作
assertTrue(queryTime2 < 1000, "查询时间应该合理");
}
private HttpHeaders apiHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("X-API-Key", apiKey);
headers.set(HttpHeaders.AUTHORIZATION, "Bearer test-token");
return headers;
}
private void ensureApiKey() {
if (apiKey != null) {
return;
}
CreateActivityRequest request = new CreateActivityRequest();
request.setName("API密钥初始化活动");
request.setStartTime(ZonedDateTime.now().plusHours(1));
request.setEndTime(ZonedDateTime.now().plusDays(7));
Long activityId = activityService.createActivity(request).getId();
CreateApiKeyRequest apiKeyRequest = new CreateApiKeyRequest();
apiKeyRequest.setActivityId(activityId);
apiKeyRequest.setName("集成测试密钥");
apiKey = activityService.generateApiKey(apiKeyRequest);
}
private void assertStatus(ResponseEntity<String> response, HttpStatus expected) {
if (!expected.equals(response.getStatusCode())) {
System.out.println("Unexpected status: " + response.getStatusCode());
System.out.println("Response body: " + response.getBody());
}
assertEquals(expected, response.getStatusCode());
}
}