94 lines
2.7 KiB
TypeScript
94 lines
2.7 KiB
TypeScript
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");
|
|
});
|
|
});
|