Skip to content

Commit 7f11f59

Browse files
committed
feat: Upgrade to Parse JavaScript SDK 4 (parse-community#8332)
1 parent e2937b3 commit 7f11f59

File tree

2 files changed

+71
-110
lines changed

2 files changed

+71
-110
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
"mime": "3.0.0",
4949
"mongodb": "4.10.0",
5050
"mustache": "4.2.0",
51-
"parse": "3.4.2",
51+
"parse": "4.0.0",
5252
"path-to-regexp": "0.1.7",
5353
"pg-monitor": "1.5.0",
5454
"pg-promise": "10.12.1",

spec/ParseLiveQuery.spec.js

Lines changed: 70 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ const validatorFail = () => {
77
};
88

99
describe('ParseLiveQuery', function () {
10+
beforeEach(() => {
11+
Parse.CoreManager.getLiveQueryController().setDefaultLiveQueryClient(null);
12+
});
13+
afterEach(async () => {
14+
const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient();
15+
client.close();
16+
// Wait for live query client to disconnect
17+
await new Promise(resolve => setTimeout(resolve, 1000));
18+
});
1019
it('access user on onLiveQueryEvent disconnect', async done => {
1120
await reconfigureServer({
1221
liveQuery: {
@@ -16,7 +25,6 @@ describe('ParseLiveQuery', function () {
1625
verbose: false,
1726
silent: true,
1827
});
19-
Parse.CoreManager.getLiveQueryController().setDefaultLiveQueryClient(null);
2028
const requestedUser = new Parse.User();
2129
requestedUser.setUsername('username');
2230
requestedUser.setPassword('password');
@@ -513,88 +521,77 @@ describe('ParseLiveQuery', function () {
513521
classNames: ['TestObject'],
514522
},
515523
startLiveQueryServer: true,
516-
verbose: false,
517-
silent: true,
518524
});
519525
const object = new TestObject();
520526
await object.save();
521-
522-
Parse.Cloud.beforeSubscribe('TestObject', req => {
523-
expect(req.op).toBe('subscribe');
524-
expect(req.requestId).toBe(1);
525-
expect(req.query).toBeDefined();
526-
expect(req.user).toBeUndefined();
527-
});
528-
529-
Parse.Cloud.beforeConnect(req => {
530-
expect(req.event).toBe('connect');
531-
expect(req.clients).toBe(0);
532-
expect(req.subscriptions).toBe(0);
533-
expect(req.useMasterKey).toBe(false);
534-
expect(req.installationId).toBeDefined();
535-
expect(req.user).toBeUndefined();
536-
expect(req.client).toBeDefined();
537-
});
527+
const hooks = {
528+
beforeSubscribe(req) {
529+
expect(req.op).toBe('subscribe');
530+
expect(req.requestId).toBe(1);
531+
expect(req.query).toBeDefined();
532+
expect(req.user).toBeUndefined();
533+
},
534+
beforeConnect(req) {
535+
expect(req.event).toBe('connect');
536+
expect(req.clients).toBe(0);
537+
expect(req.subscriptions).toBe(0);
538+
expect(req.useMasterKey).toBe(false);
539+
expect(req.installationId).toBeDefined();
540+
expect(req.user).toBeUndefined();
541+
expect(req.client).toBeDefined();
542+
},
543+
};
544+
spyOn(hooks, 'beforeSubscribe').and.callThrough();
545+
spyOn(hooks, 'beforeConnect').and.callThrough();
546+
Parse.Cloud.beforeSubscribe('TestObject', hooks.beforeSubscribe);
547+
Parse.Cloud.beforeConnect(hooks.beforeConnect);
538548
const query = new Parse.Query(TestObject);
539549
query.equalTo('objectId', object.id);
540550
const subscription = await query.subscribe();
541551
subscription.on('update', object => {
542552
expect(object.get('foo')).toBe('bar');
553+
expect(hooks.beforeConnect).toHaveBeenCalled();
554+
expect(hooks.beforeSubscribe).toHaveBeenCalled();
543555
done();
544556
});
545557
object.set({ foo: 'bar' });
546558
await object.save();
547559
});
548560

549-
it('can handle beforeConnect validation function', async done => {
561+
it('can handle beforeConnect validation function', async () => {
550562
await reconfigureServer({
551563
liveQuery: {
552564
classNames: ['TestObject'],
553565
},
554566
startLiveQueryServer: true,
555-
verbose: false,
556-
silent: true,
557567
});
558568

559569
const object = new TestObject();
560570
await object.save();
561-
562571
Parse.Cloud.beforeConnect(() => {}, validatorFail);
563-
let complete = false;
564-
Parse.LiveQuery.on('error', error => {
565-
Parse.LiveQuery.removeAllListeners('error');
566-
if (complete) {
567-
return;
568-
}
569-
complete = true;
570-
expect(error).toBe('you are not authorized');
571-
done();
572-
});
573572
const query = new Parse.Query(TestObject);
574573
query.equalTo('objectId', object.id);
575-
await query.subscribe();
574+
await expectAsync(query.subscribe()).toBeRejectedWith(
575+
new Parse.Error(Parse.Error.VALIDATION_ERROR, 'you are not authorized')
576+
);
576577
});
577578

578-
it('can handle beforeSubscribe validation function', async done => {
579+
it('can handle beforeSubscribe validation function', async () => {
579580
await reconfigureServer({
580581
liveQuery: {
581582
classNames: ['TestObject'],
582583
},
583584
startLiveQueryServer: true,
584-
verbose: false,
585-
silent: true,
586585
});
587586
const object = new TestObject();
588587
await object.save();
589588

590589
Parse.Cloud.beforeSubscribe(TestObject, () => {}, validatorFail);
591590
const query = new Parse.Query(TestObject);
592591
query.equalTo('objectId', object.id);
593-
const subscription = await query.subscribe();
594-
subscription.on('error', error => {
595-
expect(error).toBe('you are not authorized');
596-
done();
597-
});
592+
await expectAsync(query.subscribe()).toBeRejectedWith(
593+
new Parse.Error(Parse.Error.VALIDATION_ERROR, 'you are not authorized')
594+
);
598595
});
599596

600597
it('can handle afterEvent validation function', async done => {
@@ -620,29 +617,22 @@ describe('ParseLiveQuery', function () {
620617
await object.save();
621618
});
622619

623-
it('can handle beforeConnect error', async done => {
620+
it('can handle beforeConnect error', async () => {
624621
await reconfigureServer({
625622
liveQuery: {
626623
classNames: ['TestObject'],
627624
},
628625
startLiveQueryServer: true,
629-
verbose: false,
630-
silent: true,
631626
});
632627
const object = new TestObject();
633628
await object.save();
634629

635630
Parse.Cloud.beforeConnect(() => {
636631
throw new Error('You shall not pass!');
637632
});
638-
Parse.LiveQuery.on('error', error => {
639-
Parse.LiveQuery.removeAllListeners('error');
640-
expect(error).toBe('You shall not pass!');
641-
done();
642-
});
643633
const query = new Parse.Query(TestObject);
644634
query.equalTo('objectId', object.id);
645-
await query.subscribe();
635+
await expectAsync(query.subscribe()).toBeRejectedWith(new Error('You shall not pass!'));
646636
});
647637

648638
it('can log on beforeConnect throw', async () => {
@@ -651,8 +641,6 @@ describe('ParseLiveQuery', function () {
651641
classNames: ['TestObject'],
652642
},
653643
startLiveQueryServer: true,
654-
verbose: false,
655-
silent: true,
656644
});
657645

658646
const logger = require('../lib/logger').logger;
@@ -664,40 +652,30 @@ describe('ParseLiveQuery', function () {
664652
foo.bar();
665653
/* eslint-enable no-undef */
666654
});
667-
new Parse.Query(TestObject).subscribe();
668-
await new Promise(resolve => Parse.LiveQuery.on('error', resolve));
669-
Parse.LiveQuery.removeAllListeners('error');
655+
await expectAsync(new Parse.Query(TestObject).subscribe()).toBeRejectedWith(
656+
new Error('foo is not defined')
657+
);
670658
expect(logger.error).toHaveBeenCalledWith(
671659
`Failed running beforeConnect for session ${token} with:\n Error: {"message":"foo is not defined","code":141}`
672660
);
673661
});
674662

675-
it('can handle beforeSubscribe error', async done => {
663+
it('can handle beforeSubscribe error', async () => {
676664
await reconfigureServer({
677665
liveQuery: {
678666
classNames: ['TestObject'],
679667
},
680668
startLiveQueryServer: true,
681-
verbose: false,
682-
silent: true,
683669
});
684670
const object = new TestObject();
685671
await object.save();
686672

687673
Parse.Cloud.beforeSubscribe(TestObject, () => {
688674
throw new Error('You shall not subscribe!');
689675
});
690-
Parse.LiveQuery.on('error', error => {
691-
expect(error).toBe('You shall not subscribe!');
692-
});
693676
const query = new Parse.Query(TestObject);
694677
query.equalTo('objectId', object.id);
695-
const subscription = await query.subscribe();
696-
subscription.on('error', error => {
697-
Parse.LiveQuery.removeAllListeners('error');
698-
expect(error).toBe('You shall not subscribe!');
699-
done();
700-
});
678+
await expectAsync(query.subscribe()).toBeRejectedWith(new Error('You shall not subscribe!'));
701679
});
702680

703681
it('can log on beforeSubscribe error', async () => {
@@ -706,8 +684,6 @@ describe('ParseLiveQuery', function () {
706684
classNames: ['TestObject'],
707685
},
708686
startLiveQueryServer: true,
709-
verbose: false,
710-
silent: true,
711687
});
712688

713689
const logger = require('../lib/logger').logger;
@@ -720,8 +696,7 @@ describe('ParseLiveQuery', function () {
720696
});
721697

722698
const query = new Parse.Query(TestObject);
723-
const subscription = await query.subscribe();
724-
await new Promise(resolve => subscription.on('error', resolve));
699+
await expectAsync(query.subscribe()).toBeRejectedWith(new Error('foo is not defined'));
725700

726701
expect(logger.error).toHaveBeenCalledWith(
727702
`Failed running beforeSubscribe on TestObject for session undefined with:\n Error: {"message":"foo is not defined","code":141}`
@@ -734,29 +709,35 @@ describe('ParseLiveQuery', function () {
734709
classNames: ['TestObject'],
735710
},
736711
startLiveQueryServer: true,
737-
verbose: false,
738-
silent: true,
739-
});
740-
Parse.Cloud.beforeSubscribe(TestObject, request => {
741-
const query = request.query;
742-
query.equalTo('yolo', 'abc');
743712
});
744-
713+
const hook = {
714+
beforeSubscribe(request) {
715+
request.query.equalTo('yolo', 'abc');
716+
},
717+
};
718+
spyOn(hook, 'beforeSubscribe').and.callThrough();
719+
Parse.Cloud.beforeSubscribe('TestObject', hook.beforeSubscribe);
745720
const object = new TestObject();
746721
await object.save();
747722

748-
const query = new Parse.Query(TestObject);
723+
const query = new Parse.Query('TestObject');
749724
query.equalTo('objectId', object.id);
750725
const subscription = await query.subscribe();
751-
752726
subscription.on('update', () => {
753-
fail();
727+
fail('beforeSubscribe should restrict subscription');
754728
});
755-
object.set({ foo: 'bar' });
729+
subscription.on('enter', object => {
730+
if (object.get('yolo') === 'abc') {
731+
done();
732+
} else {
733+
fail('beforeSubscribe should restrict queries');
734+
}
735+
});
736+
object.set({ yolo: 'bar' });
756737
await object.save();
757-
setTimeout(async () => {
758-
done();
759-
}, 1000);
738+
object.set({ yolo: 'abc' });
739+
await object.save();
740+
expect(hook.beforeSubscribe).toHaveBeenCalled();
760741
});
761742

762743
it('can return a new beforeSubscribe query', async done => {
@@ -954,26 +935,15 @@ describe('ParseLiveQuery', function () {
954935
await Parse.User.logIn('username', 'password');
955936
});
956937

957-
it('prevent liveQuery on Session class when not logged in', async done => {
938+
it('prevent liveQuery on Session class when not logged in', async () => {
958939
await reconfigureServer({
959940
liveQuery: {
960941
classNames: [Parse.Session],
961942
},
962943
startLiveQueryServer: true,
963-
verbose: false,
964-
silent: true,
965-
});
966-
967-
Parse.LiveQuery.on('error', error => {
968-
expect(error).toBe('Invalid session token');
969944
});
970945
const query = new Parse.Query(Parse.Session);
971-
const subscription = await query.subscribe();
972-
subscription.on('error', error => {
973-
Parse.LiveQuery.removeAllListeners('error');
974-
expect(error).toBe('Invalid session token');
975-
done();
976-
});
946+
await expectAsync(query.subscribe()).toBeRejectedWith(new Error('Invalid session token'));
977947
});
978948

979949
it('handle invalid websocket payload length', async done => {
@@ -1242,13 +1212,4 @@ describe('ParseLiveQuery', function () {
12421212
object.set({ location: secondPoint });
12431213
await object.save();
12441214
});
1245-
1246-
afterEach(async function (done) {
1247-
const client = await Parse.CoreManager.getLiveQueryController().getDefaultLiveQueryClient();
1248-
client.close();
1249-
// Wait for live query client to disconnect
1250-
setTimeout(() => {
1251-
done();
1252-
}, 1000);
1253-
});
12541215
});

0 commit comments

Comments
 (0)