import { describe, test, expect } from "bun:test"; import { formatTimestamp, validateFilename } from "./utils"; describe("formatTimestamp", () => { test("formats date correctly", () => { const date = new Date(2024, 0, 15, 14, 30, 45); // Jan 15, 2024 14:30:45 const result = formatTimestamp(date); expect(result).toBe("2024-01-15 at 14.30.45"); }); test("pads single digit values", () => { const date = new Date(2024, 2, 5, 9, 5, 5); // Mar 5, 2024 09:05:05 const result = formatTimestamp(date); expect(result).toBe("2024-03-05 at 09.05.05"); }); test("handles midnight", () => { const date = new Date(2024, 0, 1, 0, 0, 0); const result = formatTimestamp(date); expect(result).toBe("2024-01-01 at 00.00.00"); }); test("handles end of day", () => { const date = new Date(2024, 0, 1, 23, 59, 59); const result = formatTimestamp(date); expect(result).toBe("2024-01-01 at 23.59.59"); }); }); describe("validateFilename", () => { test("accepts valid filename", () => { const result = validateFilename("my-file.txt"); expect(result.ok).toBe(true); if (result.ok) { expect(result.value).toBe("my-file.txt"); } }); test("accepts filename with spaces", () => { const result = validateFilename("my file.txt"); expect(result.ok).toBe(true); }); test("accepts unicode characters", () => { const result = validateFilename("文件.txt"); expect(result.ok).toBe(true); }); test("rejects empty string", () => { const result = validateFilename(""); expect(result.ok).toBe(false); if (!result.ok) { expect(result.error).toBe("empty"); } }); test("rejects whitespace-only string", () => { const result = validateFilename(" "); expect(result.ok).toBe(false); if (!result.ok) { expect(result.error).toBe("empty"); } }); test("rejects path traversal with ..", () => { const result = validateFilename("../etc/passwd"); expect(result.ok).toBe(false); if (!result.ok) { expect(result.error).toBe("path_traversal"); } }); test("rejects path traversal with /", () => { const result = validateFilename("/etc/passwd"); expect(result.ok).toBe(false); if (!result.ok) { expect(result.error).toBe("path_traversal"); } }); test("rejects path traversal with backslash", () => { const result = validateFilename("file\\..\\passwd"); expect(result.ok).toBe(false); if (!result.ok) { expect(result.error).toBe("path_traversal"); } }); test("rejects filename with null byte", () => { const result = validateFilename("file\x00.txt"); expect(result.ok).toBe(false); if (!result.ok) { expect(result.error).toBe("invalid_chars"); } }); test("rejects filename with control characters", () => { const result = validateFilename("file\x01.txt"); expect(result.ok).toBe(false); if (!result.ok) { expect(result.error).toBe("invalid_chars"); } }); test("rejects filename exceeding max length", () => { const longName = "a".repeat(256); const result = validateFilename(longName); expect(result.ok).toBe(false); if (!result.ok) { expect(result.error).toBe("too_long"); } }); test("accepts filename at max length", () => { const maxName = "a".repeat(255); const result = validateFilename(maxName); expect(result.ok).toBe(true); }); test("trims whitespace from valid filename", () => { const result = validateFilename(" file.txt "); expect(result.ok).toBe(true); if (result.ok) { expect(result.value).toBe("file.txt"); } }); });