gongxiangp2/lib/__tests__/video-download-policy-integration.test.ts

81 lines
3.4 KiB
TypeScript

import fs from 'fs'
import path from 'path'
describe('video download policy integration', () => {
test('内部素材下载路由应执行视频 15 天门禁', () => {
const routePath = path.join(process.cwd(), 'app/api/materials/download/route.ts')
const content = fs.readFileSync(routePath, 'utf8')
expect(content).toContain("from '@/lib/video-download-policy'")
expect(content).toContain('getVideoDownloadAvailability(')
expect(content).toContain('DownloadErrorCode.VIDEO_WAIT_PERIOD')
})
test('外部 token 下载路由应执行视频 15 天门禁', () => {
const routePath = path.join(process.cwd(), 'app/api/external/download/route.ts')
const content = fs.readFileSync(routePath, 'utf8')
expect(content).toContain("from '@/lib/video-download-policy'")
expect(content).toContain('getVideoDownloadAvailability(')
expect(content).toContain("code: 'VIDEO_WAIT_PERIOD'")
})
test('首页素材卡片应在前端提示视频等待期', () => {
const cardPath = path.join(process.cwd(), 'components/home/MaterialCard.tsx')
const content = fs.readFileSync(cardPath, 'utf8')
expect(content).toContain("from '@/lib/video-download-policy'")
expect(content).toContain('getVideoDownloadAvailability(')
expect(content).toContain('getVideoDownloadUnavailableMessage(videoDownloadAvailability)')
})
test('分享详情接口应拦截未满 15 天的视频素材详情', () => {
const routePath = path.join(process.cwd(), 'app/api/materials/share/route.ts')
const content = fs.readFileSync(routePath, 'utf8')
expect(content).toContain('getVideoPreviewPolicyFields(')
expect(content).toContain('DownloadErrorCode.VIDEO_WAIT_PERIOD')
expect(content).toContain('视频类素材上传后满 15 天才能查看详情')
})
test('普通详情接口应保留管理员入口但拦截普通用户查看等待期视频', () => {
const routePath = path.join(process.cwd(), 'app/api/materials/[id]/route.ts')
const content = fs.readFileSync(routePath, 'utf8')
expect(content).toContain('getVideoPreviewPolicyFields(')
expect(content).toContain('canBypassVideoPreviewGate')
expect(content).toContain('isSystemAdmin(userRole)')
expect(content).toContain('return buildVideoPreviewBlockedResponse()')
})
test('素材列表应移除等待期内的视频预览地址并返回预览门禁字段', () => {
const routePath = path.join(process.cwd(), 'app/api/materials/route.ts')
const content = fs.readFileSync(routePath, 'utf8')
expect(content).toContain('applyVideoPreviewPolicy(rewrittenMaterial)')
})
test('本地上传文件代理应拦截等待期内的视频预览文件', () => {
const apiUploadsRoute = fs.readFileSync(
path.join(process.cwd(), 'app/api/uploads/[...path]/route.ts'),
'utf8',
)
const uploadsRoute = fs.readFileSync(
path.join(process.cwd(), 'app/uploads/[...path]/route.ts'),
'utf8',
)
expect(apiUploadsRoute).toContain('findBlockedVideoPreviewByUrl(')
expect(uploadsRoute).toContain('/api/uploads/')
expect(uploadsRoute).toContain('Response.redirect(target, 307)')
})
test('媒体代理应拦截等待期内的视频预览文件旧链接', () => {
const routePath = path.join(process.cwd(), 'app/api/proxy-media/route.ts')
const content = fs.readFileSync(routePath, 'utf8')
expect(content).toContain('findBlockedVideoPreviewByUrl(')
expect(content).toContain('DownloadErrorCode.VIDEO_WAIT_PERIOD')
})
})