/* * 떨어진 것에 봉투 id 가 실리나. * * ── 왜 필요한가 (2026-09-07 측정) ─────────────────────────────────────────── * 훅 응답의 떨어진 목록이 `{ record, errors }` 였고, plant 은 그것을 **봉투 id 문자열 목록**으로 * 읽고 있었다. * * ``` * headless-twin rejected: { record, errors }[] 객체 배열 * plant "rejected is a list of envelope ids" 문자열 배열 * ``` * * `Array.isArray` 는 통과하니 그쪽 guard 도 안 걸렸다. id 를 맞추는데 객체라 하나도 안 맞고 * **묶음 전체가 「보냈음」으로 찍혔다** — 422 와 `ok: false` 를 보냈는데 재시도 0 · 오류 없음이었다. * * 우리가 말했는데 상대가 못 알아듣는 모양이면, 말한 것이 아니다. * * 이 시험은 **모양**을 본다. 값이 흐르는지는 다른 시험이 보고, 여기서는 보내는 쪽이 자기 행을 찾을 수 * 있는 열쇠가 실리는지만 본다. */ import test from 'node:test' import assert from 'node:assert/strict' import { rejectedForCaller } from '../server/service/reference/hook-rejected.js' const bad = { orderId: 'WO-1' } const worse = { orderId: 'WO-2' } const ERRORS = ['order: at 없음/형식 오류'] test('봉투 id 를 아는 것은 id 로 나간다 — 보내는 쪽이 그 행만 표시할 수 있다', () => { const out = rejectedForCaller([{ record: bad, errors: ERRORS }], [{ record: bad, eventId: 'evt-1' }]) assert.deepEqual(out, [{ eventId: 'evt-1', errors: ERRORS }]) }) test('id 를 모르면 레코드를 그대로 싣는다 — 빈 id 를 넣지 않는다', () => { /* * 빈 id 를 실으면 보내는 쪽이 아무 행도 못 찾으면서 「알았다」고 여긴다. 그때는 무엇이 떨어졌는지 * 보여 주는 것이 유일한 답이다. */ const out = rejectedForCaller([{ record: bad, errors: ERRORS }], [{ record: bad }]) assert.deepEqual(out, [{ record: bad, errors: ERRORS }]) }) test('짝은 객체 동일성으로 짓는다 — 같은 모양의 레코드 둘이 서로의 id 를 가져가지 않는다', () => { const twinA = { orderId: 'SAME' } const twinB = { orderId: 'SAME' } const out = rejectedForCaller( [{ record: twinB, errors: ERRORS }], [ { record: twinA, eventId: 'evt-A' }, { record: twinB, eventId: 'evt-B' } ] ) assert.deepEqual(out, [{ eventId: 'evt-B', errors: ERRORS }], '값으로 비교하면 evt-A 가 나온다') }) test('여러 건이 각자의 id 로 나간다', () => { const out = rejectedForCaller( [ { record: bad, errors: ERRORS }, { record: worse, errors: ['다른 까닭'] } ], [ { record: bad, eventId: 'evt-1' }, { record: worse, eventId: 'evt-2' } ] ) assert.deepEqual(out, [ { eventId: 'evt-1', errors: ERRORS }, { eventId: 'evt-2', errors: ['다른 까닭'] } ]) }) test('빈 문자열·공백 id 는 없는 것으로 본다 — 아무 행도 못 찾는 열쇠다', () => { assert.deepEqual(rejectedForCaller([{ record: bad, errors: ERRORS }], [{ record: bad, eventId: ' ' }]), [ { record: bad, errors: ERRORS } ]) }) test('떨어진 것이 없으면 빈 목록이다', () => { assert.deepEqual(rejectedForCaller([], [{ record: bad, eventId: 'evt-1' }]), []) })