mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
67 lines
2.3 KiB
TypeScript
67 lines
2.3 KiB
TypeScript
/**
|
|||
|
|
* Unit tests for postprocess helpers.
|
||
|
|
*
|
||
|
|
* Tests buildOutputName (output filename construction with tool-specific
|
||
|
|
* suffix and extension fixup). This pure function was extracted from
|
||
|
|
* tool-factory.ts during the job-spine refactor to apps/api/src/jobs/postprocess.ts.
|
||
|
|
*/
|
||
|
|
import { describe, expect, it, vi } from "vitest";
|
||
|
|
|
||
|
|
// Minimal mocks so the module loads without Postgres/Redis/sharp
|
||
|
|
vi.mock("../../../apps/api/src/db/index.js", () => ({
|
||
|
|
db: {},
|
||
|
|
schema: { jobs: {}, userFiles: {} },
|
||
|
|
}));
|
||
|
|
|
||
|
|
vi.mock("../../../apps/api/src/lib/object-storage.js", () => ({
|
||
|
|
putObject: vi.fn(),
|
||
|
|
}));
|
||
|
|
|
||
|
|
vi.mock("sharp", () => ({
|
||
|
|
default: vi.fn(),
|
||
|
|
}));
|
||
|
|
|
||
|
|
import { buildOutputName, CONTENT_TYPE_TO_EXT } from "../../../apps/api/src/jobs/postprocess.js";
|
||
|
|
|
||
|
|
describe("buildOutputName", () => {
|
||
|
|
it("appends toolId suffix when filename is unchanged", () => {
|
||
|
|
const result = buildOutputName("photo.png", "photo.png", "resize", "image/png");
|
||
|
|
expect(result).toBe("photo_resize.png");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("does not add suffix when tool renames the file", () => {
|
||
|
|
const result = buildOutputName("converted.jpg", "photo.png", "convert", "image/jpeg");
|
||
|
|
expect(result).toBe("converted.jpg");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("fixes extension mismatch between content-type and filename", () => {
|
||
|
|
const result = buildOutputName("output.png", "input.bmp", "convert", "image/jpeg");
|
||
|
|
expect(result).toBe("output.jpg");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("applies both suffix and extension fixup when needed", () => {
|
||
|
|
const result = buildOutputName("input.bmp", "input.bmp", "convert", "image/jpeg");
|
||
|
|
expect(result).toBe("input_convert.jpg");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("preserves extension when content-type matches", () => {
|
||
|
|
const result = buildOutputName("output.webp", "input.png", "compress", "image/webp");
|
||
|
|
expect(result).toBe("output.webp");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("handles filenames without extension", () => {
|
||
|
|
const result = buildOutputName("photo", "photo", "resize", "image/png");
|
||
|
|
expect(result).toBe("photo_resize");
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe("CONTENT_TYPE_TO_EXT", () => {
|
||
|
|
it("maps common image MIME types to extensions", () => {
|
||
|
|
expect(CONTENT_TYPE_TO_EXT["image/jpeg"]).toBe(".jpg");
|
||
|
|
expect(CONTENT_TYPE_TO_EXT["image/png"]).toBe(".png");
|
||
|
|
expect(CONTENT_TYPE_TO_EXT["image/webp"]).toBe(".webp");
|
||
|
|
expect(CONTENT_TYPE_TO_EXT["image/gif"]).toBe(".gif");
|
||
|
|
expect(CONTENT_TYPE_TO_EXT["image/svg+xml"]).toBe(".svg");
|
||
|
|
});
|
||
|
|
});
|