Files
gongxue-base/apps/server/src/sync/sync.controller.spec.ts
wangziqi 393ee62168
All checks were successful
CI / check (pull_request) Successful in 2m14s
feat: add Jinshuju student sync
2026-07-22 11:41:50 +08:00

66 lines
2.2 KiB
TypeScript

import { BadRequestException } from '@nestjs/common';
import { SyncController } from './sync.controller';
import { ScheduleSyncQueryDto } from './dto/schedule-sync.dto';
describe('SyncController — schedule sync options', () => {
it('forwards the attendance-machine-only option', async () => {
const syncService = {
syncScheduleToDingTalk: jest.fn().mockResolvedValue({ syncedItems: 0 }),
};
const controller = new SyncController(syncService as never);
await controller.syncSchedule(Object.assign(new ScheduleSyncQueryDto(), {
dateFrom: '2026-07-10',
days: 30,
attendanceMachineOnly: true,
}));
expect(syncService.syncScheduleToDingTalk).toHaveBeenCalledWith(
'2026-07-10',
30,
true,
);
});
it.each(['1abc', '0', '-1', '9007199254740992'])(
'rejects invalid root department id %s',
async (rootDeptId) => {
const syncService = { triggerSync: jest.fn() };
const controller = new SyncController(syncService as never);
await expect(controller.triggerSync('dingtalk_students', rootDeptId)).rejects.toBeInstanceOf(
BadRequestException,
);
expect(syncService.triggerSync).not.toHaveBeenCalled();
},
);
it('accepts a positive integer root department id', async () => {
const syncService = { triggerSync: jest.fn().mockResolvedValue([]) };
const controller = new SyncController(syncService as never);
await controller.triggerSync('dingtalk_students', '12');
expect(syncService.triggerSync).toHaveBeenCalledWith('dingtalk_students', 12);
});
it('returns Jinshuju form fields for the selector', async () => {
const syncService = {
getJinshujuFormFields: jest.fn().mockResolvedValue({
name: '报名表',
fields: [{ key: 'field_1', label: '姓名', type: 'single_line_text' }],
}),
};
const controller = new SyncController(syncService as never);
const result = await controller.getJinshujuFields({
apiKey: 'key',
apiSecret: 'secret',
formToken: 'form-a',
});
expect(syncService.getJinshujuFormFields).toHaveBeenCalledWith('key', 'secret', 'form-a');
expect(result.data.fields[0]).toMatchObject({ key: 'field_1', label: '姓名' });
});
});