import { describe, expect } from "bun:test" import { Effect, Exit, Layer, Scope } from "effect" import { AbsolutePath } from "@opencode-ai/core/schema" import { Global } from "@opencode-ai/core/global" import { Reference } from "@opencode-ai/core/reference" import { Repository } from "@opencode-ai/core/repository" import { RepositoryCache } from "@opencode-ai/core/repository-cache" import { EventV2 } from "@opencode-ai/core/event" import { it } from "./lib/effect" const cache = Layer.mock(RepositoryCache.Service, { ensure: () => Effect.die("unexpected Git materialization"), }) describe("Reference", () => { it.effect("registers normalized sources for the owning scope", () => Effect.gen(function* () { const references = yield* Reference.Service const scope = yield* Scope.make() const path = AbsolutePath.make("/docs") const source = new Reference.LocalSource({ type: "local", path, description: "Use for API documentation", hidden: true, }) yield* references.transform((editor) => editor.add("docs", source)).pipe(Scope.provide(scope)) expect(yield* references.list()).toEqual([ new Reference.Info({ name: "docs", path, description: "Use for API documentation", hidden: true, source }), ]) yield* Scope.close(scope, Exit.void) expect(yield* references.list()).toEqual([]) }).pipe( Effect.provide(Reference.layer), Effect.provide(cache), Effect.provide(EventV2.defaultLayer), Effect.provide(Global.defaultLayer), ), ) it.effect("derives Git paths without exposing cache operations", () => Effect.gen(function* () { const references = yield* Reference.Service const repository = Repository.parseRemote("owner/repo") const source = new Reference.GitSource({ type: "git", repository: "owner/repo", branch: "main" }) yield* references.transform((editor) => editor.add("sdk", source)) expect(yield* references.list()).toEqual([ new Reference.Info({ name: "sdk", path: AbsolutePath.make(Repository.cachePath(Global.Path.repos, repository)), source, }), ]) }).pipe( Effect.scoped, Effect.provide(Reference.layer), Effect.provide(cache), Effect.provide(EventV2.defaultLayer), Effect.provide(Global.defaultLayer), ), ) it.effect("preserves configured Git descriptions", () => Effect.gen(function* () { const references = yield* Reference.Service const repository = Repository.parseRemote("owner/repo") const source = new Reference.GitSource({ type: "git", repository: "owner/repo", description: "Use for SDK implementation details", }) yield* references.transform((editor) => editor.add("sdk", source)) expect(yield* references.list()).toEqual([ new Reference.Info({ name: "sdk", path: AbsolutePath.make(Repository.cachePath(Global.Path.repos, repository)), description: "Use for SDK implementation details", source, }), ]) }).pipe( Effect.scoped, Effect.provide(Reference.layer), Effect.provide(cache), Effect.provide(EventV2.defaultLayer), Effect.provide(Global.defaultLayer), ), ) })