Files
SnapOtter/tests/unit/api/postprocess.test.ts
T

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");
});
});