const request = require('supertest'); const fs = require('fs'); const path = require('path'); // 测试基础URL const BASE_URL = 'http://localhost:3005'; // 测试文件路径 const TEST_IMAGE_PATH = path.join(__dirname, 'uploads', 'test-image.png'); // 测试数据 const testUser = { username: 'admin', password: 'admin123' }; let authToken = ''; // 测试套件 describe('财务流程完整测试', () => { // 登录获取token beforeAll(async () => { const response = await request(BASE_URL) .post('/api/auth/login') .send(testUser); expect(response.status).toBe(200); expect(response.body.success).toBe(true); authToken = response.body.token; }); // 测试预支申请流程 describe('预支申请流程', () => { let advanceId = ''; let advanceCode = ''; test('1. 创建预支申请', async () => { const response = await request(BASE_URL) .post('/api/advances') .set('Authorization', `Bearer ${authToken}`) .field('advance_date', '2026-03-24') .field('amount', 5000) .field('currency', 'CNY') .field('reason', '项目差旅预支') .field('expense_type', 'project') .field('project_id', '1') .field('applicant', '测试用户') .attach('attachments', TEST_IMAGE_PATH); expect(response.status).toBe(200); expect(response.body.success).toBe(true); advanceId = response.body.data.id; advanceCode = response.body.data.advance_code; }); test('2. 提交预支申请到审批', async () => { const response = await request(BASE_URL) .put(`/api/advances/${advanceId}/submit`) .set('Authorization', `Bearer ${authToken}`); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); test('3. 审批预支申请', async () => { const response = await request(BASE_URL) .put(`/api/advances/${advanceId}/approve`) .set('Authorization', `Bearer ${authToken}`) .send({ approver: '系统管理员' }); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); test('4. 执行预支付款', async () => { const response = await request(BASE_URL) .post('/api/executions') .set('Authorization', `Bearer ${authToken}`) .send({ apply_id: advanceId, apply_type: 'advance', action: 'execute', execute_method: '银行转账', voucher_no: 'VCH' + Date.now(), remark: '测试执行' }); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); test('5. 验证预支执行状态', async () => { const response = await request(BASE_URL) .get(`/api/advances/${advanceId}`) .set('Authorization', `Bearer ${authToken}`); expect(response.status).toBe(200); expect(response.body.success).toBe(true); expect(response.body.data.status).toBe('executed'); }); }); // 测试报销申请流程 describe('报销申请流程', () => { let reimbursementId = ''; test('1. 创建报销申请', async () => { const response = await request(BASE_URL) .post('/api/reimbursements') .set('Authorization', `Bearer ${authToken}`) .field('reimbursement_date', '2026-03-24') .field('amount', 3500) .field('currency', 'CNY') .field('reason', '项目差旅报销') .field('expense_type', 'project') .field('project_id', '1') .field('applicant', '测试用户') .field('detail_items', JSON.stringify([ { description: '住宿费', amount: 2000, category: 'accommodation', attachments: [] }, { description: '餐饮费', amount: 1500, category: 'food', attachments: [] } ])) .attach('attachments', TEST_IMAGE_PATH); expect(response.status).toBe(200); expect(response.body.success).toBe(true); reimbursementId = response.body.data.id; }); test('2. 提交报销申请到审批', async () => { const response = await request(BASE_URL) .put(`/api/reimbursements/${reimbursementId}/submit`) .set('Authorization', `Bearer ${authToken}`); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); test('3. 审批报销申请', async () => { const response = await request(BASE_URL) .put(`/api/reimbursements/${reimbursementId}/approve`) .set('Authorization', `Bearer ${authToken}`) .send({ approver: '系统管理员' }); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); test('4. 执行报销付款', async () => { const response = await request(BASE_URL) .post('/api/executions') .set('Authorization', `Bearer ${authToken}`) .send({ apply_id: reimbursementId, apply_type: 'reimbursement', action: 'execute', execute_method: '银行转账', voucher_no: 'VCH' + Date.now(), remark: '测试执行' }); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); }); // 测试付款申请流程 describe('付款申请流程', () => { let paymentId = ''; test('1. 创建付款申请', async () => { const response = await request(BASE_URL) .post('/api/payments') .set('Authorization', `Bearer ${authToken}`) .field('payment_date', '2026-03-24') .field('amount', 50000) .field('currency', 'CNY') .field('reason', '设备采购款') .field('expense_type', 'company') .field('payee', '测试供应商') .field('applicant', '测试用户') .attach('attachments', TEST_IMAGE_PATH); expect(response.status).toBe(200); expect(response.body.success).toBe(true); paymentId = response.body.data.id; }); test('2. 提交付款申请到审批', async () => { const response = await request(BASE_URL) .put(`/api/payments/${paymentId}/submit`) .set('Authorization', `Bearer ${authToken}`); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); test('3. 审批付款申请', async () => { const response = await request(BASE_URL) .put(`/api/payments/${paymentId}/approve`) .set('Authorization', `Bearer ${authToken}`) .send({ approver: '系统管理员' }); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); test('4. 执行付款', async () => { const response = await request(BASE_URL) .post('/api/executions') .set('Authorization', `Bearer ${authToken}`) .send({ apply_id: paymentId, apply_type: 'payment', action: 'execute', execute_method: '银行转账', voucher_no: 'VCH' + Date.now(), remark: '测试执行' }); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); }); // 测试核销申请流程 describe('核销申请流程', () => { let verificationId = ''; test('1. 创建核销申请', async () => { const response = await request(BASE_URL) .post('/api/verifications') .set('Authorization', `Bearer ${authToken}`) .field('verification_date', '2026-03-24') .field('advance_id', '1') .field('actual_amount', 4500) .field('balance', 500) .field('reason', '项目差旅核销') .field('applicant', '测试用户') .field('detail_items', JSON.stringify([ { description: '住宿费', amount: 2500, category: 'accommodation', attachments: [] }, { description: '餐饮费', amount: 2000, category: 'food', attachments: [] } ])) .attach('attachments', TEST_IMAGE_PATH); expect(response.status).toBe(200); expect(response.body.success).toBe(true); verificationId = response.body.data.id; }); test('2. 提交核销申请到审批', async () => { const response = await request(BASE_URL) .put(`/api/verifications/${verificationId}/submit`) .set('Authorization', `Bearer ${authToken}`); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); test('3. 审批核销申请', async () => { const response = await request(BASE_URL) .put(`/api/verifications/${verificationId}/approve`) .set('Authorization', `Bearer ${authToken}`) .send({ approver: '系统管理员' }); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); test('4. 执行核销', async () => { const response = await request(BASE_URL) .post('/api/executions') .set('Authorization', `Bearer ${authToken}`) .send({ apply_id: verificationId, apply_type: 'verification', action: 'execute', execute_method: '银行转账', voucher_no: 'VCH' + Date.now(), remark: '测试执行' }); expect(response.status).toBe(200); expect(response.body.success).toBe(true); }); }); // 测试执行记录查询 describe('执行记录查询', () => { test('查询执行记录列表', async () => { const response = await request(BASE_URL) .get('/api/executions') .set('Authorization', `Bearer ${authToken}`); expect(response.status).toBe(200); expect(response.body.success).toBe(true); expect(Array.isArray(response.body.data)).toBe(true); }); test('查询待执行列表', async () => { const response = await request(BASE_URL) .get('/api/executions/pending') .set('Authorization', `Bearer ${authToken}`); expect(response.status).toBe(200); expect(response.body.success).toBe(true); expect(Array.isArray(response.body.data)).toBe(true); }); test('查询已执行列表', async () => { const response = await request(BASE_URL) .get('/api/executions/executed') .set('Authorization', `Bearer ${authToken}`); expect(response.status).toBe(200); expect(response.body.success).toBe(true); expect(Array.isArray(response.body.data)).toBe(true); }); }); });