Files
fathah--hermes-desktop/tests/claw3d-command-resolution.test.ts
2026-07-13 13:36:53 +08:00

121 lines
3.3 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
buildWindowsScriptCommandLine,
createClaw3dScriptInvocation,
createNpmCommandInvocation,
isWindowsCommandScript,
pickWindowsCommandCandidate,
} from "../src/main/claw3d";
describe("Claw3D command resolution", () => {
it("detects Windows command scripts", () => {
expect(isWindowsCommandScript("npm.cmd")).toBe(true);
expect(isWindowsCommandScript("C:\\node\\npm.BAT")).toBe(true);
expect(isWindowsCommandScript("git.exe")).toBe(false);
expect(isWindowsCommandScript("/usr/local/bin/npm")).toBe(false);
});
it("prefers npm.cmd over extensionless npm on Windows", () => {
const command = pickWindowsCommandCandidate([
"C:\\nvm4w\\nodejs\\npm",
"C:\\nvm4w\\nodejs\\npm.cmd",
]);
expect(command).toEqual({
command: "C:\\nvm4w\\nodejs\\npm.cmd",
windowsScript: true,
});
});
it("runs native executables directly", () => {
const command = pickWindowsCommandCandidate([
"C:\\Program Files\\Git\\cmd\\git.exe",
]);
expect(command).toEqual({
command: "C:\\Program Files\\Git\\cmd\\git.exe",
windowsScript: false,
});
});
it("wraps Windows command scripts for cmd.exe without losing spaces", () => {
expect(
buildWindowsScriptCommandLine("C:\\Program Files\\nodejs\\npm.cmd", [
"run",
"dev",
]),
).toBe('""C:\\Program Files\\nodejs\\npm.cmd" "run" "dev""');
});
it("runs Windows npm scripts through node.exe instead of cmd.exe when npm CLI is available", () => {
const invocation = createNpmCommandInvocation(
{
command: "C:\\nvm4w\\nodejs\\npm.cmd",
windowsScript: true,
},
["run", "dev"],
{
platform: "win32",
fileExists: (path) =>
[
"C:\\nvm4w\\nodejs\\node.exe",
"C:\\nvm4w\\nodejs\\node_modules\\npm\\bin\\npm-cli.js",
].includes(path),
},
);
expect(invocation).toEqual({
command: "C:\\nvm4w\\nodejs\\node.exe",
args: [
"C:\\nvm4w\\nodejs\\node_modules\\npm\\bin\\npm-cli.js",
"run",
"dev",
],
});
});
it("falls back to node on PATH for Windows npm shims without a sibling node.exe", () => {
const invocation = createNpmCommandInvocation(
{
command: "C:\\Users\\me\\AppData\\Roaming\\npm\\npm.cmd",
windowsScript: true,
},
["run", "hermes-adapter"],
{
platform: "win32",
fileExists: (path) =>
path ===
"C:\\Users\\me\\AppData\\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js",
},
);
expect(invocation).toEqual({
command: "node",
args: [
"C:\\Users\\me\\AppData\\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js",
"run",
"hermes-adapter",
],
});
});
it("runs Claw3D start scripts directly through node without npm or cmd.exe", () => {
expect(
createClaw3dScriptInvocation("dev", "C:\\nvm4w\\nodejs\\node.exe"),
).toEqual({
command: "C:\\nvm4w\\nodejs\\node.exe",
args: ["server/index.js", "--dev"],
});
expect(
createClaw3dScriptInvocation(
"hermes-adapter",
"C:\\nvm4w\\nodejs\\node.exe",
),
).toEqual({
command: "C:\\nvm4w\\nodejs\\node.exe",
args: ["server/hermes-gateway-adapter.js"],
});
});
});