| 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([]) |
| }) |
| }) |
|
|