79 lines
2.8 KiB
TypeScript
79 lines
2.8 KiB
TypeScript
import { beforeAll, describe, expect, mock, test } from "bun:test"
|
|
|
|
let shouldListRoot: typeof import("./file-tree").shouldListRoot
|
|
let shouldListExpanded: typeof import("./file-tree").shouldListExpanded
|
|
let dirsToExpand: typeof import("./file-tree").dirsToExpand
|
|
|
|
beforeAll(async () => {
|
|
mock.module("@solidjs/router", () => ({
|
|
useNavigate: () => () => undefined,
|
|
useParams: () => ({}),
|
|
}))
|
|
mock.module("@/context/file", () => ({
|
|
useFile: () => ({
|
|
tree: {
|
|
state: () => undefined,
|
|
list: () => Promise.resolve(),
|
|
children: () => [],
|
|
expand: () => {},
|
|
collapse: () => {},
|
|
},
|
|
}),
|
|
}))
|
|
mock.module("@opencode-ai/ui/collapsible", () => ({
|
|
Collapsible: {
|
|
Trigger: (props: { children?: unknown }) => props.children,
|
|
Content: (props: { children?: unknown }) => props.children,
|
|
},
|
|
}))
|
|
mock.module("@opencode-ai/ui/file-icon", () => ({ FileIcon: () => null }))
|
|
mock.module("@opencode-ai/ui/icon", () => ({ Icon: () => null }))
|
|
mock.module("@opencode-ai/ui/tooltip", () => ({ Tooltip: (props: { children?: unknown }) => props.children }))
|
|
const mod = await import("./file-tree")
|
|
shouldListRoot = mod.shouldListRoot
|
|
shouldListExpanded = mod.shouldListExpanded
|
|
dirsToExpand = mod.dirsToExpand
|
|
})
|
|
|
|
describe("file tree fetch discipline", () => {
|
|
test("root lists on mount unless already loaded or loading", () => {
|
|
expect(shouldListRoot({ level: 0 })).toBe(true)
|
|
expect(shouldListRoot({ level: 0, dir: { loaded: true } })).toBe(false)
|
|
expect(shouldListRoot({ level: 0, dir: { loading: true } })).toBe(false)
|
|
expect(shouldListRoot({ level: 1 })).toBe(false)
|
|
})
|
|
|
|
test("nested dirs list only when expanded and stale", () => {
|
|
expect(shouldListExpanded({ level: 1 })).toBe(false)
|
|
expect(shouldListExpanded({ level: 1, dir: { expanded: false } })).toBe(false)
|
|
expect(shouldListExpanded({ level: 1, dir: { expanded: true } })).toBe(true)
|
|
expect(shouldListExpanded({ level: 1, dir: { expanded: true, loaded: true } })).toBe(false)
|
|
expect(shouldListExpanded({ level: 1, dir: { expanded: true, loading: true } })).toBe(false)
|
|
expect(shouldListExpanded({ level: 0, dir: { expanded: true } })).toBe(false)
|
|
})
|
|
|
|
test("allowed auto-expand picks only collapsed dirs", () => {
|
|
const expanded = new Set<string>()
|
|
const filter = { dirs: new Set(["src", "src/components"]) }
|
|
|
|
const first = dirsToExpand({
|
|
level: 0,
|
|
filter,
|
|
expanded: (dir) => expanded.has(dir),
|
|
})
|
|
|
|
expect(first).toEqual(["src", "src/components"])
|
|
|
|
for (const dir of first) expanded.add(dir)
|
|
|
|
const second = dirsToExpand({
|
|
level: 0,
|
|
filter,
|
|
expanded: (dir) => expanded.has(dir),
|
|
})
|
|
|
|
expect(second).toEqual([])
|
|
expect(dirsToExpand({ level: 1, filter, expanded: () => false })).toEqual([])
|
|
})
|
|
})
|