mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
Add comprehensive unit tests for previously uncovered API lib modules, web stores, and plugin functions. Fix 2 pre-existing editor-store test failures (invertSelection mask values). Coverage: 30.3% -> 36.85% stmts (unit), 57.71% stmts (integration).
106 lines
3.5 KiB
TypeScript
106 lines
3.5 KiB
TypeScript
import sharp from "sharp";
|
|
import { describe, expect, it } from "vitest";
|
|
import { autoOrient } from "../../../apps/api/src/lib/auto-orient.js";
|
|
|
|
async function createImageWithOrientation(orientation: number): Promise<Buffer> {
|
|
return sharp({
|
|
create: {
|
|
width: 100,
|
|
height: 50,
|
|
channels: 3,
|
|
background: { r: 255, g: 0, b: 0 },
|
|
},
|
|
})
|
|
.withMetadata({ orientation })
|
|
.jpeg()
|
|
.toBuffer();
|
|
}
|
|
|
|
describe("autoOrient", () => {
|
|
it("returns original buffer unchanged when orientation is 1", async () => {
|
|
const buf = await createImageWithOrientation(1);
|
|
const result = await autoOrient(buf);
|
|
const meta = await sharp(result).metadata();
|
|
expect(meta.width).toBe(100);
|
|
expect(meta.height).toBe(50);
|
|
});
|
|
|
|
it("returns original buffer unchanged when no EXIF orientation is present", async () => {
|
|
const buf = await sharp({
|
|
create: {
|
|
width: 80,
|
|
height: 60,
|
|
channels: 3,
|
|
background: { r: 0, g: 255, b: 0 },
|
|
},
|
|
})
|
|
.png()
|
|
.toBuffer();
|
|
const result = await autoOrient(buf);
|
|
const meta = await sharp(result).metadata();
|
|
expect(meta.width).toBe(80);
|
|
expect(meta.height).toBe(60);
|
|
});
|
|
|
|
it("rotates image when orientation is 6 (90 CW)", async () => {
|
|
const buf = await createImageWithOrientation(6);
|
|
const meta = await sharp(buf).metadata();
|
|
expect(meta.orientation).toBe(6);
|
|
const result = await autoOrient(buf);
|
|
const resultMeta = await sharp(result).metadata();
|
|
expect(resultMeta.width).toBe(50);
|
|
expect(resultMeta.height).toBe(100);
|
|
});
|
|
|
|
it("rotates image when orientation is 8 (270 CW)", async () => {
|
|
const buf = await createImageWithOrientation(8);
|
|
const meta = await sharp(buf).metadata();
|
|
expect(meta.orientation).toBe(8);
|
|
const result = await autoOrient(buf);
|
|
const resultMeta = await sharp(result).metadata();
|
|
expect(resultMeta.width).toBe(50);
|
|
expect(resultMeta.height).toBe(100);
|
|
});
|
|
|
|
it("rotates image when orientation is 3 (180)", async () => {
|
|
const buf = await createImageWithOrientation(3);
|
|
const meta = await sharp(buf).metadata();
|
|
expect(meta.orientation).toBe(3);
|
|
const result = await autoOrient(buf);
|
|
const resultMeta = await sharp(result).metadata();
|
|
expect(resultMeta.width).toBe(100);
|
|
expect(resultMeta.height).toBe(50);
|
|
});
|
|
|
|
it("handles orientation 2 (horizontal flip)", async () => {
|
|
const buf = await createImageWithOrientation(2);
|
|
const origMeta = await sharp(buf).metadata();
|
|
expect(origMeta.orientation).toBe(2);
|
|
const result = await autoOrient(buf);
|
|
const meta = await sharp(result).metadata();
|
|
expect(meta.width).toBe(100);
|
|
expect(meta.height).toBe(50);
|
|
});
|
|
|
|
it("strips orientation tag after rotation", async () => {
|
|
const buf = await createImageWithOrientation(6);
|
|
const beforeMeta = await sharp(buf).metadata();
|
|
expect(beforeMeta.orientation).toBe(6);
|
|
const result = await autoOrient(buf);
|
|
const meta = await sharp(result).metadata();
|
|
expect(meta.orientation === undefined || meta.orientation === 1).toBe(true);
|
|
});
|
|
|
|
it("returns original buffer for corrupted/invalid input", async () => {
|
|
const invalid = Buffer.from("this is not an image at all");
|
|
const result = await autoOrient(invalid);
|
|
expect(result.equals(invalid)).toBe(true);
|
|
});
|
|
|
|
it("returns original buffer for empty buffer", async () => {
|
|
const empty = Buffer.alloc(0);
|
|
const result = await autoOrient(empty);
|
|
expect(result.equals(empty)).toBe(true);
|
|
});
|
|
});
|