59 lines
2.5 KiB
TypeScript
59 lines
2.5 KiB
TypeScript
import { prisma } from '@/lib/prisma'
|
|
import { canViewPerformanceSalary } from '@/lib/performance-salary-access'
|
|
|
|
jest.mock('@/lib/prisma', () => ({ prisma: { user: { findUnique: jest.fn() } } }))
|
|
|
|
const findUser = prisma.user.findUnique as jest.Mock
|
|
const activeUser = { id: 'ordinary-user', isSuperAdmin: false, isActive: true, status: 'active', archivedAt: null }
|
|
const approvedAccounts = [
|
|
['无邪', 'c156778c-307d-42aa-89d3-f785aeb3ef86'],
|
|
['清云', '463c5a60-c8a8-45dd-b4cd-4a31a6b1b84f'],
|
|
['伯言', 'c041d8d8-93db-41f1-984d-5f76f114da48'],
|
|
['元泽', '2b1ccc12-844c-4eff-8006-58607157efc1'],
|
|
]
|
|
|
|
beforeEach(() => jest.resetAllMocks())
|
|
|
|
test.each(approvedAccounts)('%s 的固定账号 ID 可以查看', async (_name, id) => {
|
|
findUser.mockResolvedValue({ ...activeUser, id })
|
|
await expect(canViewPerformanceSalary(id)).resolves.toBe(true)
|
|
expect(findUser).toHaveBeenCalledWith(expect.objectContaining({ where: { id } }))
|
|
})
|
|
|
|
test('启用中的超级管理员可以查看', async () => {
|
|
findUser.mockResolvedValue({ ...activeUser, isSuperAdmin: true })
|
|
await expect(canViewPerformanceSalary(activeUser.id)).resolves.toBe(true)
|
|
})
|
|
|
|
test.each(['USER', 'DEPT_ADMIN', 'ADMIN', 'SYSTEM_ADMIN'])('其他 %s 即使同名也不能查看', async role => {
|
|
findUser.mockResolvedValue({ ...activeUser, role, username: '清云', realName: '清云' })
|
|
await expect(canViewPerformanceSalary(activeUser.id)).resolves.toBe(false)
|
|
})
|
|
|
|
test.each([
|
|
{ isActive: false },
|
|
{ status: 'pending' },
|
|
{ status: 'suspended' },
|
|
{ status: 'archived' },
|
|
{ archivedAt: new Date() },
|
|
])('停用或归档的指定账号和超管不能查看:%j', async disabled => {
|
|
for (const identity of [{ id: approvedAccounts[0][1] }, { isSuperAdmin: true }]) {
|
|
const user = { ...activeUser, ...identity, ...disabled }
|
|
findUser.mockResolvedValue(user)
|
|
await expect(canViewPerformanceSalary(user.id)).resolves.toBe(false)
|
|
}
|
|
})
|
|
|
|
test('未登录或账号已不存在时拒绝', async () => {
|
|
await expect(canViewPerformanceSalary(null)).resolves.toBe(false)
|
|
expect(findUser).not.toHaveBeenCalled()
|
|
findUser.mockResolvedValue(null)
|
|
await expect(canViewPerformanceSalary('deleted')).resolves.toBe(false)
|
|
})
|
|
|
|
test('当前超管权限被撤销后立即失效,不依赖旧会话标识', async () => {
|
|
findUser.mockResolvedValueOnce({ ...activeUser, isSuperAdmin: true }).mockResolvedValueOnce(activeUser)
|
|
await expect(canViewPerformanceSalary(activeUser.id)).resolves.toBe(true)
|
|
await expect(canViewPerformanceSalary(activeUser.id)).resolves.toBe(false)
|
|
})
|