mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
93 lines
3.1 KiB
TypeScript
93 lines
3.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|||
|
|
import { buildGeneratedMultipartFields } from "../../helpers/generated-multipart.js";
|
||
|
|
|
||
|
|
const primary = { filename: "primary.png", content: Buffer.from("primary") };
|
||
|
|
const image = { filename: "companion.png", content: Buffer.from("image") };
|
||
|
|
const audio = { filename: "companion.wav", content: Buffer.from("audio") };
|
||
|
|
const subtitle = { filename: "companion.srt", content: Buffer.from("subtitle") };
|
||
|
|
|
||
|
|
describe("generated multipart payloads", () => {
|
||
|
|
it.each([
|
||
|
|
"sprite-sheet",
|
||
|
|
"stitch",
|
||
|
|
"images-to-video",
|
||
|
|
"merge-audio",
|
||
|
|
"compare",
|
||
|
|
"find-duplicates",
|
||
|
|
])("sends two ordinary file parts for %s", (toolId) => {
|
||
|
|
const fields = buildGeneratedMultipartFields({
|
||
|
|
toolId,
|
||
|
|
primary,
|
||
|
|
settings: {},
|
||
|
|
companions: { image, audio, subtitle },
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(fields.filter(({ name }) => name === "file")).toHaveLength(2);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("uses named watermark and overlay parts for custom image routes", () => {
|
||
|
|
expect(
|
||
|
|
buildGeneratedMultipartFields({
|
||
|
|
toolId: "watermark-image",
|
||
|
|
primary,
|
||
|
|
settings: {},
|
||
|
|
companions: { image, audio, subtitle },
|
||
|
|
}).map(({ name }) => name),
|
||
|
|
).toEqual(["file", "watermark", "settings"]);
|
||
|
|
expect(
|
||
|
|
buildGeneratedMultipartFields({
|
||
|
|
toolId: "compose",
|
||
|
|
primary,
|
||
|
|
settings: {},
|
||
|
|
companions: { image, audio, subtitle },
|
||
|
|
}).map(({ name }) => name),
|
||
|
|
).toEqual(["file", "overlay", "settings"]);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("builds valid mixed-kind tuples", () => {
|
||
|
|
const subtitleFields = buildGeneratedMultipartFields({
|
||
|
|
toolId: "burn-subtitles",
|
||
|
|
primary: { filename: "video.mp4", content: Buffer.from("video") },
|
||
|
|
settings: {},
|
||
|
|
companions: { image, audio, subtitle },
|
||
|
|
});
|
||
|
|
expect(
|
||
|
|
subtitleFields.filter(({ name }) => name === "file").map(({ filename }) => filename),
|
||
|
|
).toEqual(["video.mp4", "companion.srt"]);
|
||
|
|
|
||
|
|
const audioFields = buildGeneratedMultipartFields({
|
||
|
|
toolId: "replace-audio",
|
||
|
|
primary: { filename: "video.mp4", content: Buffer.from("video") },
|
||
|
|
settings: {},
|
||
|
|
companions: { image, audio, subtitle },
|
||
|
|
});
|
||
|
|
expect(
|
||
|
|
audioFields.filter(({ name }) => name === "file").map(({ filename }) => filename),
|
||
|
|
).toEqual(["video.mp4", "companion.wav"]);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("supplies the smallest valid collage template", () => {
|
||
|
|
const settings = buildGeneratedMultipartFields({
|
||
|
|
toolId: "collage",
|
||
|
|
primary,
|
||
|
|
settings: {},
|
||
|
|
companions: { image, audio, subtitle },
|
||
|
|
}).find(({ name }) => name === "settings");
|
||
|
|
|
||
|
|
expect(JSON.parse(settings?.content.toString() ?? "{}")).toMatchObject({
|
||
|
|
templateId: "2-h-equal",
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it("builds signature-specific parts instead of a generic settings field", () => {
|
||
|
|
const fields = buildGeneratedMultipartFields({
|
||
|
|
toolId: "sign-pdf",
|
||
|
|
primary: { filename: "document.pdf", content: Buffer.from("pdf") },
|
||
|
|
settings: {},
|
||
|
|
companions: { image, audio, subtitle },
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(fields.map(({ name }) => name)).toEqual(["file", "sig0", "placements"]);
|
||
|
|
});
|
||
|
|
});
|