wellknown.test.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { expect } from "bun:test"
  2. import { Effect, Fiber, Stream } from "effect"
  3. import { FetchHttpClient } from "effect/unstable/http"
  4. import { KV } from "@opencode-ai/core/kv"
  5. import { LayerNode } from "@opencode-ai/util/effect/layer-node"
  6. import { Bus } from "@opencode-ai/core/bus"
  7. import { WellKnown } from "@opencode-ai/core/wellknown"
  8. import { testEffect } from "./lib/effect"
  9. const it = testEffect(FetchHttpClient.layer)
  10. const serviceIt = testEffect(LayerNode.compile(LayerNode.group([WellKnown.node, KV.node, Bus.node])))
  11. it.live("loads embedded and remote configuration", () =>
  12. Effect.acquireUseRelease(
  13. Effect.sync(() =>
  14. Bun.serve({
  15. port: 0,
  16. fetch(request) {
  17. const url = new URL(request.url)
  18. if (url.pathname === "/.well-known/opencode") {
  19. return Response.json({
  20. auth: { command: ["login"], env: "TOKEN" },
  21. config: { model: "embedded/model" },
  22. remote_config: {
  23. url: `${url.origin}/config/{env:TOKEN}`,
  24. headers: { authorization: "Bearer {env:TOKEN}" },
  25. },
  26. })
  27. }
  28. if (url.pathname === "/config/secret" && request.headers.get("authorization") === "Bearer secret") {
  29. return Response.json({ config: { model: "remote/model" } })
  30. }
  31. return new Response("Not found", { status: 404 })
  32. },
  33. }),
  34. ),
  35. (server) =>
  36. Effect.gen(function* () {
  37. const origin = server.url.origin
  38. expect(yield* WellKnown.inspect(`${origin}/`)).toEqual({
  39. auth: { command: ["login"], env: "TOKEN" },
  40. config: { model: "embedded/model" },
  41. remote_config: {
  42. url: `${origin}/config/{env:TOKEN}`,
  43. headers: { authorization: "Bearer {env:TOKEN}" },
  44. },
  45. })
  46. expect(yield* WellKnown.resolve({ origin, variables: { TOKEN: "secret" } })).toEqual([
  47. { model: "embedded/model" },
  48. { model: "remote/model" },
  49. ])
  50. }),
  51. (server) => Effect.promise(() => server.stop(true)),
  52. ),
  53. )
  54. serviceIt.live("persists sources in one KV value", () =>
  55. Effect.acquireUseRelease(
  56. Effect.sync(() =>
  57. Bun.serve({
  58. port: 0,
  59. fetch: () => Response.json({ auth: { command: ["login"], env: "TOKEN" } }),
  60. }),
  61. ),
  62. (server) =>
  63. Effect.gen(function* () {
  64. const wellknown = yield* WellKnown.Service
  65. const kv = yield* KV.Service
  66. const bus = yield* Bus.Service
  67. const changed = yield* bus
  68. .subscribe(WellKnown.Event.Updated)
  69. .pipe(Stream.take(1), Stream.runCollect, Effect.forkScoped({ startImmediately: true }))
  70. const entry = yield* wellknown.add(`${server.url.origin}/`)
  71. expect(entry.origin).toBe(server.url.origin)
  72. expect(yield* kv.get("wellknown:sources")).toEqual([server.url.origin])
  73. expect(yield* wellknown.entries()).toEqual([entry])
  74. expect(yield* Fiber.join(changed)).toHaveLength(1)
  75. yield* wellknown.remove(server.url.origin)
  76. expect(yield* kv.get("wellknown:sources")).toEqual([])
  77. expect(yield* wellknown.entries()).toEqual([])
  78. }),
  79. (server) => Effect.promise(() => server.stop(true)),
  80. ),
  81. )
  82. serviceIt.live("refreshes changed manifests", () =>
  83. Effect.acquireUseRelease(
  84. Effect.sync(() => {
  85. let command = "first"
  86. return {
  87. server: Bun.serve({
  88. port: 0,
  89. fetch: () => Response.json({ auth: { command: [command], env: "TOKEN" } }),
  90. }),
  91. update: () => {
  92. command = "second"
  93. },
  94. }
  95. }),
  96. ({ server, update }) =>
  97. Effect.gen(function* () {
  98. const wellknown = yield* WellKnown.Service
  99. const bus = yield* Bus.Service
  100. yield* wellknown.add(server.url.origin)
  101. expect(yield* wellknown.refresh()).toBe(false)
  102. const changed = yield* bus
  103. .subscribe(WellKnown.Event.Updated)
  104. .pipe(Stream.take(1), Stream.runCollect, Effect.forkScoped({ startImmediately: true }))
  105. update()
  106. expect(yield* wellknown.refresh()).toBe(true)
  107. expect(yield* Fiber.join(changed)).toHaveLength(1)
  108. expect(wellknown.snapshot()[0]?.manifest.auth?.command).toEqual(["second"])
  109. }),
  110. ({ server }) => Effect.promise(() => server.stop(true)),
  111. ),
  112. )