90 lines
2.5 KiB
TypeScript
90 lines
2.5 KiB
TypeScript
import { describe, expect, test } from "bun:test"
|
|
import type { Message, Part, SessionStatus, Todo, PermissionRequest, QuestionRequest } from "@opencode-ai/sdk/v2"
|
|
import { dropSessionCache, pickSessionCacheEvictions } from "../../../src/cli/cmd/tui/context/sync-cache"
|
|
|
|
const msg = (id: string, sessionID: string) =>
|
|
({
|
|
id,
|
|
sessionID,
|
|
role: "user",
|
|
time: { created: 1 },
|
|
agent: "build",
|
|
model: { providerID: "openai", modelID: "gpt-4o-mini" },
|
|
}) as Message
|
|
|
|
const part = (id: string, sessionID: string, messageID: string) =>
|
|
({
|
|
id,
|
|
sessionID,
|
|
messageID,
|
|
type: "text",
|
|
text: id,
|
|
}) as Part
|
|
|
|
describe("tui sync cache", () => {
|
|
test("dropSessionCache clears session scoped maps and related parts", () => {
|
|
const m = msg("msg_1", "ses_1")
|
|
const store = {
|
|
session_status: { ses_1: { type: "busy" } as SessionStatus },
|
|
session_diff: { ses_1: [] },
|
|
todo: { ses_1: [] as Todo[] },
|
|
message: { ses_1: [m] },
|
|
part: { [m.id]: [part("prt_1", "ses_1", m.id)] },
|
|
permission: { ses_1: [] as PermissionRequest[] },
|
|
question: { ses_1: [] as QuestionRequest[] },
|
|
}
|
|
|
|
dropSessionCache(store, "ses_1")
|
|
|
|
expect(store.message.ses_1).toBeUndefined()
|
|
expect(store.part[m.id]).toBeUndefined()
|
|
expect(store.todo.ses_1).toBeUndefined()
|
|
expect(store.session_diff.ses_1).toBeUndefined()
|
|
expect(store.session_status.ses_1).toBeUndefined()
|
|
expect(store.permission.ses_1).toBeUndefined()
|
|
expect(store.question.ses_1).toBeUndefined()
|
|
})
|
|
|
|
test("dropSessionCache clears orphaned parts without message rows", () => {
|
|
const store = {
|
|
session_status: {},
|
|
session_diff: {},
|
|
todo: {},
|
|
message: {},
|
|
part: { msg_1: [part("prt_1", "ses_1", "msg_1")] },
|
|
permission: {},
|
|
question: {},
|
|
}
|
|
|
|
dropSessionCache(store, "ses_1")
|
|
|
|
expect(store.part.msg_1).toBeUndefined()
|
|
})
|
|
|
|
test("pickSessionCacheEvictions evicts oldest cached sessions", () => {
|
|
const seen = new Set(["ses_1", "ses_2", "ses_3"])
|
|
|
|
const stale = pickSessionCacheEvictions({
|
|
seen,
|
|
keep: "ses_4",
|
|
limit: 2,
|
|
})
|
|
|
|
expect(stale).toEqual(["ses_1", "ses_2"])
|
|
expect([...seen]).toEqual(["ses_3", "ses_4"])
|
|
})
|
|
|
|
test("pickSessionCacheEvictions refreshes recency for revisited sessions", () => {
|
|
const seen = new Set(["ses_1", "ses_2", "ses_3"])
|
|
|
|
const stale = pickSessionCacheEvictions({
|
|
seen,
|
|
keep: "ses_2",
|
|
limit: 3,
|
|
})
|
|
|
|
expect(stale).toEqual([])
|
|
expect([...seen]).toEqual(["ses_1", "ses_3", "ses_2"])
|
|
})
|
|
})
|