Spaces:
Paused
Paused
| 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(); | |
| }); | |
| }); | |