Files
Agent-System/web/src/engine/authIntegration.test.ts
T

144 lines
4.8 KiB
TypeScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { createInMemoryAuthClient } from '../api/auth';
import { DEFAULT_ROLES, hasPermission } from './rbac';
import { UserProfile } from '../types/docgov';
test('全链路场景 1: 用户自主受控注册(仅填用户名/密码/姓名,职位严格绑定访客待指派)', async () => {
const client = createInMemoryAuthClient({
allowRegistration: true,
requireApproval: false,
env: 'dev',
});
// 1. 自主注册新员工
const regRes = await client.register({
username: 'new_intern',
password: 'InternPass123',
name: '陈实习',
department: '微创器械研发部',
employeeId: 'INT-001',
});
assert.equal(regRes.status, 'active');
assert.match(regRes.message, /成功/);
// 2. 登录并校验角色为 role-guest,职位为 访客/待指派
const session = await client.login({
username: 'new_intern',
password: 'InternPass123',
});
assert.equal(session.user.name, '陈实习');
assert.equal(session.user.roleId, 'role-guest');
assert.equal(session.user.position, '访客/待指派');
// 3. 校验访客默认无项目立项与权限管理能力
const profile: UserProfile = session.user;
assert.equal(hasPermission(profile, DEFAULT_ROLES, 'project:create'), false);
assert.equal(hasPermission(profile, DEFAULT_ROLES, 'perm:manage'), false);
});
test('全链路场景 2: 系统准入策略(关闭自主注册与开启强制审批流转)', async () => {
const client = createInMemoryAuthClient({
allowRegistration: false,
requireApproval: true,
env: 'test',
});
// 1. 关闭自主注册时拦截
await assert.rejects(
async () => {
await client.register({
username: 'outsider',
password: 'Pass123456',
name: '外协人员',
});
},
/暂停自主注册/
);
// 2. 管理员开启注册但要求审批
await client.updateSystemAuthConfig({
allowRegistration: true,
requireApproval: true,
});
const regRes = await client.register({
username: 'outsider',
password: 'Pass123456',
name: '外协人员',
});
assert.equal(regRes.status, 'pending_approval');
// 3. 待审状态禁止登录
await assert.rejects(
async () => {
await client.login({ username: 'outsider', password: 'Pass123456' });
},
/审核/
);
// 4. 管理员审核通过并授予工程师职位
await client.updateUserStatus(regRes.userId!, 'active', 'role-engineer', '方案工程师');
// 5. 再次登录成功激活
const session = await client.login({ username: 'outsider', password: 'Pass123456' });
assert.equal(session.user.status, 'active');
assert.equal(session.user.roleId, 'role-engineer');
assert.equal(session.user.position, '方案工程师');
});
test('全链路场景 3: 管理员开通账号首次强制改密闭环', async () => {
const client = createInMemoryAuthClient({
adminUsername: 'admin',
adminPassword: 'admin-password-123',
});
// 1. 管理员开通新员工账号
const created = await client.createAdminUser({
username: 'sun_engineer',
name: '孙工',
initialPassword: 'InitPassword123',
roleId: 'role-engineer',
position: '方案工程师',
department: '骨科器械组',
});
assert.equal(created.mustChangePassword, true);
// 2. 孙工首次登录,返回 mustChangePassword = true
const session = await client.login({
username: 'sun_engineer',
password: 'InitPassword123',
});
assert.equal(session.mustChangePassword, true);
// 3. 执行首次强制改密
await client.changePassword(session.user.id, 'InitPassword123', 'SunNewSecret999');
// 4. 再次登录,验证 mustChangePassword 复位为 false
const freshSession = await client.login({
username: 'sun_engineer',
password: 'SunNewSecret999',
});
assert.equal(freshSession.mustChangePassword, false);
});
test('全链路场景 4: 环境隔离守卫(dev 允许切人,test/main 彻底禁用)', async () => {
// DEV 环境
const devClient = createInMemoryAuthClient({ env: 'dev' });
const devSession = await devClient.login({ username: 'admin', password: 'admin-secret-password-123' });
assert.equal(devSession.env, 'dev');
assert.equal(devSession.allowDevSwitch, true);
// TEST 环境
const testClient = createInMemoryAuthClient({ env: 'test' });
const testSession = await testClient.login({ username: 'admin', password: 'admin-secret-password-123' });
assert.equal(testSession.env, 'test');
assert.equal(testSession.allowDevSwitch, false);
// MAIN 生产环境
const prodClient = createInMemoryAuthClient({ env: 'main' });
const prodSession = await prodClient.login({ username: 'admin', password: 'admin-secret-password-123' });
assert.equal(prodSession.env, 'main');
assert.equal(prodSession.allowDevSwitch, false);
});