Files
ftb-project-management/apps/server/src/modules/member/member.service.spec.ts
2026-07-08 15:41:39 +08:00

95 lines
2.6 KiB
TypeScript

import { BadRequestException } from '@nestjs/common';
import { MemberService } from './member.service';
describe('MemberService domain writes', () => {
const makeService = () => {
const prisma = {
user: {
create: jest.fn(),
delete: jest.fn(),
findMany: jest.fn(),
update: jest.fn(),
},
};
return { prisma, service: new MemberService(prisma as any) };
};
it('creates members with UI role and department fields in users', async () => {
const { prisma, service } = makeService();
prisma.user.create.mockResolvedValue({
id: 'member-1',
name: '张三',
username: 'zhangsan',
departmentId: 'dept-2',
roleId: 'role-dev',
phone: '13000000000',
email: 'zhangsan@example.com',
password: 'Ftb12345',
isSystem: false,
createdAt: new Date('2026-07-08T00:00:00.000Z'),
});
await service.create({
name: '张三',
username: 'zhangsan',
departmentId: 'dept-2',
roleId: 'role-dev',
phone: '13000000000',
email: 'zhangsan@example.com',
password: 'Ftb12345',
});
expect(prisma.user.create).toHaveBeenCalledWith({
data: expect.objectContaining({
name: '张三',
username: 'zhangsan',
departmentId: 'dept-2',
roleId: 'role-dev',
phone: '13000000000',
email: 'zhangsan@example.com',
password: 'Ftb12345',
}),
});
});
it('protects the built-in admin from deletion and privileged field edits', async () => {
const { prisma, service } = makeService();
prisma.user.update.mockResolvedValue({
id: 'm-8',
name: '超级管理员',
username: 'admin',
roleId: 'role-admin',
departmentId: '',
phone: '13200132009',
email: 'admin@example.com',
password: 'Ftb12345',
isSystem: true,
createdAt: new Date('2026-07-08T00:00:00.000Z'),
});
await expect(service.remove('m-8')).rejects.toBeInstanceOf(BadRequestException);
await service.update('m-8', {
name: '误改',
username: 'other',
roleId: 'role-viewer',
departmentId: 'dept-1',
phone: '13200132009',
});
expect(prisma.user.delete).not.toHaveBeenCalled();
expect(prisma.user.update).toHaveBeenCalledWith({
where: { id: 'm-8' },
data: expect.not.objectContaining({
name: '误改',
username: 'other',
roleId: 'role-viewer',
departmentId: 'dept-1',
}),
});
expect(prisma.user.update).toHaveBeenCalledWith(expect.objectContaining({
data: expect.objectContaining({ phone: '13200132009', isSystem: true }),
}));
});
});