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:
zhuyongxin
2026-06-23 14:56:04 +08:00
parent 8bd758dbaf
commit c3a232540a
59 changed files with 103 additions and 104 deletions
@@ -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("✓ 删除记录成功");
}
}