|
1 | 1 | var Parse = require('parse/node');
|
2 | 2 | var ParseLiveQueryServer = require('../src/LiveQuery/ParseLiveQueryServer').ParseLiveQueryServer;
|
3 | 3 | var ParseServer = require('../src/ParseServer').default;
|
| 4 | +var LiveQueryController = require('../src/Controllers/LiveQueryController').LiveQueryController; |
4 | 5 |
|
5 | 6 | // Global mock info
|
6 | 7 | var queryHashValue = 'hash';
|
@@ -146,86 +147,6 @@ describe('ParseLiveQueryServer', function() {
|
146 | 147 | parseServer.server.close(done);
|
147 | 148 | });
|
148 | 149 |
|
149 |
| - it('properly passes the CLP to afterSave/afterDelete hook', function(done) { |
150 |
| - function setPermissionsOnClass(className, permissions, doPut) { |
151 |
| - var request = require('request'); |
152 |
| - let op = request.post; |
153 |
| - if (doPut) |
154 |
| - { |
155 |
| - op = request.put; |
156 |
| - } |
157 |
| - return new Promise((resolve, reject) => { |
158 |
| - op({ |
159 |
| - url: Parse.serverURL + '/schemas/' + className, |
160 |
| - headers: { |
161 |
| - 'X-Parse-Application-Id': Parse.applicationId, |
162 |
| - 'X-Parse-Master-Key': Parse.masterKey, |
163 |
| - }, |
164 |
| - json: true, |
165 |
| - body: { |
166 |
| - classLevelPermissions: permissions |
167 |
| - } |
168 |
| - }, (error, response, body) => { |
169 |
| - if (error) { |
170 |
| - return reject(error); |
171 |
| - } |
172 |
| - if (body.error) { |
173 |
| - return reject(body); |
174 |
| - } |
175 |
| - return resolve(body); |
176 |
| - }) |
177 |
| - }); |
178 |
| - } |
179 |
| - |
180 |
| - let saveSpy; |
181 |
| - let deleteSpy; |
182 |
| - reconfigureServer({ |
183 |
| - liveQuery: { |
184 |
| - classNames: ['Yolo'] |
185 |
| - } |
186 |
| - }).then((parseServer) => { |
187 |
| - saveSpy = spyOn(parseServer.config.liveQueryController, 'onAfterSave'); |
188 |
| - deleteSpy = spyOn(parseServer.config.liveQueryController, 'onAfterDelete'); |
189 |
| - return setPermissionsOnClass('Yolo', { |
190 |
| - create: {'*': true}, |
191 |
| - delete: {'*': true} |
192 |
| - }) |
193 |
| - }).then(() => { |
194 |
| - const obj = new Parse.Object('Yolo'); |
195 |
| - return obj.save(); |
196 |
| - }).then((obj) => { |
197 |
| - return obj.destroy(); |
198 |
| - }).then(() => { |
199 |
| - expect(saveSpy).toHaveBeenCalled(); |
200 |
| - const saveArgs = saveSpy.calls.mostRecent().args; |
201 |
| - expect(saveArgs.length).toBe(4); |
202 |
| - expect(saveArgs[0]).toBe('Yolo'); |
203 |
| - expect(saveArgs[3]).toEqual({ |
204 |
| - get: {}, |
205 |
| - addField: {}, |
206 |
| - create: {'*': true}, |
207 |
| - find: {}, |
208 |
| - update: {}, |
209 |
| - delete: {'*': true}, |
210 |
| - }); |
211 |
| - |
212 |
| - expect(deleteSpy).toHaveBeenCalled(); |
213 |
| - const deleteArgs = deleteSpy.calls.mostRecent().args; |
214 |
| - expect(deleteArgs.length).toBe(4); |
215 |
| - expect(deleteArgs[0]).toBe('Yolo'); |
216 |
| - expect(deleteArgs[3]).toEqual({ |
217 |
| - get: {}, |
218 |
| - addField: {}, |
219 |
| - create: {'*': true}, |
220 |
| - find: {}, |
221 |
| - update: {}, |
222 |
| - delete: {'*': true}, |
223 |
| - }); |
224 |
| - done(); |
225 |
| - }).catch(done.fail); |
226 |
| - }); |
227 |
| - |
228 |
| - |
229 | 150 | it('can handle connect command', function() {
|
230 | 151 | var parseLiveQueryServer = new ParseLiveQueryServer(10, 10, {});
|
231 | 152 | var parseWebSocket = {
|
@@ -1431,3 +1352,126 @@ describe('ParseLiveQueryServer', function() {
|
1431 | 1352 | return message;
|
1432 | 1353 | }
|
1433 | 1354 | });
|
| 1355 | + |
| 1356 | +describe('LiveQueryController', () => { |
| 1357 | + it('properly passes the CLP to afterSave/afterDelete hook', function(done) { |
| 1358 | + function setPermissionsOnClass(className, permissions, doPut) { |
| 1359 | + var request = require('request'); |
| 1360 | + let op = request.post; |
| 1361 | + if (doPut) |
| 1362 | + { |
| 1363 | + op = request.put; |
| 1364 | + } |
| 1365 | + return new Promise((resolve, reject) => { |
| 1366 | + op({ |
| 1367 | + url: Parse.serverURL + '/schemas/' + className, |
| 1368 | + headers: { |
| 1369 | + 'X-Parse-Application-Id': Parse.applicationId, |
| 1370 | + 'X-Parse-Master-Key': Parse.masterKey, |
| 1371 | + }, |
| 1372 | + json: true, |
| 1373 | + body: { |
| 1374 | + classLevelPermissions: permissions |
| 1375 | + } |
| 1376 | + }, (error, response, body) => { |
| 1377 | + if (error) { |
| 1378 | + return reject(error); |
| 1379 | + } |
| 1380 | + if (body.error) { |
| 1381 | + return reject(body); |
| 1382 | + } |
| 1383 | + return resolve(body); |
| 1384 | + }) |
| 1385 | + }); |
| 1386 | + } |
| 1387 | + |
| 1388 | + let saveSpy; |
| 1389 | + let deleteSpy; |
| 1390 | + reconfigureServer({ |
| 1391 | + liveQuery: { |
| 1392 | + classNames: ['Yolo'] |
| 1393 | + } |
| 1394 | + }).then((parseServer) => { |
| 1395 | + saveSpy = spyOn(parseServer.config.liveQueryController, 'onAfterSave').and.callThrough(); |
| 1396 | + deleteSpy = spyOn(parseServer.config.liveQueryController, 'onAfterDelete').and.callThrough(); |
| 1397 | + return setPermissionsOnClass('Yolo', { |
| 1398 | + create: {'*': true}, |
| 1399 | + delete: {'*': true} |
| 1400 | + }) |
| 1401 | + }).then(() => { |
| 1402 | + const obj = new Parse.Object('Yolo'); |
| 1403 | + return obj.save(); |
| 1404 | + }).then((obj) => { |
| 1405 | + return obj.destroy(); |
| 1406 | + }).then(() => { |
| 1407 | + expect(saveSpy).toHaveBeenCalled(); |
| 1408 | + const saveArgs = saveSpy.calls.mostRecent().args; |
| 1409 | + expect(saveArgs.length).toBe(4); |
| 1410 | + expect(saveArgs[0]).toBe('Yolo'); |
| 1411 | + expect(saveArgs[3]).toEqual({ |
| 1412 | + get: {}, |
| 1413 | + addField: {}, |
| 1414 | + create: {'*': true}, |
| 1415 | + find: {}, |
| 1416 | + update: {}, |
| 1417 | + delete: {'*': true}, |
| 1418 | + }); |
| 1419 | + |
| 1420 | + expect(deleteSpy).toHaveBeenCalled(); |
| 1421 | + const deleteArgs = deleteSpy.calls.mostRecent().args; |
| 1422 | + expect(deleteArgs.length).toBe(4); |
| 1423 | + expect(deleteArgs[0]).toBe('Yolo'); |
| 1424 | + expect(deleteArgs[3]).toEqual({ |
| 1425 | + get: {}, |
| 1426 | + addField: {}, |
| 1427 | + create: {'*': true}, |
| 1428 | + find: {}, |
| 1429 | + update: {}, |
| 1430 | + delete: {'*': true}, |
| 1431 | + }); |
| 1432 | + done(); |
| 1433 | + }).catch(done.fail); |
| 1434 | + }); |
| 1435 | + |
| 1436 | + it('should properly pack message request on afterSave', () => { |
| 1437 | + const controller = new LiveQueryController({ |
| 1438 | + classNames: ['Yolo'], |
| 1439 | + }); |
| 1440 | + const spy = spyOn(controller.liveQueryPublisher, 'onCloudCodeAfterSave'); |
| 1441 | + controller.onAfterSave('Yolo', {o: 1}, {o:2}, {yolo: true}); |
| 1442 | + expect(spy).toHaveBeenCalled() |
| 1443 | + const args = spy.calls.mostRecent().args; |
| 1444 | + expect(args.length).toBe(1); |
| 1445 | + expect(args[0]).toEqual({ |
| 1446 | + object: {o: 1}, |
| 1447 | + original: {o: 2}, |
| 1448 | + classLevelPermissions: {yolo: true} |
| 1449 | + }) |
| 1450 | + }); |
| 1451 | + |
| 1452 | + it('should properly pack message request on afterDelete', () => { |
| 1453 | + const controller = new LiveQueryController({ |
| 1454 | + classNames: ['Yolo'], |
| 1455 | + }); |
| 1456 | + const spy = spyOn(controller.liveQueryPublisher, 'onCloudCodeAfterDelete'); |
| 1457 | + controller.onAfterDelete('Yolo', {o: 1}, {o:2}, {yolo: true}); |
| 1458 | + expect(spy).toHaveBeenCalled() |
| 1459 | + const args = spy.calls.mostRecent().args; |
| 1460 | + expect(args.length).toBe(1); |
| 1461 | + expect(args[0]).toEqual({ |
| 1462 | + object: {o: 1}, |
| 1463 | + original: {o: 2}, |
| 1464 | + classLevelPermissions: {yolo: true} |
| 1465 | + }) |
| 1466 | + }); |
| 1467 | + |
| 1468 | + it('should properly pack message request', () => { |
| 1469 | + const controller = new LiveQueryController({ |
| 1470 | + classNames: ['Yolo'], |
| 1471 | + }); |
| 1472 | + expect(controller._makePublisherRequest({})).toEqual({ |
| 1473 | + object: {}, |
| 1474 | + original: undefined, |
| 1475 | + }); |
| 1476 | + }); |
| 1477 | +}); |
0 commit comments