flnxi-Wu/app/api/templates/__tests__/templates-route-auth.test.ts
2026-06-03 18:41:52 +08:00

99 lines
3.2 KiB
TypeScript

import { GET } from '../route'
jest.mock('@/lib/auth', () => ({
authOptions: {},
}))
jest.mock('next-auth', () => ({
getServerSession: jest.fn(),
}))
jest.mock('@/lib/prisma', () => ({
prisma: {
$queryRaw: jest.fn(),
uploadTemplate: {
findMany: jest.fn(),
},
},
}))
jest.mock('@/lib/license', () => ({
canUseCustomTemplates: jest.fn(),
projectPublicTemplateOptionsWithPaidCore: jest.fn(),
}))
const { getServerSession } = require('next-auth')
const { prisma } = require('@/lib/prisma')
const { canUseCustomTemplates } = require('@/lib/license')
const { projectPublicTemplateOptionsWithPaidCore } = require('@/lib/license')
describe('GET /api/templates 权限边界', () => {
beforeEach(() => {
jest.resetAllMocks()
canUseCustomTemplates.mockResolvedValue(true)
projectPublicTemplateOptionsWithPaidCore.mockImplementation(async ({ builtinTemplates, customTemplates }: any) => ({
valid: true,
templates: [
...builtinTemplates,
...customTemplates
.filter((template: any) => template.status === 'active' && !template.id.startsWith('builtin-'))
.map((template: any) => ({ id: template.id, name: template.name, isBuiltin: false })),
],
uploadTemplates: [],
materialTypes: [],
}))
})
it('未登录时拒绝读取模板列表', async () => {
getServerSession.mockResolvedValue(null)
const response = await GET()
const data = await response.json()
expect(response.status).toBe(401)
expect(data.error).toBe('请先登录')
expect(prisma.$queryRaw).not.toHaveBeenCalled()
expect(prisma.uploadTemplate.findMany).not.toHaveBeenCalled()
})
it('已登录时正常读取模板列表', async () => {
getServerSession.mockResolvedValue({
user: { id: 'user-1', role: 'USER' },
})
prisma.$queryRaw.mockResolvedValue([{ enabledBuiltinTemplates: '["3dmax-material"]' }])
prisma.uploadTemplate.findMany.mockResolvedValue([
{ id: 'custom-template', name: '自定义模板', status: 'active' },
])
const response = await GET()
const data = await response.json()
expect(response.status).toBe(200)
expect(data).toEqual([
{ id: 'builtin-3dmax-material', name: '3DMAX 素材模板', isBuiltin: true },
{ id: 'custom-template', name: '自定义模板', isBuiltin: false },
])
expect(projectPublicTemplateOptionsWithPaidCore).toHaveBeenCalledWith(expect.objectContaining({
customTemplates: [{ id: 'custom-template', name: '自定义模板', status: 'active' }],
}))
})
it('许可证不包含自定义模板时,只返回内置模板且不读取历史自定义模板', async () => {
getServerSession.mockResolvedValue({
user: { id: 'user-1', role: 'USER' },
})
canUseCustomTemplates.mockResolvedValue(false)
prisma.$queryRaw.mockResolvedValue([{ enabledBuiltinTemplates: '["3dmax-material"]' }])
const response = await GET()
const data = await response.json()
expect(response.status).toBe(200)
expect(data).toEqual([
{ id: 'builtin-3dmax-material', name: '3DMAX 素材模板', isBuiltin: true },
])
expect(prisma.uploadTemplate.findMany).not.toHaveBeenCalled()
expect(projectPublicTemplateOptionsWithPaidCore).not.toHaveBeenCalled()
})
})