global.test.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { describe, expect, test } from "bun:test"
  2. import fs from "fs"
  3. import os from "os"
  4. import path from "path"
  5. import { pathToFileURL } from "url"
  6. import { Context, Effect, Layer } from "effect"
  7. import { Global } from "../src/global.js"
  8. describe("global", () => {
  9. test("importing the module does not create directories", () => {
  10. const root = fs.mkdtempSync(path.join(os.tmpdir(), "opencode-global-import-"))
  11. const directories = ["data", "cache", "config", "state", "tmp"].map((directory) => path.join(root, directory))
  12. const module = pathToFileURL(path.join(import.meta.dir, "../src/global.ts")).href
  13. const result = Bun.spawnSync({
  14. cmd: [process.execPath, "-e", `const { Global } = await import(${JSON.stringify(module)}); void Global.Path.tmp`],
  15. env: {
  16. ...process.env,
  17. XDG_DATA_HOME: directories[0],
  18. XDG_CACHE_HOME: directories[1],
  19. XDG_CONFIG_HOME: directories[2],
  20. XDG_STATE_HOME: directories[3],
  21. TMPDIR: directories[4],
  22. },
  23. stderr: "pipe",
  24. })
  25. expect(result.exitCode, result.stderr.toString()).toBe(0)
  26. directories.forEach((directory) => expect(fs.existsSync(path.join(directory, "opencode"))).toBe(false))
  27. fs.rmSync(root, { recursive: true, force: true })
  28. })
  29. test("building layerWith creates service directories and preserves an explicit tmp", async () => {
  30. const root = fs.mkdtempSync(path.join(os.tmpdir(), "opencode-global-layer-"))
  31. const directories = {
  32. data: path.join(root, "data"),
  33. config: path.join(root, "config"),
  34. state: path.join(root, "state"),
  35. log: path.join(root, "log"),
  36. bin: path.join(root, "bin"),
  37. repos: path.join(root, "repos"),
  38. tmp: path.join(root, "nested", "..", "tmp"),
  39. }
  40. const context = await Effect.runPromise(Effect.scoped(Layer.build(Global.layerWith(directories))))
  41. Object.values(directories).forEach((directory) => expect(fs.statSync(directory).isDirectory()).toBe(true))
  42. expect(Context.get(context, Global.Service).tmp).toBe(directories.tmp)
  43. fs.rmSync(root, { recursive: true, force: true })
  44. })
  45. test("building a layer with default tmp creates and canonicalizes it", () => {
  46. const root = fs.mkdtempSync(path.join(os.tmpdir(), "opencode-global-layer-"))
  47. const directories = ["data", "cache", "config", "state", "tmp"].map((directory) => path.join(root, directory))
  48. const module = pathToFileURL(path.join(import.meta.dir, "../src/global.ts")).href
  49. const result = Bun.spawnSync({
  50. cmd: [
  51. process.execPath,
  52. "-e",
  53. `
  54. import { Context, Effect, Layer } from "effect"
  55. const { Global } = await import(${JSON.stringify(module)})
  56. const context = await Effect.runPromise(Effect.scoped(Layer.build(Global.layerWith({}))))
  57. process.stdout.write(Context.get(context, Global.Service).tmp)
  58. `,
  59. ],
  60. cwd: path.join(import.meta.dir, ".."),
  61. env: {
  62. ...process.env,
  63. XDG_DATA_HOME: directories[0],
  64. XDG_CACHE_HOME: directories[1],
  65. XDG_CONFIG_HOME: directories[2],
  66. XDG_STATE_HOME: directories[3],
  67. TMPDIR: directories[4],
  68. },
  69. stdout: "pipe",
  70. stderr: "pipe",
  71. })
  72. expect(result.exitCode, result.stderr.toString()).toBe(0)
  73. expect(result.stdout.toString()).toBe(fs.realpathSync(path.join(directories[4], "opencode")))
  74. const created = [
  75. path.join(directories[0], "opencode"),
  76. path.join(directories[1], "opencode", "bin"),
  77. path.join(directories[2], "opencode"),
  78. path.join(directories[3], "opencode"),
  79. path.join(directories[0], "opencode", "log"),
  80. path.join(directories[0], "opencode", "repos"),
  81. path.join(directories[4], "opencode"),
  82. ]
  83. created.forEach((directory) => expect(fs.statSync(directory).isDirectory()).toBe(true))
  84. fs.rmSync(root, { recursive: true, force: true })
  85. })
  86. })