/* * 노브 기본값 — **알리지 않고 아무것도 안 하는 트윈**이 만들어지지 않게. * * 기본값을 아는 곳은 노브 스키마(계약)인데 그것을 적용하는 곳이 위자드뿐이었다. 그래서 화면을 거치지 * 않는 호출자가 파라미터를 일부만 주면 템플릿 안에서 발생률이 0 이 되고, 이벤트를 하나도 만들지 않는 * 트윈이 아무 말 없이 생겼다(실제로 밟았고 템플릿이 깨진 것으로 오진했다). */ import { test } from 'node:test' import assert from 'node:assert/strict' import { applyKnobDefaults, filledKnobKeys } from '../server/service/reference/knob-defaults.ts' const KNOBS = [ { key: 'id', default: 'wms-new' }, { key: 'inboundRate', default: 40 }, { key: 'outboundRate', default: 30 }, { key: 'geo', default: { lat: 37.5, lon: 127.0 } }, { key: 'noDefault' } // 기본값을 선언하지 않은 노브 ] test('빠진 노브를 기본값으로 채운다 — 부분 파라미터 호출이 죽은 트윈을 만들지 않게', () => { const out = applyKnobDefaults(KNOBS, { id: 'mine' }) assert.equal(out.id, 'mine', '준 값은 그대로') assert.equal(out.inboundRate, 40) assert.equal(out.outboundRate, 30) assert.deepEqual(out.geo, { lat: 37.5, lon: 127.0 }) assert.ok(!('noDefault' in out), '기본값 없는 노브는 만들어 내지 않는다') }) test('0 은 덮지 않는다 — "자극 없이 구조만" 이라는 선언을 뒤집지 않게', () => { /* falsy 로 판정해 덮으면 발생률 0(도착 없음)이 40 으로 바뀐다. 없는 것과 0 은 다르다. */ const out = applyKnobDefaults(KNOBS, { inboundRate: 0, outboundRate: 0 }) assert.equal(out.inboundRate, 0) assert.equal(out.outboundRate, 0) }) test('빈 문자열·false 도 뜻 있는 값이라 덮지 않는다', () => { const out = applyKnobDefaults([{ key: 'name', default: 'New site' }, { key: 'flag', default: true }], { name: '', flag: false }) assert.equal(out.name, '') assert.equal(out.flag, false) }) test('null 은 "주지 않음" 으로 본다 — JSON·GraphQL 경로가 그렇게 보낸다', () => { const out = applyKnobDefaults(KNOBS, { inboundRate: null as any }) assert.equal(out.inboundRate, 40) }) test('선언 밖 파라미터는 손대지 않는다 — 템플릿의 폴백 경로를 끊지 않게', () => { /* 템플릿은 `geo` 대신 `lat`/`lon` 을 읽는 폴백을 가진다. 모르는 키를 걷어내면 그 경로가 끊긴다. */ const out = applyKnobDefaults(KNOBS, { lat: 1, lon: 2 }) assert.equal(out.lat, 1) assert.equal(out.lon, 2) }) test('입력을 바꾸지 않는다 — 호출자의 객체가 몰래 변하면 추적이 어렵다', () => { const given = { id: 'mine' } applyKnobDefaults(KNOBS, given) assert.deepEqual(given, { id: 'mine' }) }) test('노브가 없거나 파라미터가 없어도 무너지지 않는다', () => { assert.deepEqual(applyKnobDefaults(null, { a: 1 }), { a: 1 }) assert.deepEqual(applyKnobDefaults(KNOBS, null).inboundRate, 40) assert.deepEqual(applyKnobDefaults(undefined, undefined), {}) }) test('무엇을 채웠는지 알린다 — 준 적 없는 값으로 만들어진 것을 밝히게', () => { assert.deepEqual(filledKnobKeys(KNOBS, { id: 'mine', inboundRate: 0 }), ['outboundRate', 'geo'], '준 것과 0 은 채운 목록에 없다') assert.deepEqual(filledKnobKeys(KNOBS, null), ['id', 'inboundRate', 'outboundRate', 'geo']) assert.deepEqual(filledKnobKeys(KNOBS, { id: 'a', inboundRate: 1, outboundRate: 2, geo: {} }), [], '다 주면 빈 목록') })