389 lines
10 KiB
JavaScript
389 lines
10 KiB
JavaScript
const http = require('http');
|
||
|
||
// 测试配置
|
||
const API_BASE_URL = 'http://localhost:5351';
|
||
let authToken = '';
|
||
|
||
// 辅助函数:发送HTTP请求
|
||
function makeRequest(options, data = null) {
|
||
return new Promise((resolve, reject) => {
|
||
const req = http.request(options, (res) => {
|
||
let responseData = '';
|
||
|
||
res.on('data', (chunk) => {
|
||
responseData += chunk;
|
||
});
|
||
|
||
res.on('end', () => {
|
||
try {
|
||
const result = {
|
||
statusCode: res.statusCode,
|
||
headers: res.headers,
|
||
data: responseData ? JSON.parse(responseData) : null
|
||
};
|
||
resolve(result);
|
||
} catch (error) {
|
||
reject(new Error(`解析响应失败: ${error.message}`));
|
||
}
|
||
});
|
||
});
|
||
|
||
req.on('error', (error) => {
|
||
reject(error);
|
||
});
|
||
|
||
if (data) {
|
||
req.write(JSON.stringify(data));
|
||
}
|
||
|
||
req.end();
|
||
});
|
||
}
|
||
|
||
// 登录获取认证令牌
|
||
async function login() {
|
||
console.log('🔐 正在登录...');
|
||
|
||
const options = {
|
||
hostname: 'localhost',
|
||
port: 5351,
|
||
path: '/api/auth/login',
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json'
|
||
}
|
||
};
|
||
|
||
const loginData = {
|
||
username: 'admin',
|
||
password: 'Admin123456'
|
||
};
|
||
|
||
try {
|
||
const response = await makeRequest(options, loginData);
|
||
|
||
if (response.statusCode === 200 && response.data.success) {
|
||
authToken = response.data.data.token;
|
||
console.log('✅ 登录成功');
|
||
return true;
|
||
} else {
|
||
console.error('❌ 登录失败:', response.data.message);
|
||
return false;
|
||
}
|
||
} catch (error) {
|
||
console.error('❌ 登录请求失败:', error.message);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// 测试获取项目列表
|
||
async function testGetProjects() {
|
||
console.log('\n📋 测试获取项目列表...');
|
||
|
||
const options = {
|
||
hostname: 'localhost',
|
||
port: 5351,
|
||
path: '/api/projects',
|
||
method: 'GET',
|
||
headers: {
|
||
'Authorization': `Bearer ${authToken}`,
|
||
'Content-Type': 'application/json'
|
||
}
|
||
};
|
||
|
||
try {
|
||
const response = await makeRequest(options);
|
||
|
||
if (response.statusCode === 200 && response.data.success) {
|
||
console.log('✅ 获取项目列表成功');
|
||
console.log(` 项目数量: ${response.data.data.projects.length}`);
|
||
console.log(` 总数量: ${response.data.data.pagination.total}`);
|
||
|
||
// 显示前3个项目的基本信息
|
||
const projects = response.data.data.projects.slice(0, 3);
|
||
projects.forEach((project, index) => {
|
||
console.log(` 项目${index + 1}: ${project.name} (${project.status}) - ${project.farmName}`);
|
||
});
|
||
|
||
return true;
|
||
} else {
|
||
console.error('❌ 获取项目列表失败:', response.data.message);
|
||
return false;
|
||
}
|
||
} catch (error) {
|
||
console.error('❌ 获取项目列表请求失败:', error.message);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// 测试获取项目统计
|
||
async function testGetProjectStats() {
|
||
console.log('\n📊 测试获取项目统计...');
|
||
|
||
const options = {
|
||
hostname: 'localhost',
|
||
port: 5351,
|
||
path: '/api/projects/stats',
|
||
method: 'GET',
|
||
headers: {
|
||
'Authorization': `Bearer ${authToken}`,
|
||
'Content-Type': 'application/json'
|
||
}
|
||
};
|
||
|
||
try {
|
||
const response = await makeRequest(options);
|
||
|
||
if (response.statusCode === 200 && response.data.success) {
|
||
console.log('✅ 获取项目统计成功');
|
||
const stats = response.data.data;
|
||
console.log(` 总项目数: ${stats.total}`);
|
||
console.log(` 监管中: ${stats.supervision}`);
|
||
console.log(` 已结项: ${stats.completed}`);
|
||
console.log(` 总监管金额: ${stats.totalAmount?.toFixed(2) || 0} 元`);
|
||
console.log(` 总监管数量: ${stats.totalQuantity || 0} 头`);
|
||
return true;
|
||
} else {
|
||
console.error('❌ 获取项目统计失败:', response.data.message);
|
||
return false;
|
||
}
|
||
} catch (error) {
|
||
console.error('❌ 获取项目统计请求失败:', error.message);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// 测试创建项目
|
||
async function testCreateProject() {
|
||
console.log('\n➕ 测试创建项目...');
|
||
|
||
const options = {
|
||
hostname: 'localhost',
|
||
port: 5351,
|
||
path: '/api/projects',
|
||
method: 'POST',
|
||
headers: {
|
||
'Authorization': `Bearer ${authToken}`,
|
||
'Content-Type': 'application/json'
|
||
}
|
||
};
|
||
|
||
const projectData = {
|
||
name: '测试项目',
|
||
status: 'supervision',
|
||
farmName: '测试养殖场',
|
||
supervisionObject: '牛',
|
||
supervisionQuantity: 20,
|
||
supervisionPeriod: '30天',
|
||
supervisionAmount: 50000.00,
|
||
startTime: '2024-01-01',
|
||
endTime: '2024-12-31',
|
||
earTag: 10,
|
||
collar: 10,
|
||
host: 1,
|
||
loanOfficer: '测试专员',
|
||
description: '这是一个测试项目'
|
||
};
|
||
|
||
try {
|
||
const response = await makeRequest(options, projectData);
|
||
|
||
if (response.statusCode === 201 && response.data.success) {
|
||
console.log('✅ 创建项目成功');
|
||
console.log(` 项目ID: ${response.data.data.id}`);
|
||
console.log(` 项目名称: ${response.data.data.name}`);
|
||
return response.data.data.id;
|
||
} else {
|
||
console.error('❌ 创建项目失败:', response.data.message);
|
||
return null;
|
||
}
|
||
} catch (error) {
|
||
console.error('❌ 创建项目请求失败:', error.message);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
// 测试获取项目详情
|
||
async function testGetProjectById(projectId) {
|
||
console.log('\n🔍 测试获取项目详情...');
|
||
|
||
const options = {
|
||
hostname: 'localhost',
|
||
port: 5351,
|
||
path: `/api/projects/${projectId}`,
|
||
method: 'GET',
|
||
headers: {
|
||
'Authorization': `Bearer ${authToken}`,
|
||
'Content-Type': 'application/json'
|
||
}
|
||
};
|
||
|
||
try {
|
||
const response = await makeRequest(options);
|
||
|
||
if (response.statusCode === 200 && response.data.success) {
|
||
console.log('✅ 获取项目详情成功');
|
||
const project = response.data.data;
|
||
console.log(` 项目名称: ${project.name}`);
|
||
console.log(` 养殖场: ${project.farmName}`);
|
||
console.log(` 监管对象: ${project.supervisionObject}`);
|
||
console.log(` 监管数量: ${project.supervisionQuantity}`);
|
||
console.log(` 监管金额: ${project.supervisionAmount} 元`);
|
||
return true;
|
||
} else {
|
||
console.error('❌ 获取项目详情失败:', response.data.message);
|
||
return false;
|
||
}
|
||
} catch (error) {
|
||
console.error('❌ 获取项目详情请求失败:', error.message);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// 测试更新项目
|
||
async function testUpdateProject(projectId) {
|
||
console.log('\n✏️ 测试更新项目...');
|
||
|
||
const options = {
|
||
hostname: 'localhost',
|
||
port: 5351,
|
||
path: `/api/projects/${projectId}`,
|
||
method: 'PUT',
|
||
headers: {
|
||
'Authorization': `Bearer ${authToken}`,
|
||
'Content-Type': 'application/json'
|
||
}
|
||
};
|
||
|
||
const updateData = {
|
||
supervisionQuantity: 25,
|
||
supervisionAmount: 60000.00,
|
||
description: '更新后的项目描述'
|
||
};
|
||
|
||
try {
|
||
const response = await makeRequest(options, updateData);
|
||
|
||
if (response.statusCode === 200 && response.data.success) {
|
||
console.log('✅ 更新项目成功');
|
||
const project = response.data.data;
|
||
console.log(` 更新后监管数量: ${project.supervisionQuantity}`);
|
||
console.log(` 更新后监管金额: ${project.supervisionAmount} 元`);
|
||
return true;
|
||
} else {
|
||
console.error('❌ 更新项目失败:', response.data.message);
|
||
return false;
|
||
}
|
||
} catch (error) {
|
||
console.error('❌ 更新项目请求失败:', error.message);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// 测试删除项目
|
||
async function testDeleteProject(projectId) {
|
||
console.log('\n🗑️ 测试删除项目...');
|
||
|
||
const options = {
|
||
hostname: 'localhost',
|
||
port: 5351,
|
||
path: `/api/projects/${projectId}`,
|
||
method: 'DELETE',
|
||
headers: {
|
||
'Authorization': `Bearer ${authToken}`,
|
||
'Content-Type': 'application/json'
|
||
}
|
||
};
|
||
|
||
try {
|
||
const response = await makeRequest(options);
|
||
|
||
if (response.statusCode === 200 && response.data.success) {
|
||
console.log('✅ 删除项目成功');
|
||
return true;
|
||
} else {
|
||
console.error('❌ 删除项目失败:', response.data.message);
|
||
return false;
|
||
}
|
||
} catch (error) {
|
||
console.error('❌ 删除项目请求失败:', error.message);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// 测试搜索项目
|
||
async function testSearchProjects() {
|
||
console.log('\n🔍 测试搜索项目...');
|
||
|
||
const options = {
|
||
hostname: 'localhost',
|
||
port: 5351,
|
||
path: '/api/projects?search=张洪彬&status=completed',
|
||
method: 'GET',
|
||
headers: {
|
||
'Authorization': `Bearer ${authToken}`,
|
||
'Content-Type': 'application/json'
|
||
}
|
||
};
|
||
|
||
try {
|
||
const response = await makeRequest(options);
|
||
|
||
if (response.statusCode === 200 && response.data.success) {
|
||
console.log('✅ 搜索项目成功');
|
||
console.log(` 搜索结果数量: ${response.data.data.projects.length}`);
|
||
const projects = response.data.data.projects;
|
||
projects.forEach((project, index) => {
|
||
console.log(` 结果${index + 1}: ${project.name} - ${project.farmName}`);
|
||
});
|
||
return true;
|
||
} else {
|
||
console.error('❌ 搜索项目失败:', response.data.message);
|
||
return false;
|
||
}
|
||
} catch (error) {
|
||
console.error('❌ 搜索项目请求失败:', error.message);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// 主测试函数
|
||
async function runTests() {
|
||
console.log('🚀 开始测试项目清单API接口...\n');
|
||
|
||
// 1. 登录
|
||
const loginSuccess = await login();
|
||
if (!loginSuccess) {
|
||
console.log('❌ 登录失败,无法继续测试');
|
||
return;
|
||
}
|
||
|
||
// 2. 测试获取项目列表
|
||
await testGetProjects();
|
||
|
||
// 3. 测试获取项目统计
|
||
await testGetProjectStats();
|
||
|
||
// 4. 测试搜索项目
|
||
await testSearchProjects();
|
||
|
||
// 5. 测试创建项目
|
||
const projectId = await testCreateProject();
|
||
|
||
if (projectId) {
|
||
// 6. 测试获取项目详情
|
||
await testGetProjectById(projectId);
|
||
|
||
// 7. 测试更新项目
|
||
await testUpdateProject(projectId);
|
||
|
||
// 8. 测试删除项目
|
||
await testDeleteProject(projectId);
|
||
}
|
||
|
||
console.log('\n🎉 项目清单API接口测试完成!');
|
||
}
|
||
|
||
// 运行测试
|
||
runTests().catch(console.error);
|