From 3270619f245e2c67346fb1ba45ac8019a8a91193 Mon Sep 17 00:00:00 2001 From: Marc Kassubeck Date: Mon, 25 May 2026 10:06:54 +0200 Subject: [PATCH] test: make server tests pass on Windows --- src/server/piWebPluginService.test.ts | 2 +- src/server/storage/projectStore.test.ts | 6 +++--- src/server/workspaces/fileTreeService.test.ts | 18 ++++++++++++++++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/server/piWebPluginService.test.ts b/src/server/piWebPluginService.test.ts index 42d7d9e..b709be9 100644 --- a/src/server/piWebPluginService.test.ts +++ b/src/server/piWebPluginService.test.ts @@ -78,7 +78,7 @@ describe("PiWebPluginService", () => { files: { "pi-web-plugin.js": "export default { apiVersion: 1, name: 'Dev', activate: () => ({ contributions: {} }) };" }, }); await mkdir(join(tempDir, "plugins"), { recursive: true }); - await symlink(pluginDir, join(tempDir, "plugins", "dev"), "dir"); + await symlink(pluginDir, join(tempDir, "plugins", "dev"), process.platform === "win32" ? "junction" : "dir"); const service = new PiWebPluginService({ roots: [{ path: join(tempDir, "plugins"), source: "test", scope: "local" }], packageProvider: false }); diff --git a/src/server/storage/projectStore.test.ts b/src/server/storage/projectStore.test.ts index 9a7bbbb..50e73fc 100644 --- a/src/server/storage/projectStore.test.ts +++ b/src/server/storage/projectStore.test.ts @@ -1,13 +1,13 @@ -import { join } from "node:path"; +import { resolve } from "node:path"; import { describe, expect, it } from "vitest"; import { projectStorePath } from "./projectStore.js"; describe("projectStorePath", () => { it("uses PI_WEB_DATA_DIR by default", () => { - expect(projectStorePath({ PI_WEB_DATA_DIR: "demo-data" }, "/tmp/pi-web")).toBe(join("/tmp/pi-web", "demo-data", "projects.json")); + expect(projectStorePath({ PI_WEB_DATA_DIR: "demo-data" }, "/tmp/pi-web")).toBe(resolve("/tmp/pi-web", "demo-data", "projects.json")); }); it("uses PI_WEB_PROJECTS_FILE when configured", () => { - expect(projectStorePath({ PI_WEB_PROJECTS_FILE: "demo/projects.json" }, "/tmp/pi-web")).toBe(join("/tmp/pi-web", "demo/projects.json")); + expect(projectStorePath({ PI_WEB_PROJECTS_FILE: "demo/projects.json" }, "/tmp/pi-web")).toBe(resolve("/tmp/pi-web", "demo/projects.json")); }); }); diff --git a/src/server/workspaces/fileTreeService.test.ts b/src/server/workspaces/fileTreeService.test.ts index f5d9f18..1e213c8 100644 --- a/src/server/workspaces/fileTreeService.test.ts +++ b/src/server/workspaces/fileTreeService.test.ts @@ -25,7 +25,7 @@ describe("listWorkspaceTree", () => { await mkdir(join(root, "node_modules")); await writeFile(join(root, "b.txt"), "b"); await writeFile(join(root, "a.txt"), "a"); - await symlink(join(root, "a.txt"), join(root, "link.txt")); + const createdSymlink = await trySymlink(join(root, "a.txt"), join(root, "link.txt")); const tree = await listWorkspaceTree(root, undefined); @@ -36,7 +36,7 @@ describe("listWorkspaceTree", () => { ["z-dir", "directory"], ["a.txt", "file"], ["b.txt", "file"], - ["link.txt", "symlink"], + ...(createdSymlink ? [["link.txt", "symlink"]] : []), ]); expect(Date.parse(tree.scannedAt)).not.toBeNaN(); }); @@ -73,3 +73,17 @@ describe("listWorkspaceTree", () => { expect(tree.truncated).toBe(true); }); }); + +async function trySymlink(target: string, path: string): Promise { + try { + await symlink(target, path); + return true; + } catch (error) { + if (isNodeErrorWithCode(error, "EPERM")) return false; + throw error; + } +} + +function isNodeErrorWithCode(error: unknown, code: string): error is NodeJS.ErrnoException { + return error instanceof Error && "code" in error && error.code === code; +}