Skip to content

Commit 1abb841

Browse files
authored
When traversing fields, ensure we create them as we go to avoid acces… (#1301)
* When traversing fields, ensure we create them as we go to avoid accessing undefined object * Add integration test
1 parent 3fb14ed commit 1abb841

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

integration/test/ParseObjectTest.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,20 @@ describe('Parse Object', () => {
278278
assert.equal(result.get('objectField').number, 20);
279279
});
280280

281+
it('can increment nested four levels', async () => {
282+
const obj = new TestObject({ a: { b: { c: { d: 1 } } } });
283+
await obj.save();
284+
obj.increment('a.b.c.d');
285+
assert.strictEqual(obj.get('a').b.c.d, 2);
286+
287+
await obj.save();
288+
assert.strictEqual(obj.get('a').b.c.d, 2);
289+
290+
const query = new Parse.Query(TestObject);
291+
const result = await query.get(obj.id);
292+
assert.strictEqual(result.get('a').b.c.d, 2);
293+
});
294+
281295
it('can increment nested field and retain full object', async () => {
282296
const obj = new Parse.Object('TestIncrementObject');
283297
obj.set('objectField', { number: 5, letter: 'a' });

src/ObjectStateMutations.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,11 @@ export function estimateAttributes(
138138
data[first] = { ...serverData[first] };
139139
let object = { ...data };
140140
for (let i = 0; i < fields.length - 1; i++) {
141-
object = object[fields[i]];
141+
const key = fields[i];
142+
if (!(key in object)) {
143+
object[key] = {};
144+
}
145+
object = object[key];
142146
}
143147
object[last] = pendingOps[i][attr].applyTo(object[last]);
144148
} else {

src/__tests__/ObjectStateMutations-test.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ describe('ObjectStateMutations', () => {
163163
});
164164

165165
it('can estimate attributes for nested documents', () => {
166-
const serverData = { objectField: { counter: 10, letter: 'a' } };
166+
let serverData = { objectField: { counter: 10, letter: 'a' } };
167167
let pendingOps = [{ 'objectField.counter': new ParseOps.IncrementOp(2) }];
168168
expect(
169169
ObjectStateMutations.estimateAttributes(serverData, pendingOps, 'someClass', 'someId')
@@ -182,6 +182,19 @@ describe('ObjectStateMutations', () => {
182182
letter: 'a',
183183
},
184184
});
185+
serverData = {};
186+
pendingOps = [{ 'objectField.subField.subField.counter': new ParseOps.IncrementOp(20) }];
187+
expect(
188+
ObjectStateMutations.estimateAttributes(serverData, pendingOps, 'someClass', 'someId')
189+
).toEqual({
190+
objectField: {
191+
subField: {
192+
subField: {
193+
counter: 20,
194+
},
195+
},
196+
},
197+
});
185198
});
186199

187200
it('can commit changes from the server', () => {

0 commit comments

Comments
 (0)