flnxi-Wu/app/api/admin/__tests__/system-status-auth.test.ts
2026-05-25 15:13:49 +08:00

102 lines
2.7 KiB
TypeScript

import { NextRequest } from 'next/server'
jest.mock('@/lib/auth', () => ({
authOptions: {},
}))
jest.mock('next-auth', () => ({
getServerSession: jest.fn(),
}))
jest.mock('@/lib/prisma', () => ({
prisma: {
user: {
aggregate: jest.fn(),
count: jest.fn(),
groupBy: jest.fn(),
},
material: {
aggregate: jest.fn(),
count: jest.fn(),
findMany: jest.fn(),
},
systemSettings: {
findFirst: jest.fn(),
},
$queryRaw: jest.fn(),
},
}))
const { getServerSession } = require('next-auth')
const { prisma } = require('@/lib/prisma')
import { GET } from '../system-status/route'
function createRequest() {
return new NextRequest('http://localhost/api/admin/system-status')
}
describe('admin system status auth', () => {
beforeEach(() => {
jest.clearAllMocks()
})
it('未登录不能读取系统监控数据', async () => {
getServerSession.mockResolvedValue(null)
const response = await GET(createRequest())
const data = await response.json()
expect(response.status).toBe(401)
expect(data.error).toContain('未登录')
expect(prisma.user.count).not.toHaveBeenCalled()
expect(prisma.material.count).not.toHaveBeenCalled()
})
it('普通用户不能读取系统监控数据', async () => {
getServerSession.mockResolvedValue({
user: { id: 'user-1', role: 'USER' },
})
const response = await GET(createRequest())
const data = await response.json()
expect(response.status).toBe(403)
expect(data.error).toContain('管理员')
expect(prisma.user.count).not.toHaveBeenCalled()
expect(prisma.material.count).not.toHaveBeenCalled()
})
it('管理员可以读取系统监控数据', async () => {
getServerSession.mockResolvedValue({
user: { id: 'admin-1', role: 'ADMIN' },
})
prisma.user.aggregate.mockResolvedValue({ _count: { id: 1 } })
prisma.material.aggregate.mockResolvedValue({ _count: { id: 0 } })
prisma.systemSettings.findFirst.mockResolvedValue({
enableRegistration: true,
enableUserActivation: false,
siteName: 'FLNXI素材库',
})
prisma.material.findMany.mockResolvedValue([])
prisma.user.count
.mockResolvedValueOnce(1)
.mockResolvedValueOnce(1)
prisma.material.count
.mockResolvedValueOnce(0)
.mockResolvedValueOnce(0)
prisma.user.groupBy
.mockResolvedValueOnce([])
.mockResolvedValueOnce([])
prisma.$queryRaw.mockResolvedValue([])
const response = await GET(createRequest())
const data = await response.json()
expect(response.status).toBe(200)
expect(data.overview.totalUsers).toBe(1)
expect(data.status.database).toBe('healthy')
})
})