reference-guidance.test.ts 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import { describe, expect } from "bun:test"
  2. import { Effect, Layer } from "effect"
  3. import { AbsolutePath } from "@opencode-ai/core/schema"
  4. import { PluginBoot } from "@opencode-ai/core/plugin/boot"
  5. import { Reference } from "@opencode-ai/core/reference"
  6. import { ReferenceGuidance } from "@opencode-ai/core/reference/guidance"
  7. import { SystemContext } from "@opencode-ai/core/system-context/index"
  8. import { it } from "./lib/effect"
  9. describe("ReferenceGuidance", () => {
  10. it.effect("lists available references in the system context", () =>
  11. Effect.gen(function* () {
  12. const guidance = yield* ReferenceGuidance.Service
  13. const generation = yield* SystemContext.initialize(yield* guidance.load())
  14. expect(generation.baseline).toContain("<available_references>")
  15. expect(generation.baseline).toContain("<name>docs</name>")
  16. expect(generation.baseline).toContain("<path>/docs</path>")
  17. expect(generation.baseline).toContain("<description>Use for product documentation</description>")
  18. }).pipe(
  19. Effect.provide(ReferenceGuidance.layer),
  20. Effect.provide(
  21. Layer.mock(Reference.Service, {
  22. list: () =>
  23. Effect.succeed([
  24. new Reference.Info({
  25. name: "docs",
  26. path: AbsolutePath.make("/docs"),
  27. description: "Use for product documentation",
  28. source: new Reference.LocalSource({
  29. type: "local",
  30. path: AbsolutePath.make("/docs"),
  31. description: "Use for product documentation",
  32. }),
  33. }),
  34. ]),
  35. }),
  36. ),
  37. Effect.provide(Layer.mock(PluginBoot.Service, { wait: () => Effect.void })),
  38. ),
  39. )
  40. it.effect("omits guidance when no references are available", () =>
  41. Effect.gen(function* () {
  42. const guidance = yield* ReferenceGuidance.Service
  43. const generation = yield* SystemContext.initialize(yield* guidance.load())
  44. expect(generation.baseline).toBe("")
  45. }).pipe(
  46. Effect.provide(ReferenceGuidance.layer),
  47. Effect.provide(Layer.mock(Reference.Service, { list: () => Effect.succeed([]) })),
  48. Effect.provide(Layer.mock(PluginBoot.Service, { wait: () => Effect.void })),
  49. ),
  50. )
  51. it.effect("omits references without descriptions", () =>
  52. Effect.gen(function* () {
  53. const guidance = yield* ReferenceGuidance.Service
  54. const generation = yield* SystemContext.initialize(yield* guidance.load())
  55. expect(generation.baseline).toBe("")
  56. }).pipe(
  57. Effect.provide(ReferenceGuidance.layer),
  58. Effect.provide(
  59. Layer.mock(Reference.Service, {
  60. list: () =>
  61. Effect.succeed([
  62. new Reference.Info({
  63. name: "docs",
  64. path: AbsolutePath.make("/docs"),
  65. source: new Reference.LocalSource({ type: "local", path: AbsolutePath.make("/docs") }),
  66. }),
  67. ]),
  68. }),
  69. ),
  70. Effect.provide(Layer.mock(PluginBoot.Service, { wait: () => Effect.void })),
  71. ),
  72. )
  73. })