kt-template-online-api/test/admin/admin-user-profile.service.spec.ts

152 lines
4.0 KiB
TypeScript

import { AdminUserService } from '../../src/modules/admin/identity/user/admin-user.service';
describe('AdminUserService profile', () => {
const userRepository = {
create: jest.fn((input) => ({ ...input })),
findOne: jest.fn(),
save: jest.fn(),
update: jest.fn(),
};
const roleRepository = {
find: jest.fn(),
};
const deptRepository = {
find: jest.fn(),
};
const service = new AdminUserService(
userRepository as any,
roleRepository as any,
deptRepository as any,
);
beforeEach(() => {
jest.clearAllMocks();
});
it('uses environment overview as the default home path for created users', async () => {
userRepository.findOne.mockResolvedValue(null);
roleRepository.find.mockResolvedValue([]);
await service.createUser({
realName: '新用户',
roleIds: [],
username: 'new-user',
});
expect(userRepository.create).toHaveBeenCalledWith(
expect.objectContaining({
homePath: '/analytics',
username: 'new-user',
}),
);
expect(userRepository.save).toHaveBeenCalledWith(
expect.objectContaining({
homePath: '/analytics',
}),
);
});
it('updates current profile fields including uploaded avatar url', async () => {
const user = {
avatar: '',
homePath: '/analytics',
id: '2041700000000000001',
realName: '旧姓名',
roles: [],
timezone: 'Asia/Shanghai',
username: 'admin',
};
userRepository.findOne.mockResolvedValue(user);
const result = await service.updateCurrentProfile(user.id, {
avatar:
'/api/minio/download?objectName=avatars%2F2041700000000000001%2Favatar.jpg',
homePath: '/profile',
realName: ' 新姓名 ',
});
expect(userRepository.findOne).toHaveBeenCalledWith(
expect.objectContaining({
relations: ['roles', 'dept'],
where: {
id: user.id,
isDeleted: false,
},
}),
);
expect(userRepository.save).toHaveBeenCalledWith(
expect.objectContaining({
avatar:
'/api/minio/download?objectName=avatars%2F2041700000000000001%2Favatar.jpg',
homePath: '/profile',
realName: '新姓名',
}),
);
expect(result).toEqual(user);
});
it('falls back to environment overview when current profile clears home path', async () => {
const user = {
avatar: '',
homePath: '/profile',
id: '2041700000000000002',
realName: 'KwiTsukasa',
roles: [],
timezone: 'Asia/Shanghai',
username: 'kwitsukasa',
};
userRepository.findOne.mockResolvedValue(user);
await service.updateCurrentProfile(user.id, {
homePath: '',
});
expect(userRepository.save).toHaveBeenCalledWith(
expect.objectContaining({
homePath: '/analytics',
}),
);
});
it('prevents deleting the renamed built-in administrator account', async () => {
userRepository.findOne.mockResolvedValue({
id: '2041700000000000002',
isDeleted: false,
username: 'kwitsukasa',
});
await expect(service.deleteUser('2041700000000000002')).rejects.toMatchObject(
{
response: expect.objectContaining({
msg: '不能删除内置管理员账号',
}),
},
);
expect(userRepository.update).not.toHaveBeenCalled();
});
it('serializes avatar and userId for Admin frontend user store', () => {
expect(
service.serializeUser({
avatar: '/api/minio/download?objectName=avatars%2Favatar.jpg',
homePath: '/analytics',
id: '2041700000000000001',
realName: '管理员',
roles: [],
timezone: 'Asia/Shanghai',
username: 'admin',
} as any),
).toEqual({
avatar: '/api/minio/download?objectName=avatars%2Favatar.jpg',
homePath: '/analytics',
id: '2041700000000000001',
realName: '管理员',
roles: [],
timezone: 'Asia/Shanghai',
userId: '2041700000000000001',
username: 'admin',
});
});
});