import { describe, expect, it } from "vitest"; import { resolveOutputFormat } from "../../../apps/api/src/lib/output-format.js"; import { fixtures, readFixture } from "../../fixtures/index.js"; const JPG = readFixture(fixtures.image.base.jpg100); const PNG = readFixture(fixtures.image.base.png200); const WEBP = readFixture(fixtures.image.base.webp50); describe("resolveOutputFormat", () => { it("detects JPEG input and returns jpeg config", async () => { const result = await resolveOutputFormat(JPG, "photo.jpg"); expect(result.format).toBe("jpeg"); expect(result.extension).toBe("jpg"); expect(result.contentType).toBe("image/jpeg"); expect(result.quality).toBe(95); }); it("detects PNG input and returns png config with no quality", async () => { const result = await resolveOutputFormat(PNG, "image.png"); expect(result.format).toBe("png"); expect(result.extension).toBe("png"); expect(result.contentType).toBe("image/png"); // Sharp reads `quality` on PNG as "quantise to a palette", so a default // quality silently dithered every PNG that passed through (issue #710). // Only an explicit override may request that. expect(result.quality).toBeUndefined(); }); it("detects WebP input and returns webp config", async () => { const result = await resolveOutputFormat(WEBP, "image.webp"); expect(result.format).toBe("webp"); expect(result.extension).toBe("webp"); expect(result.contentType).toBe("image/webp"); expect(result.quality).toBe(95); }); it("falls back to PNG for unknown format", async () => { const garbage = Buffer.from("not an image at all"); const result = await resolveOutputFormat(garbage, "mystery.bin"); expect(result.format).toBe("png"); expect(result.extension).toBe("png"); expect(result.contentType).toBe("image/png"); // The fallback produces PNG too, so it gets the same lossless treatment. expect(result.quality).toBeUndefined(); }); it("respects quality override for lossy formats", async () => { const result = await resolveOutputFormat(JPG, "photo.jpg", 50); expect(result.quality).toBe(50); }); it("accepts quality override for PNG without error", async () => { const result = await resolveOutputFormat(PNG, "image.png", 50); expect(result.format).toBe("png"); expect(result.quality).toBe(50); }); });