import { writeFile } from "node:fs/promises"; import path from "node:path"; import { describe, expect, it } from "vitest"; import { createPluginSdkTestHarness } from "./test-helpers.js"; import { materializeWindowsSpawnProgram, resolveWindowsSpawnProgram } from "./windows-spawn.js"; const { createTempDir } = createPluginSdkTestHarness({ cleanup: { maxRetries: 8, retryDelay: 8, }, }); describe("resolveWindowsSpawnProgram", () => { it("fails closed by default for unresolved windows wrappers", async () => { const dir = await createTempDir("openclaw-windows-spawn-test-"); const shimPath = path.join(dir, "wrapper.cmd"); await writeFile(shimPath, "@ECHO off\r\necho wrapper\r\n", "utf8"); expect(() => resolveWindowsSpawnProgram({ command: shimPath, platform: "win32", env: { PATH: dir, PATHEXT: ".CMD;.EXE;.BAT" }, execPath: "C:\\node\\node.exe", }), ).toThrow(/without shell execution/); }); it("only returns shell fallback when explicitly opted in", async () => { const dir = await createTempDir("openclaw-windows-spawn-test-"); const shimPath = path.join(dir, "wrapper.cmd"); await writeFile(shimPath, "@ECHO off\r\necho wrapper\r\n", "utf8"); const resolved = resolveWindowsSpawnProgram({ command: shimPath, platform: "win32", env: { PATH: dir, PATHEXT: ".CMD;.EXE;.BAT" }, execPath: "C:\\node\\node.exe", allowShellFallback: true, }); const invocation = materializeWindowsSpawnProgram(resolved, ["--cwd", "C:\\safe & calc.exe"]); expect(invocation).toEqual({ command: shimPath, argv: ["--cwd", "C:\\safe & calc.exe"], resolution: "shell-fallback", shell: true, windowsHide: undefined, }); }); });