| import { describe, expect, test } from "bun:test" |
| import { fetchSessionExport, sessionExportFilename } from "./session-export" |
| import type { Message, Part, Session } from "@opencode-ai/sdk/v2/client" |
|
|
| describe("sessionExportFilename", () => { |
| test("generates filename from title", () => { |
| expect(sessionExportFilename({ id: "ses_123", title: "Clone PR in worktree from fork" })).toBe( |
| "clone-pr-in-worktree-from-fork.json", |
| ) |
| }) |
|
|
| test("generates filename from slug when title missing", () => { |
| expect(sessionExportFilename({ id: "ses_123", slug: "my-session-slug" })).toBe("my-session-slug.json") |
| }) |
|
|
| test("falls back to id when title and slug are empty", () => { |
| expect(sessionExportFilename({ id: "ses_123" })).toBe("ses_123.json") |
| }) |
| }) |
|
|
| describe("fetchSessionExport", () => { |
| test("fetches full transcript from client", async () => { |
| const session = { id: "ses_1", title: "Test Session" } as Session |
| const msg = { id: "msg_1", role: "user" } as Message |
| const part = { id: "prt_1", type: "text", text: "hello" } as Part |
| const messages = [{ info: msg, parts: [part] }] |
|
|
| const client = { |
| session: { |
| get: async () => ({ data: session }), |
| messages: async () => ({ data: messages }), |
| }, |
| } |
|
|
| const result = await fetchSessionExport({ |
| sessionID: "ses_1", |
| client, |
| }) |
|
|
| expect(result).toEqual({ |
| info: session, |
| messages, |
| }) |
| }) |
|
|
| test("throws when session not found", async () => { |
| const client = { |
| session: { |
| get: async () => ({ data: null }), |
| messages: async () => ({ data: [] }), |
| }, |
| } |
|
|
| expect( |
| fetchSessionExport({ |
| sessionID: "ses_missing", |
| client, |
| }), |
| ).rejects.toThrow("Session not found: ses_missing") |
| }) |
| }) |
|
|