2026-05-25 16:10:18 +08:00

110 lines
2.9 KiB
TypeScript

import { NextRequest } from 'next/server'
import { POST } from '../route'
jest.mock('@/lib/auth', () => ({
authOptions: {},
}))
jest.mock('next-auth', () => ({
getServerSession: jest.fn(),
}))
jest.mock('@/lib/prisma', () => ({
prisma: {
user: {
findFirst: jest.fn(),
},
},
}))
jest.mock('@/lib/system-integrity', () => ({
BUILTIN_TEMPLATE_KEYS: ['3dmax-material'],
}))
jest.mock('@/lib/system-init', () => ({
getSystemInitToken: jest.fn(() => 'init-token'),
initializeSystem: jest.fn(),
}))
const { getServerSession } = require('next-auth')
const { prisma } = require('@/lib/prisma')
const { initializeSystem } = require('@/lib/system-init')
describe('POST /api/system/init', () => {
beforeEach(() => {
jest.resetAllMocks()
getServerSession.mockResolvedValue({
user: {
id: 'admin-1',
role: 'ADMIN',
isSuperAdmin: true,
},
})
prisma.user.findFirst.mockResolvedValue({ id: 'admin-1' })
})
test('环境变量来源的初始管理员密码不应在初始化响应中回显', async () => {
initializeSystem.mockResolvedValue({
alreadyInitialized: false,
initialized: true,
admin: {
email: 'admin@local.flnxi',
username: 'admin',
created: true,
upgraded: false,
mustChangePassword: true,
initialPassword: 'Env-Password-Should-Not-Return',
passwordSource: 'environment',
},
defaultDepartment: '默认部门',
defaultCategory: '默认店铺',
defaultScene: '默认场景',
templates: {
total: 1,
created: 0,
createdTemplates: [],
errors: [],
},
})
const response = await POST(new NextRequest('http://localhost/api/system/init', { method: 'POST' }))
const data = await response.json()
expect(response.status).toBe(200)
expect(data.data.admin.initialPassword).toBeNull()
expect(data.data.admin.passwordSource).toBe('environment')
})
test('系统生成的一次性管理员密码仍可在首次初始化响应中返回', async () => {
initializeSystem.mockResolvedValue({
alreadyInitialized: false,
initialized: true,
admin: {
email: 'admin@local.flnxi',
username: 'admin',
created: true,
upgraded: false,
mustChangePassword: true,
initialPassword: 'Generated-Password-123',
passwordSource: 'generated',
},
defaultDepartment: '默认部门',
defaultCategory: '默认店铺',
defaultScene: '默认场景',
templates: {
total: 1,
created: 0,
createdTemplates: [],
errors: [],
},
})
const response = await POST(new NextRequest('http://localhost/api/system/init', { method: 'POST' }))
const data = await response.json()
expect(response.status).toBe(200)
expect(data.data.admin.initialPassword).toBe('Generated-Password-123')
expect(data.data.admin.passwordSource).toBe('generated')
})
})