Skip to content

Commit 49df2f5

Browse files
authored
fix: Internal Referencing for Increment Dot Notation (#1255)
* test * lint * Cleanup * Revert package-lock.json
1 parent f443834 commit 49df2f5

File tree

5 files changed

+51
-8
lines changed

5 files changed

+51
-8
lines changed

integration/test/ParseObjectTest.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,24 +256,30 @@ describe('Parse Object', () => {
256256
});
257257

258258
it('can increment nested field and retain full object', async () => {
259-
const obj = new TestObject();
259+
const obj = new Parse.Object('TestIncrementObject');
260260
obj.set('objectField', { number: 5, letter: 'a' });
261261
assert.equal(obj.get('objectField').number, 5);
262262
assert.equal(obj.get('objectField').letter, 'a');
263263
await obj.save();
264+
assert.deepStrictEqual(obj.attributes.objectField, { number: 5, letter: 'a' });
264265

265266
obj.increment('objectField.number', 15);
267+
assert.deepStrictEqual(obj.attributes.objectField, { number: 20, letter: 'a' });
268+
assert.deepStrictEqual(obj.attributes.objectField, { number: 20, letter: 'a' });
269+
266270
assert.equal(obj.get('objectField').number, 20);
267271
assert.equal(obj.get('objectField').letter, 'a');
268272
await obj.save();
269273

270274
assert.equal(obj.get('objectField').number, 20);
271275
assert.equal(obj.get('objectField').letter, 'a');
276+
assert.deepStrictEqual(obj.attributes.objectField, { number: 20, letter: 'a' });
272277

273-
const query = new Parse.Query(TestObject);
278+
const query = new Parse.Query('TestIncrementObject');
274279
const result = await query.get(obj.id);
275280
assert.equal(result.get('objectField').number, 20);
276281
assert.equal(result.get('objectField').letter, 'a');
282+
assert.deepStrictEqual(result.attributes.objectField, { number: 20, letter: 'a' });
277283
});
278284

279285
it('can increment non existing field', async () => {
@@ -321,7 +327,7 @@ describe('Parse Object', () => {
321327
await obj.save();
322328
assert.equal(false, true);
323329
} catch(error) {
324-
assert.equal(error.message, "Cannot create property 'dot' on string 'world'");
330+
assert.equal(error.message, 'schema mismatch for TestObject.hello; expected String but got Object');
325331
}
326332
});
327333

integration/test/helper.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ beforeAll((done) => {
55
const { app } = require('../server');
66
const httpServer = require('http').createServer(app);
77

8-
httpServer.listen(1337, () => {
8+
httpServer.on('error', console.log).listen(1337, () => {
99
console.log('parse-server running on port 1337.');
1010
done();
1111
});

src/ObjectStateMutations.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,10 @@ export function estimateAttributes(serverData: AttributeMap, pendingOps: Array<O
126126
if (attr.includes('.')) {
127127
// convert a.b.c into { a: { b: { c: value } } }
128128
const fields = attr.split('.');
129+
const first = fields[0];
129130
const last = fields[fields.length - 1];
130-
let object = Object.assign({}, data);
131+
data[first] = { ...serverData[first] };
132+
let object = { ...data };
131133
for (let i = 0; i < fields.length - 1; i++) {
132134
object = object[fields[i]];
133135
}

src/ParseObject.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -409,10 +409,9 @@ class ParseObject {
409409
} else if (attr !== 'objectId') {
410410
const val = decode(response[attr]);
411411
if (val && Object.getPrototypeOf(val) === Object.prototype) {
412-
// Update the object by merging in updates w/ old object
413-
changes[attr] = { ...this.attributes[attr], ...val }
412+
changes[attr] = { ...this.attributes[attr], ...val };
414413
} else {
415-
changes[attr] = val
414+
changes[attr] = val;
416415
}
417416
if (changes[attr] instanceof UnsetOp) {
418417
changes[attr] = undefined;

src/__tests__/ParseObject-test.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ jest.dontMock('../ParseFile');
2222
jest.dontMock('../ParseGeoPoint');
2323
jest.dontMock('../ParseObject');
2424
jest.dontMock('../ParseOp');
25+
jest.dontMock('../ParsePolygon');
2526
jest.dontMock('../ParseRelation');
2627
jest.dontMock('../RESTController');
2728
jest.dontMock('../SingleInstanceStateController');
@@ -147,6 +148,7 @@ const ParseACL = require('../ParseACL').default;
147148
const ParseError = require('../ParseError').default;
148149
const ParseFile = require('../ParseFile').default;
149150
const ParseGeoPoint = require('../ParseGeoPoint').default;
151+
const ParsePolygon = require('../ParsePolygon').default;
150152
const ParseObject = require('../ParseObject').default;
151153
const ParseOp = require('../ParseOp');
152154
const RESTController = require('../RESTController');
@@ -1104,6 +1106,40 @@ describe('ParseObject', () => {
11041106
expect(p.op('age')).toBe(undefined);
11051107
});
11061108

1109+
it('handle GeoPoint changes for server', () => {
1110+
const p = new ParseObject('Person');
1111+
p.id = 'PPoint';
1112+
const created = new Date();
1113+
const geopoint = new ParseGeoPoint(0, 0);
1114+
p._handleSaveResponse({
1115+
createdAt: created.toISOString(),
1116+
point: geopoint.toJSON(),
1117+
});
1118+
expect(p._getServerData()).toEqual({
1119+
updatedAt: created,
1120+
createdAt: created,
1121+
point: geopoint,
1122+
});
1123+
expect(p._getServerData().point instanceof ParseGeoPoint).toBe(true);
1124+
});
1125+
1126+
it('handle Polygon changes for server', () => {
1127+
const p = new ParseObject('Person');
1128+
p.id = 'PPolygon';
1129+
const created = new Date();
1130+
const polygon = new ParsePolygon([[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]);
1131+
p._handleSaveResponse({
1132+
createdAt: created.toISOString(),
1133+
shape: polygon.toJSON(),
1134+
});
1135+
expect(p._getServerData()).toEqual({
1136+
updatedAt: created,
1137+
createdAt: created,
1138+
shape: polygon,
1139+
});
1140+
expect(p._getServerData().shape instanceof ParsePolygon).toBe(true);
1141+
});
1142+
11071143
it('handle createdAt string for server', () => {
11081144
const p = new ParseObject('Person');
11091145
p.id = 'P9';

0 commit comments

Comments
 (0)