import { describe, expect } from "bun:test" import { Effect, Layer } from "effect" import { AppNodeBuilder } from "@opencode-ai/core/effect/app-node-builder" import { LayerNode } from "@opencode-ai/core/effect/layer-node" import { Database } from "@opencode-ai/core/database/database" import { EventV2 } from "@opencode-ai/core/event" import { Location } from "@opencode-ai/core/location" import { ProjectV2 } from "@opencode-ai/core/project" import { AbsolutePath } from "@opencode-ai/core/schema" import { SessionV2 } from "@opencode-ai/core/session" import { SessionExecution } from "@opencode-ai/core/session/execution" import { SessionProjector } from "@opencode-ai/core/session/projector" import { SessionStore } from "@opencode-ai/core/session/store" import { testEffect } from "./lib/effect" const projects = Layer.succeed( ProjectV2.Service, ProjectV2.Service.of({ list: () => Effect.succeed([]), resolve: (directory) => Effect.succeed({ id: ProjectV2.ID.global, directory }), directories: () => Effect.succeed([]), commit: () => Effect.void, }), ) const it = testEffect( AppNodeBuilder.build( LayerNode.group([Database.node, EventV2.node, SessionProjector.node, SessionStore.node, SessionV2.node]), [ [ProjectV2.node, projects], [SessionExecution.node, SessionExecution.noopLayer], ], ), ) const location = Location.Ref.make({ directory: AbsolutePath.make("/project") }) describe("SessionV2.remove", () => { it.effect("removes a session and its children", () => Effect.gen(function* () { const session = yield* SessionV2.Service const parent = yield* session.create({ location }) const child = yield* session.create({ parentID: parent.id }) yield* session.remove(parent.id) expect((yield* session.list()).data).toEqual([]) expect(yield* Effect.result(session.get(parent.id))).toMatchObject({ _tag: "Failure" }) expect(yield* Effect.result(session.get(child.id))).toMatchObject({ _tag: "Failure" }) }), ) it.effect("fails when the session does not exist", () => Effect.gen(function* () { const session = yield* SessionV2.Service const sessionID = SessionV2.ID.make("ses_missing") expect(yield* Effect.result(session.remove(sessionID))).toMatchObject({ _tag: "Failure", failure: { _tag: "Session.NotFoundError", sessionID }, }) }), ) })