const request = require('supertest'); const app = require('../final-backend'); describe('质保金数据正确性测试 - TDD Red/Green', () => { describe('项目详情API - 质保金数据', () => { test('GET /api/projects/:id - 应该返回正确的质保金比例(从合同表读取)', async () => { const response = await request(app).get('/api/projects/1'); expect(response.status).toBe(200); expect(response.body.success).toBe(true); expect(response.body.data).toHaveProperty('warranty_percent'); // 质保比例应该从 project_contracts 表的 warranty_deposit_percentage 字段读取 // 而不是硬编码为 5 const warrantyPercent = parseFloat(response.body.data.warranty_percent); expect(warrantyPercent).toBeGreaterThan(0); expect(warrantyPercent).toBeLessThanOrEqual(100); }); test('GET /api/projects/:id - 质保金金额应该根据合同金额和比例正确计算', async () => { const response = await request(app).get('/api/projects/1'); expect(response.status).toBe(200); expect(response.body.success).toBe(true); const contractAmount = parseFloat(response.body.data.contract_amount || '0'); const warrantyPercent = parseFloat(response.body.data.warranty_percent || '0'); const warrantyAmount = parseFloat(response.body.data.warranty_amount || '0'); // 质保金金额 = 合同金额 * 质保比例 / 100 const expectedWarrantyAmount = Math.round(contractAmount * warrantyPercent / 100); // 允许1元的四舍五入误差 expect(Math.abs(warrantyAmount - expectedWarrantyAmount)).toBeLessThanOrEqual(1); }); test('GET /api/projects/:id - 质保期限应该从合同表读取', async () => { const response = await request(app).get('/api/projects/1'); expect(response.status).toBe(200); expect(response.body.success).toBe(true); expect(response.body.data).toHaveProperty('warranty_months'); // 质保期限应该是数字且大于0 const warrantyMonths = parseInt(response.body.data.warranty_months); expect(warrantyMonths).toBeGreaterThan(0); }); }); describe('项目质保金列表API', () => { test('GET /api/projects/:id/warranty-deposits - 应该返回质保金记录', async () => { const response = await request(app).get('/api/projects/1/warranty-deposits'); expect(response.status).toBe(200); expect(response.body.success).toBe(true); expect(Array.isArray(response.body.data)).toBe(true); }); }); describe('质保金数据字段正确性测试', () => { test('质保金数据应该包含所有必要字段', async () => { const response = await request(app).get('/api/projects/1'); expect(response.status).toBe(200); expect(response.body.success).toBe(true); const data = response.body.data; // 检查所有质保金相关字段 expect(data).toHaveProperty('has_warranty'); expect(data).toHaveProperty('warranty_amount'); expect(data).toHaveProperty('warranty_percent'); expect(data).toHaveProperty('warranty_months'); expect(data).toHaveProperty('warranty_start_date'); expect(data).toHaveProperty('warranty_end_date'); expect(data).toHaveProperty('warranty_status'); }); test('质保比例和质保期限应该是不同的值', async () => { const response = await request(app).get('/api/projects/1'); expect(response.status).toBe(200); expect(response.body.success).toBe(true); const warrantyPercent = parseFloat(response.body.data.warranty_percent); const warrantyMonths = parseInt(response.body.data.warranty_months); // 质保比例(百分比)和质保期限(月数)应该是不同的概念 // 比例通常是 0-100 之间的数,期限通常是 12、24 等月数 // 它们不应该相等(除非是极端情况,但测试中应该区分) expect(typeof warrantyPercent).toBe('number'); expect(typeof warrantyMonths).toBe('number'); expect(warrantyPercent).not.toBeNaN(); expect(warrantyMonths).not.toBeNaN(); }); }); });