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') }) })