test: harden business boundary conditions

This commit is contained in:
2026-07-15 00:03:55 +08:00
parent 17a5046ea0
commit b1f35f9d1a
65 changed files with 2311 additions and 293 deletions

View File

@@ -0,0 +1,52 @@
import 'reflect-metadata';
import { plainToInstance } from 'class-transformer';
import { validate } from 'class-validator';
import { QueryOperationLogsDto } from './dto/operation-log.dto';
import { OperationLogsService } from './operation-logs.service';
const createQb = () => ({
orderBy: jest.fn().mockReturnThis(),
andWhere: jest.fn().mockReturnThis(),
skip: jest.fn().mockReturnThis(),
take: jest.fn().mockReturnThis(),
getManyAndCount: jest.fn().mockResolvedValue([[], 0]),
});
describe('operation log query boundaries', () => {
it.each(['0', '-1', '1.5', 'abc'])('rejects invalid page %s', async (page) => {
const dto = plainToInstance(QueryOperationLogsDto, { page });
expect((await validate(dto)).some((error) => error.property === 'page')).toBe(true);
});
it.each(['0', '201', '1.5', 'abc'])('rejects invalid page size %s', async (pageSize) => {
const dto = plainToInstance(QueryOperationLogsDto, { pageSize });
expect((await validate(dto)).some((error) => error.property === 'pageSize')).toBe(true);
});
it.each(['2026-02-31', '2026-07-13T00:00:00Z'])(
'rejects invalid or non-date-only value %s',
async (startDate) => {
const dto = plainToInstance(QueryOperationLogsDto, { startDate });
expect((await validate(dto)).some((error) => error.property === 'startDate')).toBe(true);
},
);
it('transforms valid pagination and applies its database window', async () => {
const dto = plainToInstance(QueryOperationLogsDto, { page: '2', pageSize: '20' });
expect(await validate(dto)).toEqual([]);
const qb = createQb();
const service = new OperationLogsService({ createQueryBuilder: jest.fn().mockReturnValue(qb) } as never);
await service.findAll(dto);
expect(qb.skip).toHaveBeenCalledWith(20);
expect(qb.take).toHaveBeenCalledWith(20);
});
it('rejects a reversed period before opening a query', async () => {
const repo = { createQueryBuilder: jest.fn() };
const service = new OperationLogsService(repo as never);
await expect(service.findAll({ startDate: '2026-08-01', endDate: '2026-07-31' }))
.rejects.toThrow('结束日期不能早于开始日期');
expect(repo.createQueryBuilder).not.toHaveBeenCalled();
});
});