69 lines · 2.3 KB · TypeScript
RawDownload
import type { FileDiffMetadata } from "@pierre/diffs";import { describe, expect, it } from "vite-plus/test"; import {  buildDiffFileTreeUpdates,  collectDirectoryPaths,  diffFileTreeEntries,} from "./diffFileTree.logic"; function file(type: FileDiffMetadata["type"], name: string, prevName = name): FileDiffMetadata {  return { type, name: `b/${name}`, prevName: `a/${prevName}` } as FileDiffMetadata;} describe("diffFileTreeEntries", () => {  it("maps each change type to its git status under the file's current path", () => {    expect(      diffFileTreeEntries([        file("new", "src/a.ts"),        file("deleted", "src/b.ts"),        file("rename-pure", "src/c.ts", "src/old-c.ts"),        file("rename-changed", "src/d.ts", "src/old-d.ts"),        file("change", "README.md"),      ]),    ).toEqual([      { path: "src/a.ts", status: "added" },      { path: "src/b.ts", status: "deleted" },      { path: "src/c.ts", status: "renamed" },      { path: "src/d.ts", status: "renamed" },      { path: "README.md", status: "modified" },    ]);  });}); describe("collectDirectoryPaths", () => {  it("lists every ancestor once, parents first, with Pierre's trailing slash", () => {    expect(collectDirectoryPaths(["apps/web/src/a.ts", "apps/web/b.ts", "README.md"])).toEqual([      "apps/",      "apps/web/",      "apps/web/src/",    ]);  });}); describe("buildDiffFileTreeUpdates", () => {  it("adds a new file's directories before the file", () => {    expect(buildDiffFileTreeUpdates(["README.md"], ["README.md", "src/lib/a.ts"])).toEqual([      { type: "add", path: "src/" },      { type: "add", path: "src/lib/" },      { type: "add", path: "src/lib/a.ts" },    ]);  });   it("removes files before their now-empty directories, deepest first", () => {    expect(buildDiffFileTreeUpdates(["src/lib/a.ts", "src/b.ts"], ["src/b.ts"])).toEqual([      { type: "remove", path: "src/lib/a.ts" },      { type: "remove", path: "src/lib/", recursive: true },    ]);  });   it("keeps a directory that still holds a file", () => {    expect(buildDiffFileTreeUpdates(["src/a.ts", "src/b.ts"], ["src/b.ts"])).toEqual([      { type: "remove", path: "src/a.ts" },    ]);  });   it("produces nothing when the paths are unchanged", () => {    expect(buildDiffFileTreeUpdates(["src/a.ts"], ["src/a.ts"])).toEqual([]);  });});