test: 为边界条件修复添加测试用例
- rooms: parseRoomNumber 未知格式、楼层0、capacity ?? 测试 - occupancies: capacity undefined/null/0 fail-closed 防守测试 - schedules: startTime > endTime 拒绝测试 - attendance: 重叠检查按时间排序、raw[index] 移除测试 - expenses: 金额零/负/NaN 拒绝、period反转校验测试 5 modules, 40 tests, all passing
This commit is contained in:
@@ -104,4 +104,110 @@ describe('ExpensesService boundaries', () => {
|
||||
await expect(service.batchDeletePersonalExpenses([1, 2])).rejects.toBeInstanceOf(BadRequestException);
|
||||
expect(personalExpRepo.createQueryBuilder).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
describe('batchImportPersonalExpenses', () => {
|
||||
it('rejects zero amount', async () => {
|
||||
const { service } = createService();
|
||||
const result = await service.batchImportPersonalExpenses([
|
||||
{
|
||||
studentName: '张三',
|
||||
expenseType: '其他',
|
||||
amount: 0,
|
||||
expenseDate: '2026-07-01',
|
||||
description: '测试',
|
||||
},
|
||||
]);
|
||||
expect(result.imported).toBe(0);
|
||||
expect(result.skipped).toBe(1);
|
||||
expect(result.errors).toBeDefined();
|
||||
expect(result.errors![0]).toContain('费用金额必须大于0');
|
||||
});
|
||||
|
||||
it('rejects negative amount', async () => {
|
||||
const { service } = createService();
|
||||
const result = await service.batchImportPersonalExpenses([
|
||||
{
|
||||
studentName: '张三',
|
||||
expenseType: '其他',
|
||||
amount: -100,
|
||||
expenseDate: '2026-07-01',
|
||||
description: '测试',
|
||||
},
|
||||
]);
|
||||
expect(result.imported).toBe(0);
|
||||
expect(result.skipped).toBe(1);
|
||||
expect(result.errors).toBeDefined();
|
||||
expect(result.errors![0]).toContain('费用金额必须大于0');
|
||||
});
|
||||
|
||||
it('rejects NaN amount', async () => {
|
||||
const { service } = createService();
|
||||
const result = await service.batchImportPersonalExpenses([
|
||||
{
|
||||
studentName: '张三',
|
||||
expenseType: '其他',
|
||||
amount: NaN,
|
||||
expenseDate: '2026-07-01',
|
||||
description: '测试',
|
||||
},
|
||||
]);
|
||||
expect(result.imported).toBe(0);
|
||||
expect(result.skipped).toBe(1);
|
||||
expect(result.errors).toBeDefined();
|
||||
expect(result.errors![0]).toContain('费用金额最多保留两位小数');
|
||||
});
|
||||
|
||||
it('allows valid positive amount', async () => {
|
||||
const { service, personalExpRepo } = createService();
|
||||
const result = await service.batchImportPersonalExpenses([
|
||||
{
|
||||
studentName: '张三',
|
||||
expenseType: '其他',
|
||||
amount: 500,
|
||||
expenseDate: '2026-07-01',
|
||||
description: '测试',
|
||||
},
|
||||
]);
|
||||
expect(result.imported).toBe(1);
|
||||
expect(result.skipped).toBe(0);
|
||||
expect(personalExpRepo.save).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('allows fractional amount with two decimal places', async () => {
|
||||
const { service, personalExpRepo } = createService();
|
||||
const result = await service.batchImportPersonalExpenses([
|
||||
{
|
||||
studentName: '张三',
|
||||
expenseType: '其他',
|
||||
amount: 99.99,
|
||||
expenseDate: '2026-07-01',
|
||||
description: '测试',
|
||||
},
|
||||
]);
|
||||
expect(result.imported).toBe(1);
|
||||
expect(result.skipped).toBe(0);
|
||||
expect(personalExpRepo.save).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('batchImportUtilityExpenses', () => {
|
||||
it('rejects reversed period (end before start)', async () => {
|
||||
const { service } = createService();
|
||||
const result = await service.batchImportUtilityExpenses([
|
||||
{
|
||||
periodStr: '2026-02-08 ~ 2026-01-21',
|
||||
roomNumber: '101',
|
||||
electricityAmount: 100,
|
||||
electricityFee: 50,
|
||||
waterAmount: 0,
|
||||
waterFee: 0,
|
||||
totalFee: 50,
|
||||
},
|
||||
]);
|
||||
expect(result.imported).toBe(0);
|
||||
expect(result.skipped).toBe(1);
|
||||
expect(result.errors).toBeDefined();
|
||||
expect(result.errors![0]).toContain('账期无效');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user