From 811382aefd7d36857f66291727f399b3470ad90d Mon Sep 17 00:00:00 2001 From: Samuel Denis-D'Ortun Date: Wed, 17 Feb 2021 16:19:36 -0500 Subject: [PATCH 1/2] When traversing fields, ensure we create them as we go to avoid accessing undefined object --- src/ObjectStateMutations.js | 6 +++++- src/__tests__/ObjectStateMutations-test.js | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/ObjectStateMutations.js b/src/ObjectStateMutations.js index f9911847e..bcac048a0 100644 --- a/src/ObjectStateMutations.js +++ b/src/ObjectStateMutations.js @@ -138,7 +138,11 @@ export function estimateAttributes( data[first] = { ...serverData[first] }; let object = { ...data }; for (let i = 0; i < fields.length - 1; i++) { - object = object[fields[i]]; + const key = fields[i]; + if (!(key in object)) { + object[key] = {}; + } + object = object[key]; } object[last] = pendingOps[i][attr].applyTo(object[last]); } else { diff --git a/src/__tests__/ObjectStateMutations-test.js b/src/__tests__/ObjectStateMutations-test.js index 08c750719..82ca13055 100644 --- a/src/__tests__/ObjectStateMutations-test.js +++ b/src/__tests__/ObjectStateMutations-test.js @@ -163,7 +163,7 @@ describe('ObjectStateMutations', () => { }); it('can estimate attributes for nested documents', () => { - const serverData = { objectField: { counter: 10, letter: 'a' } }; + let serverData = { objectField: { counter: 10, letter: 'a' } }; let pendingOps = [{ 'objectField.counter': new ParseOps.IncrementOp(2) }]; expect( ObjectStateMutations.estimateAttributes(serverData, pendingOps, 'someClass', 'someId') @@ -182,6 +182,19 @@ describe('ObjectStateMutations', () => { letter: 'a', }, }); + serverData = {}; + pendingOps = [{ 'objectField.subField.subField.counter': new ParseOps.IncrementOp(20) }]; + expect( + ObjectStateMutations.estimateAttributes(serverData, pendingOps, 'someClass', 'someId') + ).toEqual({ + objectField: { + subField: { + subField: { + counter: 20, + }, + }, + }, + }); }); it('can commit changes from the server', () => { From ff88610930c6fc313e077905194b7cdf267d933d Mon Sep 17 00:00:00 2001 From: Samuel Denis-D'Ortun Date: Tue, 23 Feb 2021 05:10:39 -0500 Subject: [PATCH 2/2] Add integration test --- integration/test/ParseObjectTest.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/integration/test/ParseObjectTest.js b/integration/test/ParseObjectTest.js index 3c94ad360..45304dfc8 100644 --- a/integration/test/ParseObjectTest.js +++ b/integration/test/ParseObjectTest.js @@ -278,6 +278,20 @@ describe('Parse Object', () => { assert.equal(result.get('objectField').number, 20); }); + it('can increment nested four levels', async () => { + const obj = new TestObject({ a: { b: { c: { d: 1 } } } }); + await obj.save(); + obj.increment('a.b.c.d'); + assert.strictEqual(obj.get('a').b.c.d, 2); + + await obj.save(); + assert.strictEqual(obj.get('a').b.c.d, 2); + + const query = new Parse.Query(TestObject); + const result = await query.get(obj.id); + assert.strictEqual(result.get('a').b.c.d, 2); + }); + it('can increment nested field and retain full object', async () => { const obj = new Parse.Object('TestIncrementObject'); obj.set('objectField', { number: 5, letter: 'a' });