61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
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")
|
|
})
|
|
})
|