Files
pi-agent-integrated/pi-web/lib/file-dirent.test.mjs

57 lines
2.1 KiB
JavaScript

import assert from "node:assert/strict";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import test from "node:test";
async function loadSubject() {
return import("./file-dirent.ts");
}
test("uses Dirent types for regular files and directories", async () => {
const { resolveDirentIsDirectory } = await loadSubject();
const file = { isDirectory: () => false, isFile: () => true };
const directory = { isDirectory: () => true, isFile: () => false };
assert.equal(resolveDirentIsDirectory(file, "/unused/file"), false);
assert.equal(resolveDirentIsDirectory(directory, "/unused/directory"), true);
});
test("falls back to stat when the Dirent type is unknown", async (t) => {
const { resolveDirentIsDirectory } = await loadSubject();
const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-web-dirent-"));
t.after(() => fs.rmSync(root, { recursive: true, force: true }));
const directoryPath = path.join(root, "directory");
fs.mkdirSync(directoryPath);
const unknown = { isDirectory: () => false, isFile: () => false };
assert.equal(resolveDirentIsDirectory(unknown, directoryPath), true);
});
test("follows directory symlinks and skips dangling symlinks", async (t) => {
const { resolveDirentIsDirectory } = await loadSubject();
const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-web-dirent-"));
t.after(() => fs.rmSync(root, { recursive: true, force: true }));
fs.mkdirSync(path.join(root, "target"));
try {
fs.symlinkSync("target", path.join(root, "directory-link"), "dir");
fs.symlinkSync("missing", path.join(root, "dangling-link"), "file");
} catch (error) {
if (error?.code === "EPERM") {
t.skip("Creating symbolic links requires additional privileges on this platform");
return;
}
throw error;
}
const symlink = { isDirectory: () => false, isFile: () => false };
assert.equal(
resolveDirentIsDirectory(symlink, path.join(root, "directory-link")),
true,
);
assert.equal(
resolveDirentIsDirectory(symlink, path.join(root, "dangling-link")),
null,
);
});