79 lines
2.3 KiB
TypeScript
79 lines
2.3 KiB
TypeScript
import fs from "node:fs/promises";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
import { afterEach, describe, expect, it } from "vitest";
|
|
import { prepareOpenCodeRuntimeConfig } from "./runtime-config.js";
|
|
|
|
const cleanupPaths = new Set<string>();
|
|
|
|
afterEach(async () => {
|
|
await Promise.all(
|
|
[...cleanupPaths].map(async (filepath) => {
|
|
await fs.rm(filepath, { recursive: true, force: true });
|
|
cleanupPaths.delete(filepath);
|
|
}),
|
|
);
|
|
});
|
|
|
|
async function makeConfigHome(initialConfig?: Record<string, unknown>) {
|
|
const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-opencode-test-"));
|
|
cleanupPaths.add(root);
|
|
const configDir = path.join(root, "opencode");
|
|
await fs.mkdir(configDir, { recursive: true });
|
|
if (initialConfig) {
|
|
await fs.writeFile(
|
|
path.join(configDir, "opencode.json"),
|
|
`${JSON.stringify(initialConfig, null, 2)}\n`,
|
|
"utf8",
|
|
);
|
|
}
|
|
return root;
|
|
}
|
|
|
|
describe("prepareOpenCodeRuntimeConfig", () => {
|
|
it("injects an external_directory allow rule by default", async () => {
|
|
const configHome = await makeConfigHome({
|
|
permission: {
|
|
read: "allow",
|
|
},
|
|
theme: "system",
|
|
});
|
|
|
|
const prepared = await prepareOpenCodeRuntimeConfig({
|
|
env: { XDG_CONFIG_HOME: configHome },
|
|
config: {},
|
|
});
|
|
cleanupPaths.add(prepared.env.XDG_CONFIG_HOME);
|
|
|
|
expect(prepared.env.XDG_CONFIG_HOME).not.toBe(configHome);
|
|
const runtimeConfig = JSON.parse(
|
|
await fs.readFile(
|
|
path.join(prepared.env.XDG_CONFIG_HOME, "opencode", "opencode.json"),
|
|
"utf8",
|
|
),
|
|
) as Record<string, unknown>;
|
|
expect(runtimeConfig).toMatchObject({
|
|
theme: "system",
|
|
permission: {
|
|
read: "allow",
|
|
external_directory: "allow",
|
|
},
|
|
});
|
|
|
|
await prepared.cleanup();
|
|
cleanupPaths.delete(prepared.env.XDG_CONFIG_HOME);
|
|
await expect(fs.access(prepared.env.XDG_CONFIG_HOME)).rejects.toThrow();
|
|
});
|
|
|
|
it("respects explicit opt-out", async () => {
|
|
const configHome = await makeConfigHome();
|
|
const prepared = await prepareOpenCodeRuntimeConfig({
|
|
env: { XDG_CONFIG_HOME: configHome },
|
|
config: { dangerouslySkipPermissions: false },
|
|
});
|
|
|
|
expect(prepared.env).toEqual({ XDG_CONFIG_HOME: configHome });
|
|
expect(prepared.notes).toEqual([]);
|
|
await prepared.cleanup();
|
|
});
|
|
});
|