137 lines
3.5 KiB
TypeScript
137 lines
3.5 KiB
TypeScript
import { describe, expect, test } from "bun:test"
|
|
import {
|
|
canDisposeDirectory,
|
|
estimateRootSessionTotal,
|
|
loadRootSessionsWithFallback,
|
|
pickDirectoriesToEvict,
|
|
} from "./global-sync"
|
|
|
|
describe("pickDirectoriesToEvict", () => {
|
|
test("keeps pinned stores and evicts idle stores", () => {
|
|
const now = 5_000
|
|
const picks = pickDirectoriesToEvict({
|
|
stores: ["a", "b", "c", "d"],
|
|
state: new Map([
|
|
["a", { lastAccessAt: 1_000 }],
|
|
["b", { lastAccessAt: 4_900 }],
|
|
["c", { lastAccessAt: 4_800 }],
|
|
["d", { lastAccessAt: 3_000 }],
|
|
]),
|
|
pins: new Set(["a"]),
|
|
max: 2,
|
|
ttl: 1_500,
|
|
now,
|
|
})
|
|
|
|
expect(picks).toEqual(["d", "c"])
|
|
})
|
|
})
|
|
|
|
describe("loadRootSessionsWithFallback", () => {
|
|
test("uses limited roots query when supported", async () => {
|
|
const calls: Array<{ directory: string; roots: true; limit?: number }> = []
|
|
let fallback = 0
|
|
|
|
const result = await loadRootSessionsWithFallback({
|
|
directory: "dir",
|
|
limit: 10,
|
|
list: async (query) => {
|
|
calls.push(query)
|
|
return { data: [] }
|
|
},
|
|
onFallback: () => {
|
|
fallback += 1
|
|
},
|
|
})
|
|
|
|
expect(result.data).toEqual([])
|
|
expect(result.limited).toBe(true)
|
|
expect(calls).toEqual([{ directory: "dir", roots: true, limit: 10 }])
|
|
expect(fallback).toBe(0)
|
|
})
|
|
|
|
test("falls back to full roots query on limited-query failure", async () => {
|
|
const calls: Array<{ directory: string; roots: true; limit?: number }> = []
|
|
let fallback = 0
|
|
|
|
const result = await loadRootSessionsWithFallback({
|
|
directory: "dir",
|
|
limit: 25,
|
|
list: async (query) => {
|
|
calls.push(query)
|
|
if (query.limit) throw new Error("unsupported")
|
|
return { data: [] }
|
|
},
|
|
onFallback: () => {
|
|
fallback += 1
|
|
},
|
|
})
|
|
|
|
expect(result.data).toEqual([])
|
|
expect(result.limited).toBe(false)
|
|
expect(calls).toEqual([
|
|
{ directory: "dir", roots: true, limit: 25 },
|
|
{ directory: "dir", roots: true },
|
|
])
|
|
expect(fallback).toBe(1)
|
|
})
|
|
})
|
|
|
|
describe("estimateRootSessionTotal", () => {
|
|
test("keeps exact total for full fetches", () => {
|
|
expect(estimateRootSessionTotal({ count: 42, limit: 10, limited: false })).toBe(42)
|
|
})
|
|
|
|
test("marks has-more for full-limit limited fetches", () => {
|
|
expect(estimateRootSessionTotal({ count: 10, limit: 10, limited: true })).toBe(11)
|
|
})
|
|
|
|
test("keeps exact total when limited fetch is under limit", () => {
|
|
expect(estimateRootSessionTotal({ count: 9, limit: 10, limited: true })).toBe(9)
|
|
})
|
|
})
|
|
|
|
describe("canDisposeDirectory", () => {
|
|
test("rejects pinned or inflight directories", () => {
|
|
expect(
|
|
canDisposeDirectory({
|
|
directory: "dir",
|
|
hasStore: true,
|
|
pinned: true,
|
|
booting: false,
|
|
loadingSessions: false,
|
|
}),
|
|
).toBe(false)
|
|
expect(
|
|
canDisposeDirectory({
|
|
directory: "dir",
|
|
hasStore: true,
|
|
pinned: false,
|
|
booting: true,
|
|
loadingSessions: false,
|
|
}),
|
|
).toBe(false)
|
|
expect(
|
|
canDisposeDirectory({
|
|
directory: "dir",
|
|
hasStore: true,
|
|
pinned: false,
|
|
booting: false,
|
|
loadingSessions: true,
|
|
}),
|
|
).toBe(false)
|
|
})
|
|
|
|
test("accepts idle unpinned directory store", () => {
|
|
expect(
|
|
canDisposeDirectory({
|
|
directory: "dir",
|
|
hasStore: true,
|
|
pinned: false,
|
|
booting: false,
|
|
loadingSessions: false,
|
|
}),
|
|
).toBe(true)
|
|
})
|
|
})
|