import { afterEach, describe, expect, test } from "bun:test" import { Effect } from "effect" import { Session as SessionNs } from "../../src/session" import type { SessionID } from "../../src/session/schema" import { Log } from "../../src/util/log" import { Instance } from "../../src/project/instance" import { Server } from "../../src/server/server" import { tmpdir } from "../fixture/fixture" Log.init({ print: false }) function run(fx: Effect.Effect) { return Effect.runPromise(fx.pipe(Effect.provide(SessionNs.defaultLayer))) } const svc = { ...SessionNs, create(input?: SessionNs.CreateInput) { return run(SessionNs.Service.use((svc) => svc.create(input))) }, remove(id: SessionID) { return run(SessionNs.Service.use((svc) => svc.remove(id))) }, } afterEach(async () => { await Instance.disposeAll() }) describe("tui.selectSession endpoint", () => { test("should return 200 when called with valid session", async () => { await using tmp = await tmpdir({ git: true }) await Instance.provide({ directory: tmp.path, fn: async () => { // #given const session = await svc.create({}) // #when const app = Server.Default().app const response = await app.request("/tui/select-session", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ sessionID: session.id }), }) // #then expect(response.status).toBe(200) const body = await response.json() expect(body).toBe(true) await svc.remove(session.id) }, }) }) test("should return 404 when session does not exist", async () => { await using tmp = await tmpdir({ git: true }) await Instance.provide({ directory: tmp.path, fn: async () => { // #given const nonExistentSessionID = "ses_nonexistent123" // #when const app = Server.Default().app const response = await app.request("/tui/select-session", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ sessionID: nonExistentSessionID }), }) // #then expect(response.status).toBe(404) }, }) }) test("should return 400 when session ID format is invalid", async () => { await using tmp = await tmpdir({ git: true }) await Instance.provide({ directory: tmp.path, fn: async () => { // #given const invalidSessionID = "invalid_session_id" // #when const app = Server.Default().app const response = await app.request("/tui/select-session", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ sessionID: invalidSessionID }), }) // #then expect(response.status).toBe(400) }, }) }) })