import { mkdtemp, rm } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' import sharp from 'sharp' import { db } from '~/data/db' import { brands, media, projects } from '~/data/schema' import { uploadMedia } from '~/lib/media-upload' import { createLocalStorage, type Storage } from '~/lib/storage' vi.mock('~/lib/media-images', async importOriginal => { const original = await importOriginal() return { ...original, renderVariant: vi.fn(async () => { throw new Error('libvips ist ausgefallen') }), } }) let root: string let storage: Storage beforeAll(async () => { root = await mkdtemp(join(tmpdir(), 'logbuch-upload-')) storage = createLocalStorage(root) }) afterAll(async () => { await rm(root, { recursive: true, force: true }) }) async function project(): Promise { const [brand] = await db.insert(brands).values({ slug: 'nyo', name: 'NYO' }).returning() const [row] = await db.insert(projects).values({ brandId: brand!.id, slug: 'pulsar', name: 'Pulsar' }).returning() return row!.id } describe('uploadMedia mit gescheiterter Umwandlung', () => { it('behält das Original und schreibt den Fehler an das Medium', async () => { const projectId = await project() const body = await sharp({ create: { width: 1200, height: 800, channels: 3, background: '#a33b6a' } }).png().toBuffer() const result = await uploadMedia({ projectId, filename: 'ausfall.png', body, storage }) expect(result.ok).toBe(true) const rows = await db.select().from(media) expect(rows).toHaveLength(1) expect(rows[0]!.variants).toEqual([]) expect(rows[0]!.variantError).toBe('libvips ist ausgefallen') expect(rows[0]!.width).toBe(1200) expect(rows[0]!.height).toBe(800) expect(await storage.exists(rows[0]!.path)).toBe(true) }) })