refactor(phase1): 完成包名重构 (org.example → com.superbiz.agent)
Task 4.1: 包名统一重构 - 重命名 41 个 Java 文件的包名 - 更新所有 import 语句 - 恢复枚举类(FaultCategory、DiagnosisStatus、SourceType) - 更新测试类的 import 重构范围: - domain/entity: 3 个实体类 - domain/model: 2 个数据类 - domain/enums: 3 个枚举类 - repository: 3 个接口 - service/session: 2 个类(接口 + 实现) - config: 9 个配置类 - controller: 2 个控制器 - agent/tool: 4 个工具类 - client: 1 个客户端 - Main.java: 主类 验证结果: - 编译成功,无错误 - 所有测试通过 (27/27) - ApiDocumentRepositoryTest: 7/7 ✅ - CaseLibraryRepositoryTest: 6/6 ✅ - DiagnosisRecordRepositoryTest: 6/6 ✅ - RedisSessionManagerTest: 8/8 ✅ Progress: 21/33 tasks completed (64%)
This commit is contained in:
@@ -0,0 +1,179 @@
|
||||
package com.superbiz.agent.repository;
|
||||
|
||||
import com.superbiz.agent.domain.enums.FaultCategory;
|
||||
import com.superbiz.agent.domain.entity.ApiDocument;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
|
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.test.context.TestPropertySource;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* ApiDocumentRepository 单元测试
|
||||
*/
|
||||
@DataJpaTest
|
||||
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
|
||||
@TestPropertySource(properties = {
|
||||
"spring.flyway.enabled=true",
|
||||
"spring.jpa.hibernate.ddl-auto=validate",
|
||||
"spring.jpa.show-sql=false"
|
||||
})
|
||||
class ApiDocumentRepositoryTest {
|
||||
|
||||
@Autowired
|
||||
private ApiDocumentRepository repository;
|
||||
|
||||
@Test
|
||||
void testSaveAndFindById() {
|
||||
ApiDocument doc = ApiDocument.builder()
|
||||
.docId(UUID.randomUUID().toString())
|
||||
.fileName("api-spec.md")
|
||||
.filePath("/uploads/api-spec.md")
|
||||
.fileHash("abc123hash")
|
||||
.fileSize(1024L)
|
||||
.faultCategory(FaultCategory.EXTERNAL_API)
|
||||
.faultSource("广东")
|
||||
.apiName("查询接口")
|
||||
.status("PENDING")
|
||||
.chunkCount(0)
|
||||
.build();
|
||||
|
||||
ApiDocument saved = repository.save(doc);
|
||||
assertNotNull(saved.getId());
|
||||
assertNotNull(saved.getCreatedAt());
|
||||
System.out.println("✓ 保存文档成功,ID: " + saved.getId());
|
||||
|
||||
Optional<ApiDocument> found = repository.findById(saved.getId());
|
||||
assertTrue(found.isPresent());
|
||||
assertEquals("api-spec.md", found.get().getFileName());
|
||||
System.out.println("✓ 查询文档成功");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindByDocId() {
|
||||
String docId = UUID.randomUUID().toString();
|
||||
ApiDocument doc = ApiDocument.builder()
|
||||
.docId(docId)
|
||||
.fileName("test-doc.txt")
|
||||
.status("INDEXED")
|
||||
.build();
|
||||
|
||||
repository.save(doc);
|
||||
|
||||
Optional<ApiDocument> found = repository.findByDocId(docId);
|
||||
assertTrue(found.isPresent());
|
||||
assertEquals(docId, found.get().getDocId());
|
||||
System.out.println("✓ 根据 docId 查询成功");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindByFileHash() {
|
||||
String fileHash = "unique-hash-" + System.currentTimeMillis();
|
||||
ApiDocument doc = ApiDocument.builder()
|
||||
.docId(UUID.randomUUID().toString())
|
||||
.fileName("duplicate-check.md")
|
||||
.fileHash(fileHash)
|
||||
.build();
|
||||
|
||||
repository.save(doc);
|
||||
|
||||
Optional<ApiDocument> found = repository.findByFileHash(fileHash);
|
||||
assertTrue(found.isPresent());
|
||||
assertEquals(fileHash, found.get().getFileHash());
|
||||
System.out.println("✓ 根据 fileHash 查询成功(去重检测)");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindByStatus() {
|
||||
ApiDocument doc1 = ApiDocument.builder()
|
||||
.docId(UUID.randomUUID().toString())
|
||||
.fileName("pending-1.md")
|
||||
.status("PENDING")
|
||||
.build();
|
||||
|
||||
ApiDocument doc2 = ApiDocument.builder()
|
||||
.docId(UUID.randomUUID().toString())
|
||||
.fileName("pending-2.md")
|
||||
.status("PENDING")
|
||||
.build();
|
||||
|
||||
repository.save(doc1);
|
||||
repository.save(doc2);
|
||||
|
||||
List<ApiDocument> results = repository.findByStatus("PENDING");
|
||||
assertFalse(results.isEmpty());
|
||||
assertTrue(results.size() >= 2);
|
||||
System.out.println("✓ 根据状态查询成功,找到 " + results.size() + " 条 PENDING 文档");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindByStatusWithPagination() {
|
||||
// 创建多个文档
|
||||
for (int i = 0; i < 5; i++) {
|
||||
ApiDocument doc = ApiDocument.builder()
|
||||
.docId(UUID.randomUUID().toString())
|
||||
.fileName("doc-" + i + ".txt")
|
||||
.status("INDEXED")
|
||||
.chunkCount(10)
|
||||
.build();
|
||||
repository.save(doc);
|
||||
}
|
||||
|
||||
Page<ApiDocument> page = repository.findByStatus("INDEXED", PageRequest.of(0, 3));
|
||||
assertFalse(page.isEmpty());
|
||||
assertTrue(page.getContent().size() <= 3);
|
||||
System.out.println("✓ 分页查询成功,本页 " + page.getContent().size() + " 条,总计 " + page.getTotalElements() + " 条");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testUpdateDocumentStatus() {
|
||||
ApiDocument doc = ApiDocument.builder()
|
||||
.docId(UUID.randomUUID().toString())
|
||||
.fileName("indexing-doc.md")
|
||||
.status("PENDING")
|
||||
.chunkCount(0)
|
||||
.build();
|
||||
|
||||
ApiDocument saved = repository.save(doc);
|
||||
Long id = saved.getId();
|
||||
|
||||
// 更新状态
|
||||
saved.setStatus("INDEXED");
|
||||
saved.setChunkCount(15);
|
||||
saved.setIndexedAt(LocalDateTime.now());
|
||||
|
||||
repository.save(saved);
|
||||
|
||||
Optional<ApiDocument> updated = repository.findById(id);
|
||||
assertTrue(updated.isPresent());
|
||||
assertEquals("INDEXED", updated.get().getStatus());
|
||||
assertEquals(15, updated.get().getChunkCount());
|
||||
assertNotNull(updated.get().getIndexedAt());
|
||||
System.out.println("✓ 更新文档状态成功");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindByFaultSource() {
|
||||
ApiDocument doc = ApiDocument.builder()
|
||||
.docId(UUID.randomUUID().toString())
|
||||
.fileName("guangdong-api.md")
|
||||
.faultSource("广东")
|
||||
.faultCategory(FaultCategory.EXTERNAL_API)
|
||||
.build();
|
||||
|
||||
repository.save(doc);
|
||||
|
||||
List<ApiDocument> results = repository.findByFaultSource("广东");
|
||||
assertFalse(results.isEmpty());
|
||||
System.out.println("✓ 根据故障源查询成功,找到 " + results.size() + " 条文档");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
package com.superbiz.agent.repository;
|
||||
|
||||
import com.superbiz.agent.domain.enums.FaultCategory;
|
||||
import com.superbiz.agent.domain.enums.SourceType;
|
||||
import com.superbiz.agent.domain.entity.CaseLibrary;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
|
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
import org.springframework.test.context.TestPropertySource;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* CaseLibraryRepository 单元测试
|
||||
*/
|
||||
@DataJpaTest
|
||||
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
|
||||
@TestPropertySource(properties = {
|
||||
"spring.flyway.enabled=true",
|
||||
"spring.jpa.hibernate.ddl-auto=validate",
|
||||
"spring.jpa.show-sql=false"
|
||||
})
|
||||
class CaseLibraryRepositoryTest {
|
||||
|
||||
@Autowired
|
||||
private CaseLibraryRepository repository;
|
||||
|
||||
@Test
|
||||
void testSaveAndFindById() {
|
||||
CaseLibrary caseLib = CaseLibrary.builder()
|
||||
.caseId(UUID.randomUUID().toString())
|
||||
.title("接口超时案例")
|
||||
.rootCause("网络延迟导致接口超时")
|
||||
.solution("增加超时时间和重试机制")
|
||||
.faultCategory(FaultCategory.EXTERNAL_API)
|
||||
.errorCode("40003")
|
||||
.sourceType(SourceType.AUTO)
|
||||
.build();
|
||||
|
||||
CaseLibrary saved = repository.save(caseLib);
|
||||
assertNotNull(saved.getId());
|
||||
assertNotNull(saved.getCreatedAt());
|
||||
System.out.println("✓ 保存案例成功,ID: " + saved.getId());
|
||||
|
||||
Optional<CaseLibrary> found = repository.findById(saved.getId());
|
||||
assertTrue(found.isPresent());
|
||||
assertEquals("接口超时案例", found.get().getTitle());
|
||||
System.out.println("✓ 查询案例成功");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindByCaseId() {
|
||||
String caseId = UUID.randomUUID().toString();
|
||||
CaseLibrary caseLib = CaseLibrary.builder()
|
||||
.caseId(caseId)
|
||||
.title("数据库死锁案例")
|
||||
.rootCause("并发更新导致死锁")
|
||||
.solution("优化事务粒度")
|
||||
.faultCategory(FaultCategory.DATABASE)
|
||||
.build();
|
||||
|
||||
repository.save(caseLib);
|
||||
|
||||
Optional<CaseLibrary> found = repository.findByCaseId(caseId);
|
||||
assertTrue(found.isPresent());
|
||||
assertEquals(caseId, found.get().getCaseId());
|
||||
System.out.println("✓ 根据 caseId 查询成功");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindByFaultCategoryAndErrorCode() {
|
||||
CaseLibrary case1 = CaseLibrary.builder()
|
||||
.caseId(UUID.randomUUID().toString())
|
||||
.title("案例1")
|
||||
.rootCause("原因1")
|
||||
.solution("方案1")
|
||||
.faultCategory(FaultCategory.EXTERNAL_API)
|
||||
.errorCode("40003")
|
||||
.build();
|
||||
|
||||
CaseLibrary case2 = CaseLibrary.builder()
|
||||
.caseId(UUID.randomUUID().toString())
|
||||
.title("案例2")
|
||||
.rootCause("原因2")
|
||||
.solution("方案2")
|
||||
.faultCategory(FaultCategory.EXTERNAL_API)
|
||||
.errorCode("40003")
|
||||
.build();
|
||||
|
||||
repository.save(case1);
|
||||
repository.save(case2);
|
||||
|
||||
List<CaseLibrary> results = repository.findByFaultCategoryAndErrorCode(
|
||||
FaultCategory.EXTERNAL_API, "40003");
|
||||
|
||||
assertFalse(results.isEmpty());
|
||||
assertTrue(results.size() >= 2);
|
||||
System.out.println("✓ 根据故障类别和错误码查询成功,找到 " + results.size() + " 条案例");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindBySourceType() {
|
||||
CaseLibrary autoCase = CaseLibrary.builder()
|
||||
.caseId(UUID.randomUUID().toString())
|
||||
.title("自动生成案例")
|
||||
.rootCause("自动分析")
|
||||
.solution("自动方案")
|
||||
.sourceType(SourceType.AUTO)
|
||||
.build();
|
||||
|
||||
repository.save(autoCase);
|
||||
|
||||
Page<CaseLibrary> results = repository.findBySourceType(
|
||||
SourceType.AUTO, PageRequest.of(0, 10));
|
||||
|
||||
assertFalse(results.isEmpty());
|
||||
System.out.println("✓ 根据来源类型查询成功,找到 " + results.getTotalElements() + " 条案例");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testUpdateReferenceCount() {
|
||||
CaseLibrary caseLib = CaseLibrary.builder()
|
||||
.caseId(UUID.randomUUID().toString())
|
||||
.title("热门案例")
|
||||
.rootCause("常见问题")
|
||||
.solution("标准方案")
|
||||
.referenceCount(0)
|
||||
.build();
|
||||
|
||||
CaseLibrary saved = repository.save(caseLib);
|
||||
Long id = saved.getId();
|
||||
|
||||
// 模拟被引用
|
||||
saved.setReferenceCount(saved.getReferenceCount() + 1);
|
||||
repository.save(saved);
|
||||
|
||||
Optional<CaseLibrary> updated = repository.findById(id);
|
||||
assertTrue(updated.isPresent());
|
||||
assertEquals(1, updated.get().getReferenceCount());
|
||||
System.out.println("✓ 更新引用次数成功");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindTopByReferenceCount() {
|
||||
// 创建一些案例
|
||||
for (int i = 0; i < 3; i++) {
|
||||
CaseLibrary caseLib = CaseLibrary.builder()
|
||||
.caseId(UUID.randomUUID().toString())
|
||||
.title("案例 " + i)
|
||||
.rootCause("原因")
|
||||
.solution("方案")
|
||||
.referenceCount(i * 10)
|
||||
.build();
|
||||
repository.save(caseLib);
|
||||
}
|
||||
|
||||
List<CaseLibrary> topCases = repository.findTop10ByOrderByReferenceCountDesc();
|
||||
assertFalse(topCases.isEmpty());
|
||||
|
||||
// 验证排序(第一个引用次数应该最高)
|
||||
if (topCases.size() >= 2) {
|
||||
assertTrue(topCases.get(0).getReferenceCount() >= topCases.get(1).getReferenceCount());
|
||||
}
|
||||
System.out.println("✓ 查询热门案例成功,返回 " + topCases.size() + " 条");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
package com.superbiz.agent.repository;
|
||||
|
||||
import com.superbiz.agent.domain.enums.DiagnosisStatus;
|
||||
import com.superbiz.agent.domain.enums.FaultCategory;
|
||||
import com.superbiz.agent.domain.entity.DiagnosisRecord;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
|
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
||||
import org.springframework.test.context.TestPropertySource;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* DiagnosisRecordRepository 单元测试
|
||||
*/
|
||||
@DataJpaTest
|
||||
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
|
||||
@TestPropertySource(properties = {
|
||||
"spring.flyway.enabled=true",
|
||||
"spring.jpa.hibernate.ddl-auto=validate",
|
||||
"spring.jpa.show-sql=true"
|
||||
})
|
||||
class DiagnosisRecordRepositoryTest {
|
||||
|
||||
@Autowired
|
||||
private DiagnosisRecordRepository repository;
|
||||
|
||||
@Test
|
||||
void testSaveAndFindById() {
|
||||
// 创建测试数据
|
||||
DiagnosisRecord record = DiagnosisRecord.builder()
|
||||
.diagnosisId(UUID.randomUUID().toString())
|
||||
.sessionId("session-001")
|
||||
.businessId("order-12345")
|
||||
.traceId("trace-abc123")
|
||||
.faultCategory(FaultCategory.EXTERNAL_API)
|
||||
.faultSource("广东")
|
||||
.faultTarget("http://api.example.com/query")
|
||||
.errorCode("40003")
|
||||
.errorMessage("接口超时")
|
||||
.status(DiagnosisStatus.SUCCESS)
|
||||
.confidence(85)
|
||||
.duration(1500)
|
||||
.build();
|
||||
|
||||
// 保存
|
||||
DiagnosisRecord saved = repository.save(record);
|
||||
assertNotNull(saved.getId());
|
||||
assertNotNull(saved.getCreatedAt());
|
||||
System.out.println("✓ 保存成功,ID: " + saved.getId());
|
||||
|
||||
// 查询
|
||||
Optional<DiagnosisRecord> found = repository.findById(saved.getId());
|
||||
assertTrue(found.isPresent());
|
||||
assertEquals("order-12345", found.get().getBusinessId());
|
||||
System.out.println("✓ 根据 ID 查询成功");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindByDiagnosisId() {
|
||||
String diagnosisId = UUID.randomUUID().toString();
|
||||
DiagnosisRecord record = DiagnosisRecord.builder()
|
||||
.diagnosisId(diagnosisId)
|
||||
.businessId("order-test-001")
|
||||
.faultCategory(FaultCategory.DATABASE)
|
||||
.status(DiagnosisStatus.PENDING)
|
||||
.build();
|
||||
|
||||
repository.save(record);
|
||||
|
||||
Optional<DiagnosisRecord> found = repository.findByDiagnosisId(diagnosisId);
|
||||
assertTrue(found.isPresent());
|
||||
assertEquals(diagnosisId, found.get().getDiagnosisId());
|
||||
System.out.println("✓ 根据 diagnosisId 查询成功");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindByFaultCategoryAndErrorCode() {
|
||||
// 创建测试数据
|
||||
DiagnosisRecord record1 = DiagnosisRecord.builder()
|
||||
.diagnosisId(UUID.randomUUID().toString())
|
||||
.faultCategory(FaultCategory.EXTERNAL_API)
|
||||
.errorCode("40003")
|
||||
.status(DiagnosisStatus.SUCCESS)
|
||||
.build();
|
||||
|
||||
DiagnosisRecord record2 = DiagnosisRecord.builder()
|
||||
.diagnosisId(UUID.randomUUID().toString())
|
||||
.faultCategory(FaultCategory.EXTERNAL_API)
|
||||
.errorCode("40003")
|
||||
.status(DiagnosisStatus.FAILED)
|
||||
.build();
|
||||
|
||||
repository.save(record1);
|
||||
repository.save(record2);
|
||||
|
||||
// 查询
|
||||
List<DiagnosisRecord> results = repository.findByFaultCategoryAndErrorCode(
|
||||
FaultCategory.EXTERNAL_API, "40003");
|
||||
|
||||
assertFalse(results.isEmpty());
|
||||
assertTrue(results.size() >= 2);
|
||||
System.out.println("✓ 根据故障类别和错误码查询成功,找到 " + results.size() + " 条记录");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testFindByStatus() {
|
||||
DiagnosisRecord record = DiagnosisRecord.builder()
|
||||
.diagnosisId(UUID.randomUUID().toString())
|
||||
.status(DiagnosisStatus.RUNNING)
|
||||
.faultCategory(FaultCategory.CACHE)
|
||||
.build();
|
||||
|
||||
repository.save(record);
|
||||
|
||||
List<DiagnosisRecord> results = repository.findByStatus(DiagnosisStatus.RUNNING);
|
||||
assertFalse(results.isEmpty());
|
||||
System.out.println("✓ 根据状态查询成功,找到 " + results.size() + " 条 RUNNING 记录");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testUpdateRecord() {
|
||||
// 创建并保存
|
||||
DiagnosisRecord record = DiagnosisRecord.builder()
|
||||
.diagnosisId(UUID.randomUUID().toString())
|
||||
.status(DiagnosisStatus.PENDING)
|
||||
.confidence(0)
|
||||
.build();
|
||||
|
||||
DiagnosisRecord saved = repository.save(record);
|
||||
Long id = saved.getId();
|
||||
|
||||
// 更新
|
||||
saved.setStatus(DiagnosisStatus.SUCCESS);
|
||||
saved.setConfidence(90);
|
||||
saved.setRootCause("接口超时导致");
|
||||
saved.setSolution("增加重试机制");
|
||||
|
||||
repository.save(saved);
|
||||
|
||||
// 验证更新
|
||||
Optional<DiagnosisRecord> updated = repository.findById(id);
|
||||
assertTrue(updated.isPresent());
|
||||
assertEquals(DiagnosisStatus.SUCCESS, updated.get().getStatus());
|
||||
assertEquals(90, updated.get().getConfidence());
|
||||
assertNotNull(updated.get().getUpdatedAt());
|
||||
System.out.println("✓ 更新记录成功");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDeleteRecord() {
|
||||
DiagnosisRecord record = DiagnosisRecord.builder()
|
||||
.diagnosisId(UUID.randomUUID().toString())
|
||||
.status(DiagnosisStatus.PENDING)
|
||||
.build();
|
||||
|
||||
DiagnosisRecord saved = repository.save(record);
|
||||
Long id = saved.getId();
|
||||
|
||||
// 删除
|
||||
repository.deleteById(id);
|
||||
|
||||
// 验证删除
|
||||
Optional<DiagnosisRecord> deleted = repository.findById(id);
|
||||
assertFalse(deleted.isPresent());
|
||||
System.out.println("✓ 删除记录成功");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user