diff --git a/web/src/components/RealtimeTable/utils/cellUtils.test.js b/web/src/components/RealtimeTable/utils/cellUtils.test.js index ea85b37..a7f849e 100644 --- a/web/src/components/RealtimeTable/utils/cellUtils.test.js +++ b/web/src/components/RealtimeTable/utils/cellUtils.test.js @@ -200,3 +200,32 @@ test('ожидаемое отличие от старой реализации: delete stripped[0].subRows[0].data.extra; assert.deepEqual(stripped, old); }); + +const row = (data) => ({ row_type: 'INPUT', depth: 3, sort_order: 1, data }); + +test('AURORA-1848: нет блока q1 — блок с полем вставляется, остальное сохраняется', () => { + const data = deepFreeze([row({ line_id: 7, header: { name: 'X' } })]); + const out = updateCells(data, [['INPUT', 3, 1, { q1: { m1: 5 } }]]); + assert.equal(out[0].data.q1.m1, 5); + assert.deepEqual(out[0].data.header, { name: 'X' }); + assert.equal(out[0].data.line_id, 7); +}); + +test('AURORA-1848: блок q1 без поля m1 — поле вставляется, остальные поля q1 сохраняются', () => { + const data = deepFreeze([row({ line_id: 7, q1: { m2: 3 } })]); + const out = updateCells(data, [['INPUT', 3, 1, { q1: { m1: 5 } }]]); + assert.deepEqual(out[0].data.q1, { m2: 3, m1: 5 }); +}); + +test('AURORA-1848: очистка — null записывается явно', () => { + const data = deepFreeze([row({ line_id: 7, q1: { m1: 5 } })]); + const out = updateCells(data, [['INPUT', 3, 1, { q1: { m1: null } }]]); + assert.ok('m1' in out[0].data.q1); + assert.equal(out[0].data.q1.m1, null); +}); + +test('AURORA-1848: отсутствующий скалярный ключ верхнего уровня data вставляется', () => { + const data = deepFreeze([row({ header: { name: 'X' } })]); + const out = updateCells(data, [['INPUT', 3, 1, { line_id: 9 }]]); + assert.equal(out[0].data.line_id, 9); +});