import { describe, expect, it } from 'vitest' import { normalizeSnapshot } from '../app/utils/snapshot' describe('normalizeSnapshot — แปลง snapshot 2 รูปแบบของ backend ให้เป็น list สำหรับ UI (FR-12)', () => { it('รูปแบบเอกสารผูก template: { key: { value, missing } }', () => { const result = normalizeSnapshot({ employee_name: { value: 'สมหญิง รักงาน', missing: false }, position: { value: 'วิศวกรเดิม', missing: true }, }) expect(result).toEqual([ { key: 'employee_name', value: 'สมหญิง รักงาน', missing: false }, { key: 'position', value: 'วิศวกรเดิม', missing: true }, ]) }) it('รูปแบบเอกสารไม่ผูก template: map ดิบ { key: value } → missing=false ทั้งหมด', () => { const result = normalizeSnapshot({ any_tag: 'ค่าอะไรก็ได้' }) expect(result).toEqual([{ key: 'any_tag', value: 'ค่าอะไรก็ได้', missing: false }]) }) it('value ไม่ใช่ string → แปลงเป็น string; null/undefined → ""', () => { const result = normalizeSnapshot({ number_value: 123, bool_value: true, null_value: null, undefined_value: undefined, object_value: { value: null, missing: false }, }) expect(result).toEqual([ { key: 'number_value', value: '123', missing: false }, { key: 'bool_value', value: 'true', missing: false }, { key: 'null_value', value: '', missing: false }, { key: 'undefined_value', value: '', missing: false }, { key: 'object_value', value: '', missing: false }, ]) }) it('fields เป็น null/undefined/ค่าไม่ใช่ object → list ว่าง (version ไม่มี snapshot)', () => { expect(normalizeSnapshot(null)).toEqual([]) expect(normalizeSnapshot(undefined)).toEqual([]) expect(normalizeSnapshot('string')).toEqual([]) expect(normalizeSnapshot(42)).toEqual([]) }) it('orderKeys กำหนดลำดับตาม field defs — key นอก defs ต่อท้ายตามตัวอักษร', () => { const result = normalizeSnapshot( { orphan: '1', salary: '2', employee_name: '3', zzz: '4', position: '5' }, ['employee_name', 'position', 'salary'], ) expect(result.map((e) => e.key)).toEqual([ 'employee_name', 'position', 'salary', 'orphan', 'zzz', // orphan สองตัวเรียงตาม localeCompare ]) }) it('orderKeys ว่าง/ไม่ส่ง → คงลำดับเดิมของ object', () => { const fields = { b: 'x', a: 'y' } expect(normalizeSnapshot(fields, []).map((e) => e.key)).toEqual(['b', 'a']) expect(normalizeSnapshot(fields).map((e) => e.key)).toEqual(['b', 'a']) }) it('key ซ้ำใน object (ผ่าน JSON เข้ามา) — ตัวหลังชนะตามพฤติกรรม Object.entries', () => { // JSON.parse ทำให้ key ซ้ำเหลือตัวเดียวอยู่แล้ว — assert กัน regression เรื่อง Map dedupe const parsed = JSON.parse('{"k":"first","k":"second"}') const result = normalizeSnapshot(parsed) expect(result).toEqual([{ key: 'k', value: 'second', missing: false }]) }) })