summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/components/file-tree.test.ts
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-06 09:37:49 -0600
committerGitHub <[email protected]>2026-02-06 09:37:49 -0600
commita4bc883595df9ea0f752079519081bc602408553 (patch)
tree583f21642f431899abe1dfb1f6bd9b2c01dc0206 /packages/app/src/components/file-tree.test.ts
parentc07077f96c0019b2e18e0e8e1e0383deda08b3e6 (diff)
downloadopencode-a4bc883595df9ea0f752079519081bc602408553.tar.gz
opencode-a4bc883595df9ea0f752079519081bc602408553.zip
chore: refactoring and tests (#12468)
Diffstat (limited to 'packages/app/src/components/file-tree.test.ts')
-rw-r--r--packages/app/src/components/file-tree.test.ts77
1 files changed, 77 insertions, 0 deletions
diff --git a/packages/app/src/components/file-tree.test.ts b/packages/app/src/components/file-tree.test.ts
new file mode 100644
index 000000000..eb048e29e
--- /dev/null
+++ b/packages/app/src/components/file-tree.test.ts
@@ -0,0 +1,77 @@
+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", () => ({
+ 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([])
+ })
+})