Skip to content

Commit 1b25439

Browse files
committed
test: add tests for dasel, pandoc and vtracer
1 parent cac9189 commit 1b25439

File tree

4 files changed

+198
-2
lines changed

4 files changed

+198
-2
lines changed

tests/converters/dasel.test.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import fs from "fs";
2+
import { beforeEach, afterEach, expect, test, describe } from "bun:test";
3+
import { convert } from "../../src/converters/dasel";
4+
import type { ExecFileFn } from "../../src/converters/types";
5+
6+
const originalWriteFile = fs.writeFile;
7+
8+
describe("convert", () => {
9+
let mockExecFile: ExecFileFn;
10+
11+
beforeEach(() => {
12+
// mock fs.writeFile
13+
// @ts-expect-error: property __promisify__ is missing
14+
fs.writeFile = (path, data, cb) => cb(null);
15+
// mock execFile
16+
mockExecFile = (cmd, args, callback) => callback(null, "output-data", "");
17+
});
18+
19+
afterEach(() => {
20+
// reset fs.writeFile
21+
fs.writeFile = originalWriteFile;
22+
});
23+
24+
test("should call dasel with correct arguments and write output", async () => {
25+
let calledArgs: Parameters<ExecFileFn> = ["", [], () => {}];
26+
mockExecFile = (cmd, args, callback) => {
27+
calledArgs = [cmd, args, callback];
28+
callback(null, "output-data", "");
29+
};
30+
31+
let writeFileCalled = false;
32+
// @ts-expect-error: property __promisify__ is missing
33+
fs.writeFile = (path, data, cb) => {
34+
writeFileCalled = true;
35+
expect(path).toBe("output.json");
36+
expect(data).toBe("output-data");
37+
// @ts-expect-error: could not be callable with null
38+
cb(null);
39+
};
40+
41+
const result = await convert(
42+
"input.yaml",
43+
"yaml",
44+
"json",
45+
"output.json",
46+
undefined,
47+
mockExecFile,
48+
);
49+
50+
expect(calledArgs[0]).toBe("dasel");
51+
expect(calledArgs[1]).toEqual(["--file", "input.yaml", "--read", "yaml", "--write", "json"]);
52+
expect(writeFileCalled).toBe(true);
53+
expect(result).toBe("Done");
54+
});
55+
56+
test("should reject if execFile returns an error", async () => {
57+
mockExecFile = (cmd, args, callback) => callback(new Error("fail"), "", "");
58+
expect(
59+
convert("input.yaml", "yaml", "json", "output.json", undefined, mockExecFile),
60+
).rejects.toMatch(/error: Error: fail/);
61+
});
62+
63+
test("should reject if writeFile fails", async () => {
64+
// @ts-expect-error: property __promisify__ is missing
65+
fs.writeFile = (path, data, cb) => cb(new Error("write fail"));
66+
expect(
67+
convert("input.yaml", "yaml", "json", "output.json", undefined, (cmd, args, cb) =>
68+
cb(null, "output-data", ""),
69+
),
70+
).rejects.toMatch(/Failed to write output/);
71+
});
72+
});

tests/converters/libreoffice.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { afterEach, beforeEach, expect, test } from "bun:test";
2-
import { convert } from "../../src/converters/libreoffice"; // ← adjust
3-
import type { ExecFileFn } from "../../src/converters/types"; // ← adjust
2+
import { convert } from "../../src/converters/libreoffice";
3+
import type { ExecFileFn } from "../../src/converters/types";
44

