Files
openchamber/packages/ui/src/sync/global-session-status.test.ts
T

75 lines
2.9 KiB
TypeScript
Raw Normal View History

import { beforeEach, describe, expect, test } from "bun:test"
import type { Event } from "@opencode-ai/sdk/v2/client"
import {
applyGlobalSessionStatusEvent,
applyGlobalSessionStatusSnapshot,
useGlobalSessionStatusStore,
} from "./global-session-status"
import { resetSessionOrdering, useSessionOrderingStore } from "./session-ordering"
beforeEach(() => {
useGlobalSessionStatusStore.setState({ statusById: new Map() })
resetSessionOrdering()
})
describe("global session status index", () => {
test("preserves full retry status details from live events", () => {
applyGlobalSessionStatusEvent("/repo", {
type: "session.status",
properties: {
sessionID: "session-a",
status: { type: "retry", attempt: 2, message: "waiting" },
},
} as Event)
expect(useGlobalSessionStatusStore.getState().statusById.get("session-a")?.status).toEqual({
type: "retry",
attempt: 2,
message: "waiting",
})
})
test("promotes on active and settled lifecycle edges only", () => {
applyGlobalSessionStatusEvent("/repo", {
type: "session.status",
properties: { sessionID: "session-a", status: { type: "busy" } },
} as Event)
const busyRank = useSessionOrderingStore.getState().rankById.get("session-a")
applyGlobalSessionStatusEvent("/repo", {
type: "session.status",
properties: { sessionID: "session-a", status: { type: "retry", attempt: 1, message: "wait", next: 1 } },
} as Event)
expect(useSessionOrderingStore.getState().rankById.get("session-a")).toBe(busyRank)
applyGlobalSessionStatusEvent("/repo", {
type: "session.idle",
properties: { sessionID: "session-a" },
} as Event)
const idleRank = useSessionOrderingStore.getState().rankById.get("session-a")
expect(idleRank).toBeGreaterThan(busyRank ?? 0)
applyGlobalSessionStatusEvent("/repo", {
type: "session.error",
properties: { sessionID: "session-a" },
} as Event)
expect(useSessionOrderingStore.getState().rankById.get("session-a")).toBe(idleRank)
})
test("authoritative snapshots clear absent active entries for their directory", () => {
applyGlobalSessionStatusSnapshot("/repo", { "session-a": { type: "busy" } }, ["session-a"])
expect(useGlobalSessionStatusStore.getState().statusById.get("session-a")?.status.type).toBe("busy")
applyGlobalSessionStatusSnapshot("/repo", {}, ["session-a"])
expect(useGlobalSessionStatusStore.getState().statusById.has("session-a")).toBe(false)
})
test("clears an explicitly idle known session when directory aliases differ", () => {
applyGlobalSessionStatusSnapshot("/canonical/repo", { "session-a": { type: "busy" } }, ["session-a"])
applyGlobalSessionStatusSnapshot("/alias/repo", { "session-a": { type: "idle" } }, ["session-a"])
expect(useGlobalSessionStatusStore.getState().statusById.has("session-a")).toBe(false)
})
})