Project Files
tests / paths.test.cjs
const fs = require("node:fs");
const os = require("node:os");
const path = require("node:path");
const assert = require("node:assert/strict");
const { describe, it } = require("node:test");
const { configuredBaseDir, resolveUnderRoot, validateRelativeName } = require("../dist/paths.js");
describe("resolveUnderRoot", () => {
it("resolves safe relative paths", () => {
const root = "/tmp/lmexif-test";
assert.equal(resolveUnderRoot(root, "a/b.txt"), path.resolve("/tmp/lmexif-test/a/b.txt"));
});
it("rejects traversal", () => {
const root = "/tmp/lmexif-test";
assert.throws(() => resolveUnderRoot(root, "../etc/passwd"), /escapes/);
});
});
describe("validateRelativeName", () => {
it("accepts plugin-style paths", () => {
assert.doesNotThrow(() => validateRelativeName("foo/bar-baz.txt", "file_name"));
});
it("rejects empty", () => {
assert.throws(() => validateRelativeName(" ", "file_name"), /empty/);
});
it("rejects bad characters", () => {
assert.throws(() => validateRelativeName("a b", "file_name"));
});
it("rejects .. segments", () => {
assert.throws(() => validateRelativeName("a/../b", "file_name"));
});
});
describe("configuredBaseDir", () => {
it("errors when unset", () => {
assert.throws(() => configuredBaseDir(""), /Directory not set/);
});
it("accepts an existing directory", () => {
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "lmexif-base-"));
assert.equal(configuredBaseDir(dir), path.resolve(dir));
});
});