reference.test.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { describe, expect } from "bun:test"
  2. import { Effect, Exit, Layer, Scope } from "effect"
  3. import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder"
  4. import { LayerNode } from "@opencode-ai/util/effect/layer-node"
  5. import { AbsolutePath } from "@opencode-ai/core/schema"
  6. import { Global } from "@opencode-ai/util/global"
  7. import { Reference } from "@opencode-ai/core/reference"
  8. import { Repository } from "@opencode-ai/core/repository"
  9. import { RepositoryCache } from "@opencode-ai/core/repository-cache"
  10. import { it } from "./lib/effect"
  11. const cache = Layer.mock(RepositoryCache.Service, {
  12. ensure: () => Effect.die("unexpected Git materialization"),
  13. })
  14. const referenceLayer = AppNodeBuilder.build(Reference.node, [[RepositoryCache.node, cache]])
  15. describe("Reference", () => {
  16. it.effect("registers normalized sources for the owning scope", () =>
  17. Effect.gen(function* () {
  18. const references = yield* Reference.Service
  19. const scope = yield* Scope.make()
  20. const path = AbsolutePath.make("/docs")
  21. const source = Reference.LocalSource.make({
  22. type: "local",
  23. path,
  24. description: "Use for API documentation",
  25. hidden: true,
  26. })
  27. yield* references.transform((editor) => editor.add("docs", source)).pipe(Scope.provide(scope))
  28. expect(yield* references.list()).toEqual([
  29. Reference.Info.make({ name: "docs", path, description: "Use for API documentation", hidden: true, source }),
  30. ])
  31. yield* Scope.close(scope, Exit.void)
  32. expect(yield* references.list()).toEqual([])
  33. }).pipe(Effect.provide(referenceLayer)),
  34. )
  35. it.effect("derives Git paths without exposing cache operations", () =>
  36. Effect.gen(function* () {
  37. const references = yield* Reference.Service
  38. const repository = Repository.parseRemote("owner/repo")
  39. const source = Reference.GitSource.make({ type: "git", repository: "owner/repo", branch: "main" })
  40. yield* references.transform((editor) => editor.add("sdk", source))
  41. expect(yield* references.list()).toEqual([
  42. Reference.Info.make({
  43. name: "sdk",
  44. path: AbsolutePath.make(Repository.cachePath(Global.Path.repos, repository, "main")),
  45. source,
  46. }),
  47. ])
  48. }).pipe(Effect.scoped, Effect.provide(referenceLayer)),
  49. )
  50. it.effect("preserves configured Git descriptions", () =>
  51. Effect.gen(function* () {
  52. const references = yield* Reference.Service
  53. const repository = Repository.parseRemote("owner/repo")
  54. const source = Reference.GitSource.make({
  55. type: "git",
  56. repository: "owner/repo",
  57. description: "Use for SDK implementation details",
  58. })
  59. yield* references.transform((editor) => editor.add("sdk", source))
  60. expect(yield* references.list()).toEqual([
  61. Reference.Info.make({
  62. name: "sdk",
  63. path: AbsolutePath.make(Repository.cachePath(Global.Path.repos, repository)),
  64. description: "Use for SDK implementation details",
  65. source,
  66. }),
  67. ])
  68. }).pipe(Effect.scoped, Effect.provide(referenceLayer)),
  69. )
  70. })