Skip to content

Commit 15ece68

Browse files
authored
LiveQuery handle unset operation (#714)
* LiveQuery handle unset operation * change logic to original object * Nit
1 parent 315a98f commit 15ece68

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

src/LiveQueryClient.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -389,17 +389,22 @@ class LiveQueryClient extends EventEmitter {
389389
break;
390390
default: {
391391
// create, update, enter, leave, delete cases
392-
393-
// Does not override / clear server data
394-
delete data.object.__type;
395-
const parseObject = ParseObject.fromJSON(data.object, false);
396392
if (!subscription) {
397393
break;
398394
}
399395
if (data.original) {
400396
delete data.original.__type;
397+
// Check for removed fields
398+
for (const field in data.original) {
399+
if (!(field in data.object)) {
400+
data.object[field] = undefined;
401+
}
402+
}
401403
data.original = ParseObject.fromJSON(data.original, false);
402404
}
405+
delete data.object.__type;
406+
const parseObject = ParseObject.fromJSON(data.object, false);
407+
403408
subscription.emit(data.op, parseObject, data.original);
404409
}
405410
}

src/__tests__/LiveQueryClient-test.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,45 @@ describe('LiveQueryClient', () => {
264264
expect(isChecked).toBe(true);
265265
});
266266

267+
it('can handle WebSocket response unset field', async () => {
268+
const liveQueryClient = new LiveQueryClient({
269+
applicationId: 'applicationId',
270+
serverURL: 'ws://test',
271+
javascriptKey: 'javascriptKey',
272+
masterKey: 'masterKey',
273+
sessionToken: 'sessionToken'
274+
});
275+
// Add mock subscription
276+
const subscription = new events.EventEmitter();
277+
liveQueryClient.subscriptions.set(1, subscription);
278+
279+
const object = new ParseObject('Test');
280+
const original = new ParseObject('Test');
281+
const pointer = new ParseObject('PointerTest');
282+
pointer.id = '1234';
283+
original.set('pointer', pointer);
284+
const data = {
285+
op: 'update',
286+
clientId: 1,
287+
requestId: 1,
288+
object: object._toFullJSON(),
289+
original: original._toFullJSON(),
290+
};
291+
const event = {
292+
data: JSON.stringify(data)
293+
}
294+
let isChecked = false;
295+
subscription.on('update', (parseObject, parseOriginalObject) => {
296+
isChecked = true;
297+
expect(parseObject.toJSON().pointer).toBeUndefined();
298+
expect(parseOriginalObject.toJSON().pointer.objectId).toEqual(pointer.id);
299+
});
300+
301+
liveQueryClient._handleWebSocketMessage(event);
302+
303+
expect(isChecked).toBe(true);
304+
});
305+
267306
it('can handle WebSocket close message', () => {
268307
const liveQueryClient = new LiveQueryClient({
269308
applicationId: 'applicationId',

0 commit comments

Comments
 (0)