From 311d2516ce94a751817e00e5b0d0011536e87598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Krzeslak?= Date: Thu, 24 Jul 2025 17:56:19 +0200 Subject: [PATCH] test: add unit test for libjxl.ts --- src/converters/libjxl.ts | 5 ++- tests/converters/libjxl.test.ts | 79 +++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 tests/converters/libjxl.test.ts diff --git a/src/converters/libjxl.ts b/src/converters/libjxl.ts index 0ef11a8..6ff825f 100644 --- a/src/converters/libjxl.ts +++ b/src/converters/libjxl.ts @@ -1,4 +1,5 @@ -import { execFile } from "node:child_process"; +import { execFile as execFileOriginal } from "node:child_process"; +import { ExecFileFn } from "./types.ts"; // declare possible conversions export const properties = { @@ -17,8 +18,8 @@ export function convert( fileType: string, convertTo: string, targetPath: string, - // eslint-disable-next-line @typescript-eslint/no-unused-vars options?: unknown, + execFile: ExecFileFn = execFileOriginal, // to make it mockable ): Promise { let tool = ""; if (fileType === "jxl") { diff --git a/tests/converters/libjxl.test.ts b/tests/converters/libjxl.test.ts new file mode 100644 index 0000000..cea851b --- /dev/null +++ b/tests/converters/libjxl.test.ts @@ -0,0 +1,79 @@ +import type { ExecFileException } from "node:child_process"; +import { beforeEach, expect, test } from "bun:test"; +import { convert } from "../../src/converters/libjxl.ts"; +import { ExecFileFn } from "../../src/converters/types.ts"; +import { + runConvertFailTest, + runConvertLogsStderror, + runConvertSuccessTest, +} from "./helpers/converters.ts"; + +let command: string = ""; + +beforeEach(() => { + command = ""; +}); + +test("convert resolves when execFile succeeds", async () => { + await runConvertSuccessTest(convert); +}); + +test("convert rejects when execFile fails", async () => { + await runConvertFailTest(convert); +}); + +test("convert logs stderr when present", async () => { + await runConvertLogsStderror(convert); +}); + +test("convert uses djxl with input filetype being jxl", async () => { + const originalConsoleLog = console.log; + + let loggedMessage = ""; + console.log = (msg) => { + loggedMessage = msg; + }; + + const mockExecFile: ExecFileFn = ( + _cmd: string, + _args: string[], + callback: (err: ExecFileException | null, stdout: string, stderr: string) => void, + ) => { + command = _cmd; + callback(null, "Fake stdout", ""); + }; + + const result = await convert("input.jxl", "jxl", "png", "output.png", undefined, mockExecFile); + + console.log = originalConsoleLog; + + expect(result).toBe("Done"); + expect(command).toEqual("djxl"); + expect(loggedMessage).toBe("stdout: Fake stdout"); +}); + +test("convert uses cjxl with output filetype being jxl", async () => { + const originalConsoleLog = console.log; + + let loggedMessage = ""; + console.log = (msg) => { + loggedMessage = msg; + }; + + const mockExecFile: ExecFileFn = ( + _cmd: string, + _args: string[], + callback: (err: ExecFileException | null, stdout: string, stderr: string) => void, + ) => { + command = _cmd; + callback(null, "Fake stdout", ""); + }; + + const result = await convert("input.png", "png", "jxl", "output.jxl", undefined, mockExecFile); + + console.log = originalConsoleLog; + + expect(result).toBe("Done"); + expect(command).toEqual("cjxl"); + expect(loggedMessage).toBe("stdout: Fake stdout"); +});