feat: 个人记账与预算管理系统 MVP 初始版本
This commit is contained in:
@@ -0,0 +1,227 @@
|
||||
// API Integration Test Script
|
||||
const BASE_URL = 'http://localhost:3001';
|
||||
|
||||
// Helper function for making requests
|
||||
async function request(endpoint, options = {}) {
|
||||
const url = `${BASE_URL}${endpoint}`;
|
||||
const config = {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
...options.headers,
|
||||
},
|
||||
...options,
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await fetch(url, config);
|
||||
const data = await response.json();
|
||||
return { status: response.status, ok: response.ok, data };
|
||||
} catch (error) {
|
||||
return { status: 500, ok: false, error: error.message };
|
||||
}
|
||||
}
|
||||
|
||||
// Test Results
|
||||
const testResults = [];
|
||||
|
||||
async function runTests() {
|
||||
console.log('🚀 Starting API Integration Tests...\n');
|
||||
|
||||
// 1. Health Check
|
||||
console.log('1. Testing Health Check...');
|
||||
const healthTest = await request('/health');
|
||||
testResults.push({
|
||||
name: 'Health Check',
|
||||
passed: healthTest.ok,
|
||||
status: healthTest.status,
|
||||
data: healthTest.data
|
||||
});
|
||||
console.log(` ${healthTest.ok ? '✅' : '❌'} ${healthTest.status}`);
|
||||
|
||||
// 2. Create Test User
|
||||
console.log('\n2. Testing Create User...');
|
||||
const userTest = await request('/api/users', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({ name: 'Test User', email: 'test' + Date.now() + '@example.com' })
|
||||
});
|
||||
testResults.push({
|
||||
name: 'Create User',
|
||||
passed: userTest.ok,
|
||||
status: userTest.status,
|
||||
data: userTest.data
|
||||
});
|
||||
console.log(` ${userTest.ok ? '✅' : '❌'} ${userTest.status}`);
|
||||
|
||||
const userId = userTest.data?.data?.id;
|
||||
if (!userId) {
|
||||
console.log(' ❌ Cannot continue without user ID');
|
||||
return;
|
||||
}
|
||||
console.log(` Created User ID: ${userId}`);
|
||||
|
||||
// 3. Create Account
|
||||
console.log('\n3. Testing Create Account...');
|
||||
const accountTest = await request('/api/accounts', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({ userId, name: '现金账户', type: 'cash', color: '#1890FF', balance: 1000 })
|
||||
});
|
||||
testResults.push({
|
||||
name: 'Create Account',
|
||||
passed: accountTest.ok,
|
||||
status: accountTest.status,
|
||||
data: accountTest.data
|
||||
});
|
||||
console.log(` ${accountTest.ok ? '✅' : '❌'} ${accountTest.status}`);
|
||||
|
||||
const accountId = accountTest.data?.data?.id;
|
||||
|
||||
// 4. Get Accounts
|
||||
console.log('\n4. Testing Get Accounts...');
|
||||
const getAccountsTest = await request(`/api/accounts?userId=${userId}`);
|
||||
testResults.push({
|
||||
name: 'Get Accounts',
|
||||
passed: getAccountsTest.ok,
|
||||
status: getAccountsTest.status,
|
||||
data: getAccountsTest.data
|
||||
});
|
||||
console.log(` ${getAccountsTest.ok ? '✅' : '❌'} ${getAccountsTest.status}`);
|
||||
|
||||
// 5. Create Income Record
|
||||
console.log('\n5. Testing Create Income Record...');
|
||||
const incomeTest = await request('/api/records', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
userId,
|
||||
accountId,
|
||||
type: 'income',
|
||||
amount: 5000,
|
||||
category: '工资',
|
||||
description: '4月份工资',
|
||||
date: new Date().toISOString()
|
||||
})
|
||||
});
|
||||
testResults.push({
|
||||
name: 'Create Income Record',
|
||||
passed: incomeTest.ok,
|
||||
status: incomeTest.status,
|
||||
data: incomeTest.data
|
||||
});
|
||||
console.log(` ${incomeTest.ok ? '✅' : '❌'} ${incomeTest.status}`);
|
||||
|
||||
// 6. Create Expense Record
|
||||
console.log('\n6. Testing Create Expense Record...');
|
||||
const expenseTest = await request('/api/records', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
userId,
|
||||
accountId,
|
||||
type: 'expense',
|
||||
amount: 150,
|
||||
category: '餐饮',
|
||||
description: '午餐',
|
||||
date: new Date().toISOString()
|
||||
})
|
||||
});
|
||||
testResults.push({
|
||||
name: 'Create Expense Record',
|
||||
passed: expenseTest.ok,
|
||||
status: expenseTest.status,
|
||||
data: expenseTest.data
|
||||
});
|
||||
console.log(` ${expenseTest.ok ? '✅' : '❌'} ${expenseTest.status}`);
|
||||
|
||||
// 7. Get Records
|
||||
console.log('\n7. Testing Get Records...');
|
||||
const getRecordsTest = await request(`/api/records?userId=${userId}`);
|
||||
testResults.push({
|
||||
name: 'Get Records',
|
||||
passed: getRecordsTest.ok,
|
||||
status: getRecordsTest.status,
|
||||
data: getRecordsTest.data
|
||||
});
|
||||
console.log(` ${getRecordsTest.ok ? '✅' : '❌'} ${getRecordsTest.status}`);
|
||||
|
||||
// 8. Create Budget
|
||||
const currentMonth = `${new Date().getFullYear()}-${String(new Date().getMonth() + 1).padStart(2, '0')}`;
|
||||
console.log('\n8. Testing Create Budget...');
|
||||
const budgetTest = await request('/api/budgets', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
userId,
|
||||
category: '餐饮',
|
||||
amount: 2000,
|
||||
month: currentMonth
|
||||
})
|
||||
});
|
||||
testResults.push({
|
||||
name: 'Create Budget',
|
||||
passed: budgetTest.ok,
|
||||
status: budgetTest.status,
|
||||
data: budgetTest.data
|
||||
});
|
||||
console.log(` ${budgetTest.ok ? '✅' : '❌'} ${budgetTest.status}`);
|
||||
|
||||
// 9. Get Budgets
|
||||
console.log('\n9. Testing Get Budgets...');
|
||||
const getBudgetsTest = await request(`/api/budgets?userId=${userId}&month=${currentMonth}`);
|
||||
testResults.push({
|
||||
name: 'Get Budgets',
|
||||
passed: getBudgetsTest.ok,
|
||||
status: getBudgetsTest.status,
|
||||
data: getBudgetsTest.data
|
||||
});
|
||||
console.log(` ${getBudgetsTest.ok ? '✅' : '❌'} ${getBudgetsTest.status}`);
|
||||
|
||||
// 10. Monthly Statistics
|
||||
console.log('\n10. Testing Monthly Statistics...');
|
||||
const monthlyStatsTest = await request(`/api/statistics/monthly?userId=${userId}&month=${currentMonth}`);
|
||||
testResults.push({
|
||||
name: 'Monthly Statistics',
|
||||
passed: monthlyStatsTest.ok,
|
||||
status: monthlyStatsTest.status,
|
||||
data: monthlyStatsTest.data
|
||||
});
|
||||
console.log(` ${monthlyStatsTest.ok ? '✅' : '❌'} ${monthlyStatsTest.status}`);
|
||||
|
||||
// 11. Trend Statistics
|
||||
console.log('\n11. Testing Trend Statistics...');
|
||||
const trendTest = await request(`/api/statistics/trend?userId=${userId}`);
|
||||
testResults.push({
|
||||
name: 'Trend Statistics',
|
||||
passed: trendTest.ok,
|
||||
status: trendTest.status,
|
||||
data: trendTest.data
|
||||
});
|
||||
console.log(` ${trendTest.ok ? '✅' : '❌'} ${trendTest.status}`);
|
||||
|
||||
// 12. Dashboard Summary
|
||||
console.log('\n12. Testing Dashboard Summary...');
|
||||
const dashboardTest = await request(`/api/dashboard/summary?userId=${userId}`);
|
||||
testResults.push({
|
||||
name: 'Dashboard Summary',
|
||||
passed: dashboardTest.ok,
|
||||
status: dashboardTest.status,
|
||||
data: dashboardTest.data
|
||||
});
|
||||
console.log(` ${dashboardTest.ok ? '✅' : '❌'} ${dashboardTest.status}`);
|
||||
|
||||
// Summary
|
||||
console.log('\n' + '='.repeat(50));
|
||||
console.log('📊 Test Summary:');
|
||||
const passed = testResults.filter(t => t.passed).length;
|
||||
const total = testResults.length;
|
||||
console.log(` Total: ${total}`);
|
||||
console.log(` Passed: ${passed} ✅`);
|
||||
console.log(` Failed: ${total - passed} ❌`);
|
||||
console.log('='.repeat(50));
|
||||
|
||||
return testResults;
|
||||
}
|
||||
|
||||
runTests().then(results => {
|
||||
console.log('\nTest run completed!');
|
||||
process.exit(0);
|
||||
}).catch(error => {
|
||||
console.error('Test run failed:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user