import { describe, expect, it } from 'vitest' import sharp from 'sharp' import { extensionForFormat, isSupportedFormat, mimeForFormat, plannedWidths, probeImage, renderVariants, supportedMimes, variantWidths, } from '~/lib/media-images' async function png(width: number, height: number): Promise { return sharp({ create: { width, height, channels: 3, background: '#2b4a9b' } }).png().toBuffer() } describe('plannedWidths', () => { it('erzeugt für ein grosses Bild alle vereinbarten Breiten', () => { expect(plannedWidths(2000)).toEqual([480, 960, 1600]) }) it('vergrössert ein Bild nicht über seine eigene Breite hinaus', () => { expect(plannedWidths(1000)).toEqual([480, 960]) expect(plannedWidths(600)).toEqual([480]) }) it('behält bei sehr kleinen Bildern die Originalbreite', () => { expect(plannedWidths(320)).toEqual([320]) }) it('nimmt die Grenzbreiten selbst mit', () => { expect(plannedWidths(480)).toEqual([480]) expect(plannedWidths(1600)).toEqual([...variantWidths]) }) }) describe('probeImage', () => { it('liest Format und Masse aus einem Bild', async () => { const probed = await probeImage(await png(800, 400)) expect(probed).toEqual({ format: 'png', width: 800, height: 400 }) }) it('meldet undefined für alles, was kein Bild ist', async () => { expect(await probeImage(Buffer.from('das ist kein bild, sondern text'))).toBeUndefined() }) }) describe('renderVariants', () => { it('erzeugt WebP-Fassungen in den erwarteten Breiten', async () => { const source = await png(2000, 1125) const rendered = await renderVariants(source, plannedWidths(2000)) expect(rendered.map(variant => variant.width)).toEqual([480, 960, 1600]) expect(rendered.every(variant => variant.format === 'webp')).toBe(true) for (const variant of rendered) { const meta = await sharp(variant.body).metadata() expect(meta.format).toBe('webp') expect(meta.width).toBe(variant.width) } }) }) describe('Formatliste', () => { it('kennt die angenommenen Formate', () => { expect(isSupportedFormat('png')).toBe(true) expect(isSupportedFormat('svg')).toBe(false) expect(mimeForFormat('jpeg')).toBe('image/jpeg') expect(extensionForFormat('jpeg')).toBe('jpg') }) it('nennt jeden Mime-Typ nur einmal', () => { const mimes = supportedMimes() expect(new Set(mimes).size).toBe(mimes.length) expect(mimes).toContain('image/webp') }) })