From e5ac60c1872e07a0420f6a0f68fd20dc9761de5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Krzeslak?= Date: Thu, 24 Jul 2025 19:19:07 +0200 Subject: [PATCH] test: add unit test for msgconvert.ts --- src/converters/msgconvert.ts | 19 ++++++--- tests/converters/msgconvert.test.ts | 64 +++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 tests/converters/msgconvert.test.ts diff --git a/src/converters/msgconvert.ts b/src/converters/msgconvert.ts index b6bf826..cfd0d62 100644 --- a/src/converters/msgconvert.ts +++ b/src/converters/msgconvert.ts @@ -1,4 +1,5 @@ -import { execFile } from "node:child_process"; +import { execFile as execFileOriginal } from "node:child_process"; +import { ExecFileFn } from "./types.ts"; export const properties = { from: { @@ -14,8 +15,8 @@ export function convert( fileType: string, convertTo: string, targetPath: string, - // eslint-disable-next-line @typescript-eslint/no-unused-vars options?: unknown, + execFile: ExecFileFn = execFileOriginal, ): Promise { return new Promise((resolve, reject) => { if (fileType === "msg" && convertTo === "eml") { @@ -23,8 +24,8 @@ export function convert( // msgconvert will output to the same directory as the input file with .eml extension // We need to use --outfile to specify the target path const args = ["--outfile", targetPath, filePath]; - - execFile("msgconvert", args, (error, stdout, stderr) => { + + execFile("msgconvert", args, options, (error, stdout, stderr) => { if (error) { reject(new Error(`msgconvert failed: ${error.message}`)); return; @@ -33,13 +34,19 @@ export function convert( if (stderr) { // Log sanitized stderr to avoid exposing sensitive paths const sanitizedStderr = stderr.replace(/(\/[^\s]+)/g, "[REDACTED_PATH]"); - console.warn(`msgconvert stderr: ${sanitizedStderr.length > 200 ? sanitizedStderr.slice(0, 200) + '...' : sanitizedStderr}`); + console.warn( + `msgconvert stderr: ${sanitizedStderr.length > 200 ? sanitizedStderr.slice(0, 200) + "..." : sanitizedStderr}`, + ); } resolve(targetPath); }); } else { - reject(new Error(`Unsupported conversion from ${fileType} to ${convertTo}. Only MSG to EML conversion is currently supported.`)); + reject( + new Error( + `Unsupported conversion from ${fileType} to ${convertTo}. Only MSG to EML conversion is currently supported.`, + ), + ); } }); } diff --git a/tests/converters/msgconvert.test.ts b/tests/converters/msgconvert.test.ts new file mode 100644 index 0000000..8b8c155 --- /dev/null +++ b/tests/converters/msgconvert.test.ts @@ -0,0 +1,64 @@ +import type { ExecFileException } from "node:child_process"; +import { expect, test } from "bun:test"; +import { convert } from "../../src/converters/msgconvert.ts"; +import { ExecFileFn } from "../../src/converters/types.ts"; + +test("convert rejects conversion if input filetype is not msg and output type is not eml", async () => { + const mockExecFile: ExecFileFn = ( + _cmd: string, + _args: string[], + options: unknown, + callback: (err: ExecFileException | null, stdout: string, stderr: string) => void, + ) => { + callback(null, "Fake stdout", ""); + }; + + const expectedError = new Error( + "Unsupported conversion from obj to stl. Only MSG to EML conversion is currently supported.", + ); + + expect(convert("input.obj", "obj", "stl", "output.stl", undefined, mockExecFile)).rejects.toEqual( + expectedError, + ); +}); + +test("convert rejects conversion on error", async () => { + const mockExecFile: ExecFileFn = ( + _cmd: string, + _args: string[], + options: unknown, + callback: (err: ExecFileException | null, stdout: string, stderr: string) => void, + ) => { + callback(new Error("Test error"), "", ""); + }; + + const expectedError = new Error("msgconvert failed: Test error") + + expect( + convert("input.msg", "msg", "eml", "output.eml", undefined, mockExecFile), + ).rejects.toEqual(expectedError); +}) + +test("convert logs stderr as warning", async () => { + const originalConsoleWarn = console.warn; + + let loggedMessage = ""; + console.warn = (msg) => { + loggedMessage = msg; + }; + + const mockExecFile = ( + _cmd: string, + _args: string[], + options: unknown, + callback: (err: Error | null, stdout: string, stderr: string) => void, + ) => { + callback(null, "", "Fake stderr"); + }; + + await convert("file.msg", "msg", "eml", "out.eml", undefined, mockExecFile); + + console.error = originalConsoleWarn; + + expect(loggedMessage).toBe("msgconvert stderr: Fake stderr"); +})