/** @jest-environment node */ import { NextRequest } from 'next/server' import { getServerSession } from 'next-auth' import { GET } from '@/app/api/users/list/route' import { prisma } from '@/lib/prisma' jest.mock('next-auth', () => ({ getServerSession: jest.fn(), })) jest.mock('@/lib/auth', () => ({ authOptions: {}, })) jest.mock('@/lib/prisma', () => ({ prisma: { user: { findMany: jest.fn(), }, }, })) describe('GET /api/users/list', () => { beforeEach(() => { jest.clearAllMocks() }) test('未登录时返回 401 且不读取人员数据', async () => { ;(getServerSession as jest.Mock).mockResolvedValue(null) const response = await GET(new NextRequest('http://localhost/api/users/list')) expect(response.status).toBe(401) expect(prisma.user.findMany).not.toHaveBeenCalled() }) test('只读取并返回人员选择器需要的最小字段', async () => { ;(getServerSession as jest.Mock).mockResolvedValue({ user: { id: 'user-1' }, }) ;(prisma.user.findMany as jest.Mock).mockResolvedValue([ { id: 'user-1', username: 'moli', realName: '魔礼红', }, { id: 'user-2', username: 'wuxie', realName: null, }, ]) const response = await GET(new NextRequest('http://localhost/api/users/list')) const body = await response.json() expect(response.status).toBe(200) expect(prisma.user.findMany).toHaveBeenCalledWith({ where: { isActive: true, status: 'active', archivedAt: null, }, select: { id: true, username: true, realName: true, }, orderBy: { username: 'asc', }, }) expect(body).toEqual([ { id: 'user-1', username: 'moli', displayName: '魔礼红', }, { id: 'user-2', username: 'wuxie', displayName: 'wuxie', }, ]) expect(body[0]).not.toHaveProperty('email') expect(body[0]).not.toHaveProperty('realName') }) })