Skip to content

Commit 635ba56

Browse files
authored
Allow fromJSON to set keys to dirty (#1295)
* decode date * Update ParseObject-test.js * Update ParseQuery-test.js * Update ParseObject-test.js * Update ParseQuery-test.js * Update ParseQuery-test.js * add dirty parameter to fromJSON * Update ParseObject.js * Update ParseObject-test.js * integration + run prettier * Update ParseObjectTest.js
1 parent 832de92 commit 635ba56

File tree

4 files changed

+64
-4
lines changed

4 files changed

+64
-4
lines changed

integration/test/ParseObjectTest.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2012,4 +2012,33 @@ describe('Parse Object', () => {
20122012
const fetched = await query.get(user.id);
20132013
assert.equal(fetched.isDataAvailable(), true);
20142014
});
2015+
2016+
it('from json save data', async () => {
2017+
const json = {
2018+
className: 'TestObject',
2019+
date: new Date(),
2020+
array: [],
2021+
object: {},
2022+
string: '',
2023+
};
2024+
const obj = Parse.Object.fromJSON(json, false, true);
2025+
expect(obj.get('date')).toBeDefined();
2026+
expect(obj.get('date')).toBeInstanceOf(Date);
2027+
expect(obj.get('array')).toBeDefined();
2028+
expect(obj.get('array')).toBeInstanceOf(Array);
2029+
expect(obj.get('object')).toBeDefined();
2030+
expect(obj.get('object')).toBeInstanceOf(Object);
2031+
expect(obj.get('string')).toBeDefined();
2032+
expect(obj.get('string')).toBeInstanceOf(String);
2033+
await obj.save();
2034+
await obj.fetch();
2035+
expect(obj.get('date')).toBeDefined();
2036+
expect(obj.get('date')).toBeInstanceOf(Date);
2037+
expect(obj.get('array')).toBeDefined();
2038+
expect(obj.get('array')).toBeInstanceOf(Array);
2039+
expect(obj.get('object')).toBeDefined();
2040+
expect(obj.get('object')).toBeInstanceOf(Object);
2041+
expect(obj.get('string')).toBeDefined();
2042+
expect(obj.get('string')).toBeInstanceOf(String);
2043+
});
20152044
});

src/ParseObject.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1823,10 +1823,11 @@ class ParseObject {
18231823
* @param {object} json The JSON map of the Object's data
18241824
* @param {boolean} override In single instance mode, all old server data
18251825
* is overwritten if this is set to true
1826+
* @param {boolean} dirty Whether the Parse.Object should set JSON keys to dirty
18261827
* @static
18271828
* @returns {Parse.Object} A Parse.Object reference
18281829
*/
1829-
static fromJSON(json: any, override?: boolean) {
1830+
static fromJSON(json: any, override?: boolean, dirty?: boolean) {
18301831
if (!json.className) {
18311832
throw new Error('Cannot create an object without a className');
18321833
}
@@ -1836,6 +1837,9 @@ class ParseObject {
18361837
for (const attr in json) {
18371838
if (attr !== 'className' && attr !== '__type') {
18381839
otherAttributes[attr] = json[attr];
1840+
if (dirty) {
1841+
o.set(attr, json[attr]);
1842+
}
18391843
}
18401844
}
18411845
if (override) {

src/__tests__/ParseObject-test.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ describe('ParseObject', () => {
262262
createdAt: '2013-12-14T04:51:19Z',
263263
objectId: 'I1',
264264
size: 'medium',
265-
date: date
265+
date: date,
266266
};
267267
const o = ParseObject.fromJSON(json);
268268
expect(o.className).toBe('Item');
@@ -271,12 +271,34 @@ describe('ParseObject', () => {
271271
size: 'medium',
272272
createdAt: new Date(Date.UTC(2013, 11, 14, 4, 51, 19)),
273273
updatedAt: new Date(Date.UTC(2013, 11, 14, 4, 51, 19)),
274-
date
274+
date,
275275
});
276276
expect(o.dirty()).toBe(false);
277277
expect(o.get('date')).toBeInstanceOf(Date);
278278
});
279279

280+
it('can be dirty with fromJSON', () => {
281+
const date = new Date();
282+
const json = {
283+
className: 'Item',
284+
createdAt: '2013-12-14T04:51:19Z',
285+
objectId: 'I1',
286+
size: 'medium',
287+
date: date,
288+
};
289+
const o = ParseObject.fromJSON(json, false, true);
290+
expect(o.className).toBe('Item');
291+
expect(o.id).toBe('I1');
292+
expect(o.attributes).toEqual({
293+
size: 'medium',
294+
createdAt: new Date(Date.UTC(2013, 11, 14, 4, 51, 19)),
295+
updatedAt: new Date(Date.UTC(2013, 11, 14, 4, 51, 19)),
296+
date,
297+
});
298+
expect(o.dirty()).toBe(true);
299+
expect(o.dirtyKeys()).toEqual(['size', 'date']);
300+
});
301+
280302
it('can override old data when inflating from the server', () => {
281303
const o = ParseObject.fromJSON({
282304
className: 'Item',

src/__tests__/ParseQuery-test.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3260,7 +3260,12 @@ describe('ParseQuery LocalDatastore', () => {
32603260
updatedAt: new Date('2018-08-12T00:00:00.000Z'),
32613261
};
32623262

3263-
mockLocalDatastore._serializeObjectsFromPinName.mockImplementation(() => [obj1, obj3, obj2, obj4]);
3263+
mockLocalDatastore._serializeObjectsFromPinName.mockImplementation(() => [
3264+
obj1,
3265+
obj3,
3266+
obj2,
3267+
obj4,
3268+
]);
32643269

32653270
mockLocalDatastore.checkIfEnabled.mockImplementation(() => true);
32663271

0 commit comments

Comments
 (0)