import { describe, expect, it } from "vitest"; import { buildDockerExecArgs } from "./bash-tools.shared.js"; describe("buildDockerExecArgs", () => { it("prepends custom PATH after login shell sourcing to preserve both custom and system tools", () => { const args = buildDockerExecArgs({ containerName: "test-container", command: "echo hello", env: { PATH: "/custom/bin:/usr/local/bin:/usr/bin", HOME: "/home/user", }, tty: false, }); const commandArg = args[args.length - 1]; expect(args).toContain("OPENCLAW_PREPEND_PATH=/custom/bin:/usr/local/bin:/usr/bin"); expect(commandArg).toContain('export PATH="${OPENCLAW_PREPEND_PATH}:$PATH"'); expect(commandArg).toContain("echo hello"); expect(commandArg).toBe( 'export PATH="${OPENCLAW_PREPEND_PATH}:$PATH"; unset OPENCLAW_PREPEND_PATH; echo hello', ); }); it("does not interpolate PATH into the shell command", () => { const injectedPath = "$(touch /tmp/openclaw-path-injection)"; const args = buildDockerExecArgs({ containerName: "test-container", command: "echo hello", env: { PATH: injectedPath, HOME: "/home/user", }, tty: false, }); const commandArg = args[args.length - 1]; expect(args).toContain(`OPENCLAW_PREPEND_PATH=${injectedPath}`); expect(commandArg).not.toContain(injectedPath); expect(commandArg).toContain("OPENCLAW_PREPEND_PATH"); }); it("does not add PATH export when PATH is not in env", () => { const args = buildDockerExecArgs({ containerName: "test-container", command: "echo hello", env: { HOME: "/home/user", }, tty: false, }); const commandArg = args[args.length - 1]; expect(commandArg).toBe("echo hello"); expect(commandArg).not.toContain("export PATH"); }); it("includes workdir flag when specified", () => { const args = buildDockerExecArgs({ containerName: "test-container", command: "pwd", workdir: "/workspace", env: { HOME: "/home/user" }, tty: false, }); expect(args).toContain("-w"); expect(args).toContain("/workspace"); }); it("uses login shell for consistent environment", () => { const args = buildDockerExecArgs({ containerName: "test-container", command: "echo test", env: { HOME: "/home/user" }, tty: false, }); expect(args).toContain("sh"); expect(args).toContain("-lc"); }); it("includes tty flag when requested", () => { const args = buildDockerExecArgs({ containerName: "test-container", command: "bash", env: { HOME: "/home/user" }, tty: true, }); expect(args).toContain("-t"); }); });