Files
SnapOtter/tests/unit/beautify-shadow.test.ts
T

88 lines
2.4 KiB
TypeScript

import sharp from "sharp";
import { describe, expect, it } from "vitest";
import { applyShadow } from "../../apps/api/src/lib/beautify/shadow.js";
describe("applyShadow", () => {
const makeImage = (w: number, h: number) =>
sharp({
create: {
width: w,
height: h,
channels: 4,
background: { r: 100, g: 100, b: 255, alpha: 1 },
},
})
.png()
.toBuffer();
it("returns larger buffer with shadow applied", async () => {
const img = await makeImage(200, 150);
const result = await applyShadow(img, {
blur: 20,
offsetX: 0,
offsetY: 10,
color: "#000000",
opacity: 30,
});
const meta = await sharp(result.buffer).metadata();
expect(meta.width).toBeGreaterThan(200);
expect(meta.height).toBeGreaterThan(150);
expect(result.padLeft).toBeGreaterThanOrEqual(0);
expect(result.padTop).toBeGreaterThanOrEqual(0);
});
it("returns image position within shadow canvas", async () => {
const img = await makeImage(200, 150);
const result = await applyShadow(img, {
blur: 20,
offsetX: 5,
offsetY: 10,
color: "#000000",
opacity: 50,
});
expect(result.imgX).toBeDefined();
expect(result.imgY).toBeDefined();
});
it("handles zero-blur shadow gracefully", async () => {
const img = await makeImage(100, 100);
const result = await applyShadow(img, {
blur: 0,
offsetX: 0,
offsetY: 0,
color: "#000000",
opacity: 0,
});
const meta = await sharp(result.buffer).metadata();
expect(meta.width).toBeGreaterThanOrEqual(100);
});
it("handles negative offsets", async () => {
const img = await makeImage(200, 150);
const result = await applyShadow(img, {
blur: 15,
offsetX: -10,
offsetY: -5,
color: "#ff0000",
opacity: 40,
});
const meta = await sharp(result.buffer).metadata();
expect(meta.width).toBeGreaterThan(200);
expect(meta.height).toBeGreaterThan(150);
});
it("produces RGBA output with alpha channel", async () => {
const img = await makeImage(100, 100);
const result = await applyShadow(img, {
blur: 10,
offsetX: 0,
offsetY: 5,
color: "#000000",
opacity: 30,
});
const meta = await sharp(result.buffer).metadata();
expect(meta.hasAlpha).toBe(true);
expect(meta.channels).toBe(4);
});
});