Next.js 14 + Drizzle/PostgreSQL + SSE realtime sync — highlight, freehand, comment, bookmark + ฟีเจอร์ต่อยอด F1–F19 (edit/move, undo/redo, shapes, redaction, export PDF/CSV, reply, resolve, search, summary, textbox, stamp, version history) Co-Authored-By: Claude Code <noreply@anthropic.com>
36 lines
1.5 KiB
TypeScript
36 lines
1.5 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { csvField } from "@/utils/csv";
|
|
|
|
describe("csvField", () => {
|
|
it("ครอบ double quote ตาม RFC 4180", () => {
|
|
expect(csvField("ทดสอบ")).toBe('"ทดสอบ"');
|
|
});
|
|
|
|
it("escape double quote ในค่าเป็น \"\"", () => {
|
|
expect(csvField('พูดว่า "สวัสดี"')).toBe('"พูดว่า ""สวัสดี"""');
|
|
});
|
|
|
|
it("ตัวเลขหน้าไม่ถูกนำหน้าอะไร", () => {
|
|
expect(csvField("1")).toBe('"1"');
|
|
expect(csvField("12")).toBe('"12"');
|
|
});
|
|
|
|
it("FIX-6: ขึ้นต้นด้วย = + - @ ต้องนำหน้าด้วย ' กันสูตร Excel", () => {
|
|
expect(csvField("=1+1")).toBe('"\'=1+1"');
|
|
expect(csvField("+SUM(A1:A2)")).toBe('"\'+SUM(A1:A2)"');
|
|
expect(csvField("-2+3")).toBe('"\'-2+3"');
|
|
expect(csvField("@SUM(A1)")).toBe('"\'@SUM(A1)"');
|
|
});
|
|
|
|
it("FIX-6: ขึ้นต้นด้วย TAB/CR ต้องนำหน้าด้วย ' เช่นกัน", () => {
|
|
expect(csvField("\t=cmd")).toBe('"\'\t=cmd"');
|
|
expect(csvField("\r=cmd")).toBe('"\'\r=cmd"');
|
|
});
|
|
|
|
it("อักขระพิเศษที่ไม่ใช่จุดเริ่มสูตรไม่ถูกนำหน้า", () => {
|
|
expect(csvField("1+1")).toBe('"1+1"');
|
|
expect(csvField("a=b")).toBe('"a=b"');
|
|
expect(csvField("ราคา -50 บาท")).toBe('"ราคา -50 บาท"');
|
|
});
|
|
});
|