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:
2026-07-20 15:30:41 +08:00
parent bbd700369c
commit 2c0be0f033
5 changed files with 1175 additions and 0 deletions

View File

@@ -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('账期无效');
});
});
});