mirror of
https://github.com/anomalyco/opencode.git
synced 2026-04-24 23:04:55 +00:00
150 lines
3.6 KiB
TypeScript
150 lines
3.6 KiB
TypeScript
import { describe, expect, test } from "bun:test"
|
|
import { invalidateFromWatcher } from "./watcher"
|
|
|
|
describe("file watcher invalidation", () => {
|
|
test("reloads open files and refreshes loaded parent on add", () => {
|
|
const loads: string[] = []
|
|
const refresh: string[] = []
|
|
invalidateFromWatcher(
|
|
{
|
|
type: "file.watcher.updated",
|
|
properties: {
|
|
file: "src/new.ts",
|
|
event: "add",
|
|
},
|
|
},
|
|
{
|
|
normalize: (input) => input,
|
|
hasFile: (path) => path === "src/new.ts",
|
|
loadFile: (path) => loads.push(path),
|
|
node: () => undefined,
|
|
isDirLoaded: (path) => path === "src",
|
|
refreshDir: (path) => refresh.push(path),
|
|
},
|
|
)
|
|
|
|
expect(loads).toEqual(["src/new.ts"])
|
|
expect(refresh).toEqual(["src"])
|
|
})
|
|
|
|
test("reloads files that are open in tabs", () => {
|
|
const loads: string[] = []
|
|
|
|
invalidateFromWatcher(
|
|
{
|
|
type: "file.watcher.updated",
|
|
properties: {
|
|
file: "src/open.ts",
|
|
event: "change",
|
|
},
|
|
},
|
|
{
|
|
normalize: (input) => input,
|
|
hasFile: () => false,
|
|
isOpen: (path) => path === "src/open.ts",
|
|
loadFile: (path) => loads.push(path),
|
|
node: () => ({
|
|
path: "src/open.ts",
|
|
type: "file",
|
|
name: "open.ts",
|
|
absolute: "/repo/src/open.ts",
|
|
ignored: false,
|
|
}),
|
|
isDirLoaded: () => false,
|
|
refreshDir: () => {},
|
|
},
|
|
)
|
|
|
|
expect(loads).toEqual(["src/open.ts"])
|
|
})
|
|
|
|
test("refreshes only changed loaded directory nodes", () => {
|
|
const refresh: string[] = []
|
|
|
|
invalidateFromWatcher(
|
|
{
|
|
type: "file.watcher.updated",
|
|
properties: {
|
|
file: "src",
|
|
event: "change",
|
|
},
|
|
},
|
|
{
|
|
normalize: (input) => input,
|
|
hasFile: () => false,
|
|
loadFile: () => {},
|
|
node: () => ({ path: "src", type: "directory", name: "src", absolute: "/repo/src", ignored: false }),
|
|
isDirLoaded: (path) => path === "src",
|
|
refreshDir: (path) => refresh.push(path),
|
|
},
|
|
)
|
|
|
|
invalidateFromWatcher(
|
|
{
|
|
type: "file.watcher.updated",
|
|
properties: {
|
|
file: "src/file.ts",
|
|
event: "change",
|
|
},
|
|
},
|
|
{
|
|
normalize: (input) => input,
|
|
hasFile: () => false,
|
|
loadFile: () => {},
|
|
node: () => ({
|
|
path: "src/file.ts",
|
|
type: "file",
|
|
name: "file.ts",
|
|
absolute: "/repo/src/file.ts",
|
|
ignored: false,
|
|
}),
|
|
isDirLoaded: () => true,
|
|
refreshDir: (path) => refresh.push(path),
|
|
},
|
|
)
|
|
|
|
expect(refresh).toEqual(["src"])
|
|
})
|
|
|
|
test("ignores invalid or git watcher updates", () => {
|
|
const refresh: string[] = []
|
|
|
|
invalidateFromWatcher(
|
|
{
|
|
type: "file.watcher.updated",
|
|
properties: {
|
|
file: ".git/index.lock",
|
|
event: "change",
|
|
},
|
|
},
|
|
{
|
|
normalize: (input) => input,
|
|
hasFile: () => true,
|
|
loadFile: () => {
|
|
throw new Error("should not load")
|
|
},
|
|
node: () => undefined,
|
|
isDirLoaded: () => true,
|
|
refreshDir: (path) => refresh.push(path),
|
|
},
|
|
)
|
|
|
|
invalidateFromWatcher(
|
|
{
|
|
type: "project.updated",
|
|
properties: {},
|
|
},
|
|
{
|
|
normalize: (input) => input,
|
|
hasFile: () => false,
|
|
loadFile: () => {},
|
|
node: () => undefined,
|
|
isDirLoaded: () => true,
|
|
refreshDir: (path) => refresh.push(path),
|
|
},
|
|
)
|
|
|
|
expect(refresh).toEqual([])
|
|
})
|
|
})
|