gongxiangp2/lib/__tests__/white-background-preview.test.ts
chenpei 4712175cb0 feat(素材链路): 发布白底图双轨与AI生图回传能力
- 完成白底图 WebP 双轨接口、上传链路与预览缓存改造
- 新增 AI 生图平台成品回传接口、任务状态与表单规则
- 补齐 AI 生成标签、任务详情补全、相关测试与对接文档
2026-03-25 10:28:02 +08:00

93 lines
3.0 KiB
TypeScript

/** @jest-environment node */
import path from 'path'
import { promises as fs } from 'fs'
import sharp from 'sharp'
import {
buildWhiteBackgroundWebpVariants,
resolveWhiteBackgroundPreviewFileUrl,
WHITE_BACKGROUND_PREVIEW_MAX_DIMENSION,
} from '@/lib/white-background-preview'
describe('white-background-preview helpers', () => {
const tempRoot = path.join(process.cwd(), 'uploads', '__white-background-preview-tests__')
afterEach(async () => {
await fs.rm(tempRoot, { recursive: true, force: true })
})
test('builds original and preview webp variants for large transparent images', async () => {
const source = await sharp({
create: {
width: 2200,
height: 1100,
channels: 4,
background: { r: 255, g: 255, b: 255, alpha: 0 },
},
})
.png()
.toBuffer()
const { original, preview } = await buildWhiteBackgroundWebpVariants(source)
const originalMetadata = await sharp(original).metadata()
const previewMetadata = await sharp(preview).metadata()
expect(originalMetadata.format).toBe('webp')
expect(originalMetadata.width).toBe(2200)
expect(originalMetadata.height).toBe(1100)
expect(previewMetadata.format).toBe('webp')
expect(previewMetadata.width).toBe(WHITE_BACKGROUND_PREVIEW_MAX_DIMENSION)
expect(previewMetadata.height).toBe(750)
expect(original.length).toBeGreaterThan(preview.length)
})
test('preview variant does not enlarge small images', async () => {
const source = await sharp({
create: {
width: 400,
height: 300,
channels: 4,
background: { r: 255, g: 255, b: 255, alpha: 0 },
},
})
.png()
.toBuffer()
const { preview } = await buildWhiteBackgroundWebpVariants(source)
const previewMetadata = await sharp(preview).metadata()
expect(previewMetadata.width).toBe(400)
expect(previewMetadata.height).toBe(300)
})
test('prefers preview path when derived preview file exists, otherwise falls back to original path', async () => {
const originalAbsolutePath = path.join(
tempRoot,
'material-1',
'white-background',
'sku-1',
'front.webp',
)
const previewAbsolutePath = path.join(
tempRoot,
'material-1',
'white-background',
'sku-1',
'preview',
'front.webp',
)
const originalRelativePath = path.relative(process.cwd(), originalAbsolutePath).replace(/\\/g, '/')
const previewRelativePath = path.relative(process.cwd(), previewAbsolutePath).replace(/\\/g, '/')
await fs.mkdir(path.dirname(originalAbsolutePath), { recursive: true })
await fs.writeFile(originalAbsolutePath, Buffer.from('original'))
expect(resolveWhiteBackgroundPreviewFileUrl(originalRelativePath)).toBe(`/${originalRelativePath}`)
await fs.mkdir(path.dirname(previewAbsolutePath), { recursive: true })
await fs.writeFile(previewAbsolutePath, Buffer.from('preview'))
expect(resolveWhiteBackgroundPreviewFileUrl(originalRelativePath)).toBe(`/${previewRelativePath}`)
})
})