55
function requireDefined<T>(value: T, msg: string): NonNullable<T> {
66
if (value === undefined || value === null) throw new Error(msg);

tests/converters/pandoc.test.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { beforeEach, expect, test, describe } from "bun:test";
2+
import { convert } from "../../src/converters/pandoc";
3+
import type { ExecFileFn } from "../../src/converters/types";
4+
5+
describe("convert", () => {
6+
let mockExecFile: ExecFileFn;
7+
8+
beforeEach(() => {
9+
mockExecFile = (cmd, args, callback) => callback(null, "output-data", "");
10+
});
11+
12+
test("should call pandoc with correct arguments (normal)", async () => {
13+
let calledArgs: Parameters<ExecFileFn> = ["", [], () => {}];
14+
mockExecFile = (cmd, args, callback) => {
15+
calledArgs = [cmd, args, callback];
16+
callback(null, "output-data", "");
17+
};
18+
19+
const result = await convert(
20+
"input.md",
21+
"markdown",
22+
"html",
23+
"output.html",
24+
undefined,
25+
mockExecFile,
26+
);
27+
28+
expect(calledArgs[0]).toBe("pandoc");
29+
expect(calledArgs[1]).toEqual([
30+
"input.md",
31+
"-f",
32+
"markdown",
33+
"-t",
34+
"html",
35+
"-o",
36+
"output.html",
37+
]);
38+
expect(result).toBe("Done");
39+
});
40+
41+
test("should add xelatex argument for pdf/latex", async () => {
42+
let calledArgs: Parameters<ExecFileFn> = ["", [], () => {}];
43+
mockExecFile = (cmd, args, callback) => {
44+
calledArgs = [cmd, args, callback];
45+
callback(null, "output-data", "");
46+
};
47+
48+
await convert("input.md", "markdown", "pdf", "output.pdf", undefined, mockExecFile);
49+
50+
expect(calledArgs[1][0]).toBe("--pdf-engine=xelatex");
51+
expect(calledArgs[1]).toContain("input.md");
52+
expect(calledArgs[1]).toContain("-f");
53+
expect(calledArgs[1]).toContain("markdown");
54+
expect(calledArgs[1]).toContain("-t");
55+
expect(calledArgs[1]).toContain("pdf");
56+
expect(calledArgs[1]).toContain("-o");
57+
expect(calledArgs[1]).toContain("output.pdf");
58+
});
59+
60+
test("should reject if execFile returns an error", async () => {
61+
mockExecFile = (cmd, args, callback) => callback(new Error("fail"), "", "");
62+
expect(
63+
convert("input.md", "markdown", "html", "output.html", undefined, mockExecFile),
64+
).rejects.toMatch(/error: Error: fail/);
65+
});
66+
});

tests/converters/vtracer.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { beforeEach, expect, test, describe } from "bun:test";
2+
import { convert } from "../../src/converters/vtracer";
3+
import type { ExecFileFn } from "../../src/converters/types";
4+
5+
describe("convert", () => {
6+
let mockExecFile: ExecFileFn;
7+
8+
beforeEach(() => {
9+
mockExecFile = (cmd, args, callback) => callback(null, "output-data", "");
10+
});
11+
12+
test("should call vtracer with correct arguments (minimal)", async () => {
13+
let calledArgs: Parameters<ExecFileFn> = ["", [], () => {}];
14+
mockExecFile = (cmd, args, callback) => {
15+
calledArgs = [cmd, args, callback];
16+
callback(null, "output-data", "");
17+
};
18+
19+
const result = await convert("input.png", "png", "svg", "output.svg", undefined, mockExecFile);
20+
21+
expect(calledArgs[0]).toBe("vtracer");
22+
expect(calledArgs[1]).toEqual(["--input", "input.png", "--output", "output.svg"]);
23+
expect(result).toBe("Done");
24+
});
25+
26+
test("should add options as arguments", async () => {
27+
let calledArgs: Parameters<ExecFileFn> = ["", [], () => {}];
28+
mockExecFile = (cmd, args, callback) => {
29+
calledArgs = [cmd, args, callback];
30+
callback(null, "output-data", "");
31+
};
32+
33+
const options = {
34+
colormode: "color",
35+
hierarchical: "true",
36+
filter_speckle: 5,
37+
path_precision: 0.8,
38+
};
39+
40+
await convert("input.png", "png", "svg", "output.svg", options, mockExecFile);
41+
42+
expect(calledArgs[1]).toContain("--colormode");
43+
expect(calledArgs[1]).toContain("color");
44+
expect(calledArgs[1]).toContain("--hierarchical");
45+
expect(calledArgs[1]).toContain("true");
46+
expect(calledArgs[1]).toContain("--filter_speckle");
47+
expect(calledArgs[1]).toContain("5");
48+
expect(calledArgs[1]).toContain("--path_precision");
49+
expect(calledArgs[1]).toContain("0.8");
50+
});
51+
52+
test("should reject if execFile returns an error", async () => {
53+
mockExecFile = (cmd, args, callback) => callback(new Error("fail"), "", "stderr output");
54+
expect(
55+
convert("input.png", "png", "svg", "output.svg", undefined, mockExecFile),
56+
).rejects.toMatch(/error: Error: fail\nstderr: stderr output/);
57+
});
58+
});

0 commit comments

Comments
 (0)