import { Buffer } from "node:buffer"; import { describe, expect, it } from "vitest"; import { decodeUploadFilename } from "@/utils/upload-name"; /** จำลองสิ่งที่ undici ทำกับชื่อไฟล์: ถอดรหัส UTF-8 bytes เป็น latin1 (mojibake) */ function mojibake(name: string): string { return Buffer.from(name, "utf8").toString("latin1"); } describe("decodeUploadFilename", () => { it("ชื่อไทยที่ undici ถอดเป็น latin1 → คืนชื่อเดิม", () => { expect(decodeUploadFilename(mojibake("คำร้องทดสอบอัปโหลด.pdf"))).toBe( "คำร้องทดสอบอัปโหลด.pdf", ); }); it("ชื่อไทยผสมตัวเลข/วงเล็บ/ช่องว่าง", () => { expect(decodeUploadFilename(mojibake("คดีดำที่ 1234 (สำเนา).pdf"))).toBe( "คดีดำที่ 1234 (สำเนา).pdf", ); }); it("ชื่ออังกฤษล้วนไม่เปลี่ยน (รอบ latin1⇄utf8 เป็น identity)", () => { expect(decodeUploadFilename("scan-2026_final.PDF")).toBe("scan-2026_final.PDF"); }); it("ชื่อที่ส่งมาถูกต้องอยู่แล้ว (ไทย ≥ U+0E00 ไม่มีตัวช่วง latin1) ไม่ถูกแตะ", () => { expect(decodeUploadFilename("คำร้อง.pdf")).toBe("คำร้อง.pdf"); }); it("ชื่อ latin1 จริง (byte เดี่ยวประกอบเป็น UTF-8 ไม่ได้) เก็บของเดิม", () => { // "café" ที่ sender เข้ารหัส latin1 จริง: é = byte 0xE9 เดี่ยว → ถอด UTF-8 ได้ U+FFFD expect(decodeUploadFilename("café.pdf")).toBe("café.pdf"); }); });