Release Archive Tools 0.1.0
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
// @vitest-environment node
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { assessArchivePath } from "../../src/archive/paths";
|
||||
|
||||
describe("archive path policy", () => {
|
||||
it.each([
|
||||
"../escape.txt",
|
||||
"/absolute.txt",
|
||||
"C:/drive.txt",
|
||||
"safe/../../escape",
|
||||
"CON",
|
||||
"file.txt:stream",
|
||||
"trailing. ",
|
||||
"invoice\u202egnp.exe",
|
||||
])("blocks unsafe path %s", (path) =>
|
||||
expect(assessArchivePath(path).safe).toBe(false),
|
||||
);
|
||||
|
||||
it("normalizes Unicode and treats backslashes as cross-platform separators", () => {
|
||||
const result = assessArchivePath("Folder\\cafe\u0301.txt");
|
||||
expect(result.normalized).toBe("Folder/café.txt");
|
||||
expect(result.safe).toBe(true);
|
||||
expect(result.issues.map((issue) => issue.code)).toContain(
|
||||
"BACKSLASH_PATH",
|
||||
);
|
||||
});
|
||||
|
||||
it("produces a conservative case-insensitive collision key", () => {
|
||||
expect(assessArchivePath("Folder/Report.TXT").collisionKey).toBe(
|
||||
assessArchivePath("folder/report.txt").collisionKey,
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user