99 lines
3.2 KiB
TypeScript
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()
|
|
})
|
|
})
|