gongxiangp2/lib/__tests__/brand-knowledge-image-browser.test.ts

73 lines
2.6 KiB
TypeScript

import {
canUseBrandKnowledgeLegacyServerPreview,
prepareBrandKnowledgePreviewInBrowser,
} from '@/lib/brand-knowledge-image-browser'
const mockPreparePerformanceSurveyImagesInBrowser = jest.fn()
jest.mock('@/lib/performance-survey-image-browser', () => ({
preparePerformanceSurveyImagesInBrowser: (...args: unknown[]) => (
mockPreparePerformanceSurveyImagesInBrowser(...args)
),
}))
describe('brand knowledge preview browser processing', () => {
beforeEach(() => {
jest.clearAllMocks()
mockPreparePerformanceSurveyImagesInBrowser.mockResolvedValue([
{ file: new File(['one'], 'long-001.webp', { type: 'image/webp' }), kind: 'slice' },
{ file: new File(['two'], 'long-002.webp', { type: 'image/webp' }), kind: 'slice' },
])
})
test('uses the dedicated 120MP brand profile and returns ordered slices', async () => {
const controller = new AbortController()
const source = new File(['image'], 'long.jpg', { type: 'image/jpeg' })
const result = await prepareBrandKnowledgePreviewInBrowser(source, undefined, {
signal: controller.signal,
timeoutMs: 12_345,
})
expect(result.map((item) => item.file.name)).toEqual(['long-001.webp', 'long-002.webp'])
expect(mockPreparePerformanceSurveyImagesInBrowser).toHaveBeenCalledWith(
[source],
undefined,
{
profile: 'brand_knowledge_preview',
signal: controller.signal,
timeoutMs: 12_345,
},
)
})
test('allows server fallback only when the image header is within 60 million pixels', async () => {
function pngFile(width: number, height: number) {
const bytes = new Uint8Array(24)
bytes.set([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])
const view = new DataView(bytes.buffer)
view.setUint32(16, width)
view.setUint32(20, height)
return {
name: 'preview.png',
size: bytes.byteLength,
slice: () => ({ arrayBuffer: async () => bytes.buffer }),
} as unknown as File
}
await expect(canUseBrandKnowledgeLegacyServerPreview(pngFile(10_000, 6_000))).resolves.toBe(true)
await expect(canUseBrandKnowledgeLegacyServerPreview(pngFile(10_000, 6_001))).resolves.toBe(false)
})
test('rejects browser output that exceeds the derived preview byte limits', async () => {
mockPreparePerformanceSurveyImagesInBrowser.mockResolvedValue([{
file: { name: 'huge.webp', size: 10 * 1024 * 1024 + 1 },
kind: 'slice',
}])
await expect(prepareBrandKnowledgePreviewInBrowser(
new File(['image'], 'long.jpg', { type: 'image/jpeg' }),
)).rejects.toThrow('单个切片过大')
})
})