117 lines · 5.1 KB · TypeScript
RawDownload
import { describe, expect, it } from "vite-plus/test"; import {  appendBrowsePathSegment,  canNavigateUp,  getBrowseDirectoryPath,  findProjectByPath,  getBrowseLeafPathSegment,  getBrowseParentPath,  hasTrailingPathSeparator,  inferProjectTitleFromPath,  isExplicitRelativeProjectPath,  isFilesystemBrowseQuery,  normalizeProjectPathForComparison,  normalizeProjectPathForDispatch,  isUnsupportedWindowsProjectPath,  resolveProjectPathForDispatch,} from "./projectPaths"; describe("projectPaths", () => {  it("normalizes trailing separators for dispatch and comparison", () => {    expect(normalizeProjectPathForDispatch(" /repo/app/ ")).toBe("/repo/app");    expect(normalizeProjectPathForComparison("/repo/app/")).toBe("/repo/app");  });   it("normalizes windows-style paths for comparison", () => {    expect(normalizeProjectPathForComparison("C:/Work/Repo/")).toBe("c:\\work\\repo");    expect(normalizeProjectPathForComparison("C:\\Work\\Repo\\")).toBe("c:\\work\\repo");  });   it("finds existing projects even when the input formatting differs", () => {    const existing = findProjectByPath(      [        { id: "project-1", cwd: "/repo/app" },        { id: "project-2", cwd: "C:\\Work\\Repo" },      ],      "C:/Work/Repo/",    );     expect(existing?.id).toBe("project-2");  });   it("infers project titles from normalized paths", () => {    expect(inferProjectTitleFromPath("/repo/app/")).toBe("app");    expect(inferProjectTitleFromPath("C:\\Work\\Repo\\")).toBe("Repo");    expect(inferProjectTitleFromPath("/home/user\\project/")).toBe("user\\project");  });   it("detects browse queries across supported path styles", () => {    expect(isFilesystemBrowseQuery(".")).toBe(false);    expect(isFilesystemBrowseQuery("..")).toBe(false);    expect(isFilesystemBrowseQuery("./")).toBe(true);    expect(isFilesystemBrowseQuery("../")).toBe(true);    expect(isFilesystemBrowseQuery("~/projects")).toBe(true);    expect(isFilesystemBrowseQuery("..\\docs")).toBe(true);    expect(isFilesystemBrowseQuery("notes")).toBe(false);  });   it("only treats windows-style paths as browse queries on windows", () => {    expect(isFilesystemBrowseQuery("C:\\Work\\Repo\\", "MacIntel")).toBe(false);    expect(isFilesystemBrowseQuery("C:\\Work\\Repo\\", "Win32")).toBe(true);    expect(isUnsupportedWindowsProjectPath("C:\\Work\\Repo\\", "MacIntel")).toBe(true);    expect(isUnsupportedWindowsProjectPath("C:\\Work\\Repo\\", "Win32")).toBe(false);  });   it("detects explicit relative project paths", () => {    expect(isExplicitRelativeProjectPath(".")).toBe(true);    expect(isExplicitRelativeProjectPath("..")).toBe(true);    expect(isExplicitRelativeProjectPath("./docs")).toBe(true);    expect(isExplicitRelativeProjectPath("..\\docs")).toBe(true);    expect(isExplicitRelativeProjectPath("/repo/docs")).toBe(false);  });   it("resolves explicit relative paths against the current project", () => {    expect(resolveProjectPathForDispatch(".", "/repo/app")).toBe("/repo/app");    expect(resolveProjectPathForDispatch("..", "/repo/app")).toBe("/repo");    expect(resolveProjectPathForDispatch("./docs", "/repo/app")).toBe("/repo/app/docs");    expect(resolveProjectPathForDispatch("../docs", "/repo/app")).toBe("/repo/docs");    expect(resolveProjectPathForDispatch("./Repo", "C:\\Work")).toBe("C:\\Work\\Repo");    expect(resolveProjectPathForDispatch("./docs", "/home/user\\project")).toBe(      "/home/user\\project/docs",    );  });   it("navigates browse paths with matching separators", () => {    expect(appendBrowsePathSegment("/repo/", "src")).toBe("/repo/src/");    expect(appendBrowsePathSegment("C:\\Work\\", "Repo")).toBe("C:\\Work\\Repo\\");    expect(appendBrowsePathSegment("/home/user\\project/", "docs")).toBe(      "/home/user\\project/docs/",    );    expect(getBrowseParentPath("/repo/src/")).toBe("/repo/");    expect(getBrowseParentPath("C:\\Work\\Repo\\")).toBe("C:\\Work\\");    expect(getBrowseParentPath("\\\\server\\share\\")).toBeNull();    expect(getBrowseParentPath("\\\\server\\share\\repo\\")).toBe("\\\\server\\share\\");    expect(getBrowseParentPath("C:\\")).toBeNull();    expect(getBrowseParentPath("/home/user\\project/docs/")).toBe("/home/user\\project/");  });   it("detects browse path boundaries", () => {    expect(hasTrailingPathSeparator("/repo/src/")).toBe(true);    expect(hasTrailingPathSeparator("/repo/src")).toBe(false);    expect(getBrowseDirectoryPath("/repo/src")).toBe("/repo/");    expect(getBrowseDirectoryPath("/repo/src/")).toBe("/repo/src/");    expect(getBrowseLeafPathSegment("/repo/src")).toBe("src");    expect(getBrowseLeafPathSegment("C:\\Work\\Repo\\Docs")).toBe("Docs");    expect(getBrowseDirectoryPath("/home/user\\project/docs")).toBe("/home/user\\project/");    expect(getBrowseLeafPathSegment("/home/user\\project/docs")).toBe("docs");  });   it("only allows browse-up after entering a directory", () => {    expect(canNavigateUp("~/repo")).toBe(false);    expect(canNavigateUp("~/a")).toBe(false);    expect(canNavigateUp("~/repo/")).toBe(true);    expect(canNavigateUp("\\\\server\\share\\")).toBe(false);    expect(canNavigateUp("\\\\server\\share\\repo\\")).toBe(true);  });});