45 lines
1.3 KiB
TypeScript
45 lines
1.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { resolveSandboxDockerUser } from "./context.js";
|
|
import type { SandboxDockerConfig } from "./types.js";
|
|
|
|
const baseDocker: SandboxDockerConfig = {
|
|
image: "ghcr.io/example/sandbox:latest",
|
|
containerPrefix: "openclaw-sandbox-",
|
|
workdir: "/workspace",
|
|
readOnlyRoot: true,
|
|
tmpfs: ["/tmp"],
|
|
network: "none",
|
|
capDrop: ["ALL"],
|
|
};
|
|
|
|
describe("resolveSandboxDockerUser", () => {
|
|
it("keeps configured docker.user", async () => {
|
|
const resolved = await resolveSandboxDockerUser({
|
|
docker: { ...baseDocker, user: "2000:2000" },
|
|
workspaceDir: "/tmp/unused",
|
|
stat: async () => ({ uid: 1000, gid: 1000 }),
|
|
});
|
|
expect(resolved.user).toBe("2000:2000");
|
|
});
|
|
|
|
it("falls back to workspace ownership when docker.user is unset", async () => {
|
|
const resolved = await resolveSandboxDockerUser({
|
|
docker: baseDocker,
|
|
workspaceDir: "/tmp/workspace",
|
|
stat: async () => ({ uid: 1001, gid: 1002 }),
|
|
});
|
|
expect(resolved.user).toBe("1001:1002");
|
|
});
|
|
|
|
it("leaves docker.user unset when workspace stat fails", async () => {
|
|
const resolved = await resolveSandboxDockerUser({
|
|
docker: baseDocker,
|
|
workspaceDir: "/tmp/workspace",
|
|
stat: async () => {
|
|
throw new Error("ENOENT");
|
|
},
|
|
});
|
|
expect(resolved.user).toBeUndefined();
|
|
});
|
|
});
|