77 lines
3.5 KiB
TypeScript
77 lines
3.5 KiB
TypeScript
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 }])
|
|
})
|
|
})
|