- Implement 5 core API endpoints (create task, get progress, get results, update decision, export Excel) - Add FulltextScreeningController with Zod validation (652 lines) - Implement ExcelExporter service with 4-sheet report generation (352 lines) - Register routes under /api/v1/asl/fulltext-screening - Create 31 REST Client test cases - Add automated integration test script - Fix PDF extraction fallback mechanism in LLM12FieldsService - Update API design documentation to v3.0 - Update development plan to v1.2 - Create Day 5 development record - Clean up temporary test files
202 lines
7.8 KiB
TypeScript
202 lines
7.8 KiB
TypeScript
/**
|
||
* ASL模块API测试脚本
|
||
* 测试所有ASL API端点
|
||
*/
|
||
|
||
const BASE_URL = 'http://localhost:3001';
|
||
const API_PREFIX = '/api/v1/asl';
|
||
|
||
// 测试用的userId (需要先创建用户或使用已有用户)
|
||
const TEST_USER_ID = '00000000-0000-0000-0000-000000000001';
|
||
|
||
async function testAPI() {
|
||
console.log('🚀 开始测试 ASL 模块 API...\n');
|
||
|
||
let projectId = '';
|
||
let literatureIds: string[] = [];
|
||
|
||
try {
|
||
// ==================== 测试1: 健康检查 ====================
|
||
console.log('📍 测试 1/7: 健康检查');
|
||
const healthRes = await fetch(`${BASE_URL}/health`);
|
||
const health = await healthRes.json();
|
||
console.log('✅ 健康检查成功:', health.status);
|
||
console.log('');
|
||
|
||
// ==================== 测试2: 创建筛选项目 ====================
|
||
console.log('📍 测试 2/7: 创建筛选项目');
|
||
const createProjectRes = await fetch(`${BASE_URL}${API_PREFIX}/projects`, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
},
|
||
body: JSON.stringify({
|
||
projectName: 'SGLT2抑制剂系统综述测试',
|
||
picoCriteria: {
|
||
population: '2型糖尿病成人患者',
|
||
intervention: 'SGLT2抑制剂',
|
||
comparison: '安慰剂或常规降糖疗法',
|
||
outcome: '心血管结局',
|
||
studyDesign: '随机对照试验 (RCT)',
|
||
},
|
||
inclusionCriteria: '英文文献,RCT研究,2010年后发表',
|
||
exclusionCriteria: '病例报告,综述,动物实验',
|
||
screeningConfig: {
|
||
models: ['deepseek-chat', 'qwen-max'],
|
||
temperature: 0,
|
||
},
|
||
}),
|
||
});
|
||
|
||
if (!createProjectRes.ok) {
|
||
console.log('⚠️ 创建项目失败,状态码:', createProjectRes.status);
|
||
const error = await createProjectRes.text();
|
||
console.log('错误信息:', error);
|
||
console.log('💡 提示: 需要添加JWT认证中间件,或暂时跳过userId验证\n');
|
||
return;
|
||
}
|
||
|
||
const createResult = await createProjectRes.json();
|
||
projectId = createResult.data.id;
|
||
console.log('✅ 项目创建成功');
|
||
console.log(' 项目ID:', projectId);
|
||
console.log(' 项目名称:', createResult.data.projectName);
|
||
console.log('');
|
||
|
||
// ==================== 测试3: 获取项目列表 ====================
|
||
console.log('📍 测试 3/7: 获取项目列表');
|
||
const listRes = await fetch(`${BASE_URL}${API_PREFIX}/projects`);
|
||
const listResult = await listRes.json();
|
||
console.log('✅ 获取项目列表成功');
|
||
console.log(' 项目数量:', listResult.data.length);
|
||
console.log('');
|
||
|
||
// ==================== 测试4: 获取项目详情 ====================
|
||
console.log('📍 测试 4/7: 获取项目详情');
|
||
const detailRes = await fetch(`${BASE_URL}${API_PREFIX}/projects/${projectId}`);
|
||
const detailResult = await detailRes.json();
|
||
console.log('✅ 获取项目详情成功');
|
||
console.log(' 项目名称:', detailResult.data.projectName);
|
||
console.log(' PICO标准:', JSON.stringify(detailResult.data.picoCriteria, null, 2));
|
||
console.log('');
|
||
|
||
// ==================== 测试5: 导入文献(JSON) ====================
|
||
console.log('📍 测试 5/7: 导入文献(JSON)');
|
||
const importRes = await fetch(`${BASE_URL}${API_PREFIX}/literatures/import`, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
},
|
||
body: JSON.stringify({
|
||
projectId: projectId,
|
||
literatures: [
|
||
{
|
||
pmid: '12345678',
|
||
title: 'Efficacy of SGLT2 inhibitors in type 2 diabetes: a randomized controlled trial',
|
||
abstract: 'Background: SGLT2 inhibitors are a new class of glucose-lowering drugs. Methods: We conducted a randomized, double-blind, placebo-controlled trial. Results: SGLT2 inhibitors significantly reduced HbA1c and body weight. Conclusions: SGLT2 inhibitors are effective for type 2 diabetes.',
|
||
authors: 'Smith J, Jones A, Brown B',
|
||
journal: 'New England Journal of Medicine',
|
||
publicationYear: 2020,
|
||
doi: '10.1056/NEJMoa1234567',
|
||
},
|
||
{
|
||
pmid: '87654321',
|
||
title: 'Cardiovascular outcomes with SGLT2 inhibitors in patients with type 2 diabetes',
|
||
abstract: 'Objective: To evaluate cardiovascular safety of SGLT2 inhibitors. Design: Multicenter randomized controlled trial. Participants: Adults with type 2 diabetes and high cardiovascular risk. Results: SGLT2 inhibitors reduced major adverse cardiovascular events by 25%.',
|
||
authors: 'Johnson M, Williams C, Davis R',
|
||
journal: 'The Lancet',
|
||
publicationYear: 2019,
|
||
doi: '10.1016/S0140-6736(19)12345-6',
|
||
},
|
||
{
|
||
title: 'A meta-analysis of SGLT2 inhibitor studies',
|
||
abstract: 'This meta-analysis reviewed 20 studies on SGLT2 inhibitors. We found consistent benefits across different populations. However, results were heterogeneous.',
|
||
authors: 'Lee K, Park S',
|
||
journal: 'Diabetes Care',
|
||
publicationYear: 2021,
|
||
},
|
||
],
|
||
}),
|
||
});
|
||
|
||
const importResult = await importRes.json();
|
||
console.log('✅ 文献导入成功');
|
||
console.log(' 导入数量:', importResult.data.importedCount);
|
||
console.log('');
|
||
|
||
// ==================== 测试6: 获取文献列表 ====================
|
||
console.log('📍 测试 6/7: 获取文献列表');
|
||
const litListRes = await fetch(`${BASE_URL}${API_PREFIX}/projects/${projectId}/literatures`);
|
||
const litListResult = await litListRes.json();
|
||
console.log('✅ 获取文献列表成功');
|
||
console.log(' 文献数量:', litListResult.data.literatures.length);
|
||
console.log(' 分页信息:', litListResult.data.pagination);
|
||
|
||
if (litListResult.data.literatures.length > 0) {
|
||
console.log(' 第一篇文献:');
|
||
console.log(' - 标题:', litListResult.data.literatures[0].title.substring(0, 50) + '...');
|
||
console.log(' - PMID:', litListResult.data.literatures[0].pmid);
|
||
literatureIds = litListResult.data.literatures.map((lit: any) => lit.id);
|
||
}
|
||
console.log('');
|
||
|
||
// ==================== 测试7: 更新项目 ====================
|
||
console.log('📍 测试 7/7: 更新项目');
|
||
const updateRes = await fetch(`${BASE_URL}${API_PREFIX}/projects/${projectId}`, {
|
||
method: 'PUT',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
},
|
||
body: JSON.stringify({
|
||
status: 'screening',
|
||
}),
|
||
});
|
||
|
||
const updateResult = await updateRes.json();
|
||
console.log('✅ 项目更新成功');
|
||
console.log(' 新状态:', updateResult.data.status);
|
||
console.log('');
|
||
|
||
// ==================== 测试总结 ====================
|
||
console.log('═'.repeat(60));
|
||
console.log('🎉 所有测试通过!');
|
||
console.log('═'.repeat(60));
|
||
console.log('📊 测试总结:');
|
||
console.log(' ✅ 健康检查');
|
||
console.log(' ✅ 创建筛选项目');
|
||
console.log(' ✅ 获取项目列表');
|
||
console.log(' ✅ 获取项目详情');
|
||
console.log(' ✅ 导入文献');
|
||
console.log(' ✅ 获取文献列表');
|
||
console.log(' ✅ 更新项目状态');
|
||
console.log('');
|
||
console.log('📝 创建的测试数据:');
|
||
console.log(` - 项目ID: ${projectId}`);
|
||
console.log(` - 文献数量: ${literatureIds.length}`);
|
||
console.log('');
|
||
console.log('🧹 清理提示: 如需删除测试数据,请执行:');
|
||
console.log(` DELETE http://localhost:3001/api/v1/asl/projects/${projectId}`);
|
||
console.log('');
|
||
|
||
} catch (error) {
|
||
console.error('❌ 测试失败:', error);
|
||
if (error instanceof Error) {
|
||
console.error('错误详情:', error.message);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 执行测试
|
||
testAPI();
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|