29155ec7bc
- Split 25+ index.ts files into hook.ts + extracted modules - Rename all catch-all utils.ts/helpers.ts to domain-specific names - Split src/tools/lsp/ into ~15 focused modules - Split src/tools/delegate-task/ into ~18 focused modules - Separate shared types from implementation - 155 files changed, 60+ new files created - All typecheck clean, 61 tests pass
161 lines
4.0 KiB
TypeScript
161 lines
4.0 KiB
TypeScript
import { describe, test, expect } from "bun:test"
|
|
import {
|
|
formatSessionList,
|
|
formatSessionMessages,
|
|
formatSessionInfo,
|
|
formatSearchResults,
|
|
filterSessionsByDate,
|
|
searchInSession,
|
|
} from "./session-formatter"
|
|
import type { SessionInfo, SessionMessage, SearchResult } from "./types"
|
|
|
|
describe("session-manager utils", () => {
|
|
test("formatSessionList handles empty array", async () => {
|
|
// given
|
|
const sessions: string[] = []
|
|
|
|
// when
|
|
const result = await formatSessionList(sessions)
|
|
|
|
// then
|
|
expect(result).toContain("No sessions found")
|
|
})
|
|
|
|
test("formatSessionMessages handles empty array", () => {
|
|
// given
|
|
const messages: SessionMessage[] = []
|
|
|
|
// when
|
|
const result = formatSessionMessages(messages)
|
|
|
|
// then
|
|
expect(result).toContain("No messages")
|
|
})
|
|
|
|
test("formatSessionMessages includes message content", () => {
|
|
// given
|
|
const messages: SessionMessage[] = [
|
|
{
|
|
id: "msg_001",
|
|
role: "user",
|
|
time: { created: Date.now() },
|
|
parts: [{ id: "prt_001", type: "text", text: "Hello world" }],
|
|
},
|
|
]
|
|
|
|
// when
|
|
const result = formatSessionMessages(messages)
|
|
|
|
// then
|
|
expect(result).toContain("user")
|
|
expect(result).toContain("Hello world")
|
|
})
|
|
|
|
test("formatSessionMessages includes todos when requested", () => {
|
|
// given
|
|
const messages: SessionMessage[] = [
|
|
{
|
|
id: "msg_001",
|
|
role: "user",
|
|
time: { created: Date.now() },
|
|
parts: [{ id: "prt_001", type: "text", text: "Test" }],
|
|
},
|
|
]
|
|
const todos = [
|
|
{ id: "1", content: "Task 1", status: "completed" as const },
|
|
{ id: "2", content: "Task 2", status: "pending" as const },
|
|
]
|
|
|
|
// when
|
|
const result = formatSessionMessages(messages, true, todos)
|
|
|
|
// then
|
|
expect(result).toContain("Todos")
|
|
expect(result).toContain("Task 1")
|
|
expect(result).toContain("Task 2")
|
|
})
|
|
|
|
test("formatSessionInfo includes all metadata", () => {
|
|
// given
|
|
const info: SessionInfo = {
|
|
id: "ses_test123",
|
|
message_count: 42,
|
|
first_message: new Date("2025-12-20T10:00:00Z"),
|
|
last_message: new Date("2025-12-24T15:00:00Z"),
|
|
agents_used: ["build", "oracle"],
|
|
has_todos: true,
|
|
has_transcript: true,
|
|
todos: [{ id: "1", content: "Test", status: "pending" }],
|
|
transcript_entries: 123,
|
|
}
|
|
|
|
// when
|
|
const result = formatSessionInfo(info)
|
|
|
|
// then
|
|
expect(result).toContain("ses_test123")
|
|
expect(result).toContain("42")
|
|
expect(result).toContain("build, oracle")
|
|
expect(result).toContain("Duration")
|
|
})
|
|
|
|
test("formatSearchResults handles empty array", () => {
|
|
// given
|
|
const results: SearchResult[] = []
|
|
|
|
// when
|
|
const result = formatSearchResults(results)
|
|
|
|
// then
|
|
expect(result).toContain("No matches")
|
|
})
|
|
|
|
test("formatSearchResults formats matches correctly", () => {
|
|
// given
|
|
const results: SearchResult[] = [
|
|
{
|
|
session_id: "ses_test123",
|
|
message_id: "msg_001",
|
|
role: "user",
|
|
excerpt: "...example text...",
|
|
match_count: 3,
|
|
timestamp: Date.now(),
|
|
},
|
|
]
|
|
|
|
// when
|
|
const result = formatSearchResults(results)
|
|
|
|
// then
|
|
expect(result).toContain("Found 1 matches")
|
|
expect(result).toContain("ses_test123")
|
|
expect(result).toContain("msg_001")
|
|
expect(result).toContain("example text")
|
|
expect(result).toContain("Matches: 3")
|
|
})
|
|
|
|
test("filterSessionsByDate filters correctly", async () => {
|
|
// given
|
|
const sessionIDs = ["ses_001", "ses_002", "ses_003"]
|
|
|
|
// when
|
|
const result = await filterSessionsByDate(sessionIDs)
|
|
|
|
// then
|
|
expect(Array.isArray(result)).toBe(true)
|
|
})
|
|
|
|
test("searchInSession finds matches case-insensitively", async () => {
|
|
// given
|
|
const sessionID = "ses_nonexistent"
|
|
const query = "test"
|
|
|
|
// when
|
|
const results = await searchInSession(sessionID, query, false)
|
|
|
|
// then
|
|
expect(Array.isArray(results)).toBe(true)
|
|
expect(results.length).toBe(0)
|
|
})
|
|
})
|