global-roots.test.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { describe, expect, test } from "bun:test"
  2. import os from "os"
  3. import path from "path"
  4. import { pathToFileURL } from "url"
  5. const module = pathToFileURL(path.join(import.meta.dir, "../src/global-roots.ts")).href
  6. describe("global roots", () => {
  7. test("uses XDG overrides", () => {
  8. const root = path.join(os.tmpdir(), "opencode-xdg-overrides")
  9. const env = {
  10. XDG_DATA_HOME: path.join(root, "data"),
  11. XDG_CACHE_HOME: path.join(root, "cache"),
  12. XDG_CONFIG_HOME: path.join(root, "config"),
  13. XDG_STATE_HOME: path.join(root, "state"),
  14. }
  15. expect(run(env)).toEqual({
  16. data: path.join(env.XDG_DATA_HOME, "opencode"),
  17. cache: path.join(env.XDG_CACHE_HOME, "opencode"),
  18. config: path.join(env.XDG_CONFIG_HOME, "opencode"),
  19. state: path.join(env.XDG_STATE_HOME, "opencode"),
  20. tmp: path.join(os.tmpdir(), "opencode"),
  21. })
  22. })
  23. test("empty XDG overrides use home directory defaults", () => {
  24. const home = path.join(os.tmpdir(), "opencode-xdg-home")
  25. expect(
  26. run({
  27. XDG_DATA_HOME: "",
  28. XDG_CACHE_HOME: "",
  29. XDG_CONFIG_HOME: "",
  30. XDG_STATE_HOME: "",
  31. ...(process.platform === "win32" ? { USERPROFILE: home } : { HOME: home }),
  32. }),
  33. ).toEqual({
  34. data: path.join(home, ".local", "share", "opencode"),
  35. cache: path.join(home, ".cache", "opencode"),
  36. config: path.join(home, ".config", "opencode"),
  37. state: path.join(home, ".local", "state", "opencode"),
  38. tmp: path.join(os.tmpdir(), "opencode"),
  39. })
  40. })
  41. })
  42. function run(env: Record<string, string>) {
  43. const result = Bun.spawnSync({
  44. cmd: [
  45. process.execPath,
  46. "-e",
  47. `const { roots } = await import(${JSON.stringify(module)}); console.log(JSON.stringify(roots("opencode")))`,
  48. ],
  49. env: { ...process.env, ...env },
  50. stdout: "pipe",
  51. stderr: "pipe",
  52. })
  53. expect(result.exitCode, result.stderr.toString()).toBe(0)
  54. return JSON.parse(result.stdout.toString())
  55. }