Files
gongxue-base/apps/server/src/imports/imports.controller.spec.ts
wangziqi 7f09d5271e feat(imports): 导入向导兼容旧版工作簿并完善执行/预览
- 新增 xls 工作簿回退解析与测试
- 执行/预览/权限校验逻辑完善
2026-08-06 11:59:51 +08:00

89 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ImportsController } from './imports.controller';
describe('ImportsController', () => {
const principalRequest = {
user: { id: 7, username: 'admin', permissions: [], isSuperAdmin: true },
headers: { 'user-agent': 'jest-agent' },
connection: { remoteAddress: '127.0.0.1' },
};
it('路由门槛允许 AI 用户打开本人 run同时保留原有导入权限', () => {
const permissions = Reflect.getMetadata('permissions', ImportsController) as string[];
expect(permissions).toContain('ai:chat:use');
expect(permissions).toEqual(
expect.arrayContaining([
'student:import',
'room:create',
'room:edit',
'occupancy:checkin',
'occupancy:transfer',
]),
);
});
it('提交导入阶段成功后写入操作日志', async () => {
const commitStep = jest.fn().mockResolvedValue({
runId: 'run-1',
stepKey: 'students',
status: 'committed',
created: 2,
updated: 0,
skipped: 0,
failed: 0,
total: 2,
nextStepKey: null,
runStatus: 'committed',
message: '阶段「学生档案」提交完成:新建 2、更新 0、跳过 0、失败 0全部阶段已完成',
});
const opLog = { log: jest.fn().mockResolvedValue(undefined) };
const controller = new ImportsController({ commitStep } as never, opLog as never);
await controller.commit(
principalRequest as never,
'run-1',
'students',
{ decisions: [] },
);
expect(opLog.log).toHaveBeenCalledWith(
expect.objectContaining({
userId: 7,
username: 'admin',
module: '批量导入',
action: '提交导入阶段',
detail: expect.stringContaining('提交完成'),
targetType: 'import_run',
ipAddress: '127.0.0.1',
userAgent: 'jest-agent',
}),
);
});
it('非 committed 回执conflict/already_committed不重复写日志', async () => {
const commitStep = jest.fn().mockResolvedValue({
runId: 'run-1',
stepKey: 'students',
status: 'conflict',
created: 0,
updated: 0,
skipped: 0,
failed: 0,
total: 0,
nextStepKey: null,
runStatus: 'ready',
message: '请先完成前置阶段',
});
const opLog = { log: jest.fn().mockResolvedValue(undefined) };
const controller = new ImportsController({ commitStep } as never, opLog as never);
await controller.commit(
principalRequest as never,
'run-1',
'transfers',
{ decisions: [] },
);
expect(opLog.log).not.toHaveBeenCalled();
});
});