46 lines
1.1 KiB
TypeScript
46 lines
1.1 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest'
|
|
import {
|
|
encodeBoundedJpeg,
|
|
MAX_BOUNDED_JPEG_BYTES
|
|
} from './bounded-jpeg'
|
|
|
|
function jpeg(size: number): Buffer {
|
|
const data = Buffer.alloc(size)
|
|
data[0] = 0xff
|
|
data[1] = 0xd8
|
|
data[data.length - 2] = 0xff
|
|
data[data.length - 1] = 0xd9
|
|
return data
|
|
}
|
|
|
|
describe('encodeBoundedJpeg', () => {
|
|
it('reduces quality and dimensions until the JPEG fits', () => {
|
|
const resize = vi.fn((options: { width: number }) =>
|
|
createImage(options.width)
|
|
)
|
|
const createImage = (width: number) => ({
|
|
getSize: () => ({ width, height: 800 }),
|
|
resize,
|
|
toJPEG: (quality: number) =>
|
|
jpeg(Math.ceil(width * quality * 12))
|
|
})
|
|
|
|
const result = encodeBoundedJpeg(createImage(2_000))
|
|
|
|
expect(result.byteLength).toBeLessThanOrEqual(
|
|
MAX_BOUNDED_JPEG_BYTES
|
|
)
|
|
expect(resize).toHaveBeenCalled()
|
|
})
|
|
|
|
it('rejects invalid encoder output', () => {
|
|
const image = {
|
|
getSize: () => ({ width: 100, height: 100 }),
|
|
resize: () => image,
|
|
toJPEG: () => Buffer.from('not-jpeg')
|
|
}
|
|
|
|
expect(() => encodeBoundedJpeg(image)).toThrow('内容无效')
|
|
})
|
|
})
|