89 lines
2.6 KiB
TypeScript
89 lines
2.6 KiB
TypeScript
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();
|
||
});
|
||
});
|