credential.test.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import path from "path"
  2. import { describe, expect } from "bun:test"
  3. import { Effect, Layer } from "effect"
  4. import { Credential } from "@opencode-ai/core/credential"
  5. import { Database } from "@opencode-ai/core/database/database"
  6. import { Integration } from "@opencode-ai/core/integration"
  7. import { tmpdir } from "./fixture/tmpdir"
  8. import { it } from "./lib/effect"
  9. function layer(directory: string) {
  10. return Credential.layer.pipe(
  11. Layer.provide(Database.layerFromPath(path.join(directory, "credential.db")).pipe(Layer.fresh)),
  12. )
  13. }
  14. describe("Credential", () => {
  15. it.live("stores, updates, lists, and removes credentials", () =>
  16. Effect.acquireRelease(
  17. Effect.promise(() => tmpdir()),
  18. (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()),
  19. ).pipe(
  20. Effect.flatMap((tmp) =>
  21. Effect.gen(function* () {
  22. const credentials = yield* Credential.Service
  23. const integrationID = Integration.ID.make("openai")
  24. const created = yield* credentials.create({
  25. integrationID,
  26. label: "Work",
  27. value: new Credential.Key({ type: "key", key: "secret" }),
  28. })
  29. expect(yield* credentials.list(integrationID)).toEqual([created])
  30. yield* credentials.update(created.id, { label: "Personal" })
  31. expect((yield* credentials.list(integrationID))[0]?.label).toBe("Personal")
  32. const replacement = yield* credentials.create({
  33. integrationID,
  34. label: "Replacement",
  35. value: new Credential.Key({ type: "key", key: "replacement" }),
  36. })
  37. expect(yield* credentials.list(integrationID)).toEqual([replacement])
  38. yield* credentials.remove(replacement.id)
  39. expect(yield* credentials.list(integrationID)).toEqual([])
  40. }).pipe(Effect.provide(layer(tmp.path))),
  41. ),
  42. ),
  43. )
  44. })