Skip to content

Commit a43638f

Browse files
authored
test: improve transaction tests to use async/await (#7759)
1 parent d05fb9f commit a43638f

File tree

2 files changed

+200
-296
lines changed

2 files changed

+200
-296
lines changed

spec/ParseServerRESTController.spec.js

Lines changed: 109 additions & 212 deletions
Original file line numberDiff line numberDiff line change
@@ -15,35 +15,18 @@ describe('ParseServerRESTController', () => {
1515
);
1616
});
1717

18-
it('should handle a get request', done => {
19-
RESTController.request('GET', '/classes/MyObject').then(
20-
res => {
21-
expect(res.results.length).toBe(0);
22-
done();
23-
},
24-
err => {
25-
console.log(err);
26-
jfail(err);
27-
done();
28-
}
29-
);
18+
it('should handle a get request', async () => {
19+
const res = await RESTController.request('GET', '/classes/MyObject');
20+
expect(res.results.length).toBe(0);
3021
});
3122

32-
it('should handle a get request with full serverURL mount path', done => {
33-
RESTController.request('GET', '/1/classes/MyObject').then(
34-
res => {
35-
expect(res.results.length).toBe(0);
36-
done();
37-
},
38-
err => {
39-
jfail(err);
40-
done();
41-
}
42-
);
23+
it('should handle a get request with full serverURL mount path', async () => {
24+
const res = await RESTController.request('GET', '/1/classes/MyObject');
25+
expect(res.results.length).toBe(0);
4326
});
4427

45-
it('should handle a POST batch without transaction', done => {
46-
RESTController.request('POST', 'batch', {
28+
it('should handle a POST batch without transaction', async () => {
29+
const res = await RESTController.request('POST', 'batch', {
4730
requests: [
4831
{
4932
method: 'GET',
@@ -59,20 +42,12 @@ describe('ParseServerRESTController', () => {
5942
path: '/classes/MyObject',
6043
},
6144
],
62-
}).then(
63-
res => {
64-
expect(res.length).toBe(3);
65-
done();
66-
},
67-
err => {
68-
jfail(err);
69-
done();
70-
}
71-
);
45+
});
46+
expect(res.length).toBe(3);
7247
});
7348

74-
it('should handle a POST batch with transaction=false', done => {
75-
RESTController.request('POST', 'batch', {
49+
it('should handle a POST batch with transaction=false', async () => {
50+
const res = await RESTController.request('POST', 'batch', {
7651
requests: [
7752
{
7853
method: 'GET',
@@ -89,16 +64,8 @@ describe('ParseServerRESTController', () => {
8964
},
9065
],
9166
transaction: false,
92-
}).then(
93-
res => {
94-
expect(res.length).toBe(3);
95-
done();
96-
},
97-
err => {
98-
jfail(err);
99-
done();
100-
}
101-
);
67+
});
68+
expect(res.length).toBe(3);
10269
});
10370

10471
it('should handle response status', async () => {
@@ -186,54 +153,43 @@ describe('ParseServerRESTController', () => {
186153
}
187154
});
188155

189-
it('should handle a batch request with transaction = true', async done => {
190-
await reconfigureServer();
156+
it('should handle a batch request with transaction = true', async () => {
191157
const myObject = new Parse.Object('MyObject'); // This is important because transaction only works on pre-existing collections
192-
myObject
193-
.save()
194-
.then(() => {
195-
return myObject.destroy();
196-
})
197-
.then(() => {
198-
spyOn(databaseAdapter, 'createObject').and.callThrough();
199-
200-
return RESTController.request('POST', 'batch', {
201-
requests: [
202-
{
203-
method: 'POST',
204-
path: '/1/classes/MyObject',
205-
body: { key: 'value1' },
206-
},
207-
{
208-
method: 'POST',
209-
path: '/1/classes/MyObject',
210-
body: { key: 'value2' },
211-
},
212-
],
213-
transaction: true,
214-
}).then(response => {
215-
expect(response.length).toEqual(2);
216-
expect(response[0].success.objectId).toBeDefined();
217-
expect(response[0].success.createdAt).toBeDefined();
218-
expect(response[1].success.objectId).toBeDefined();
219-
expect(response[1].success.createdAt).toBeDefined();
220-
const query = new Parse.Query('MyObject');
221-
return query.find().then(results => {
222-
expect(databaseAdapter.createObject.calls.count() % 2).toBe(0);
223-
for (let i = 0; i + 1 < databaseAdapter.createObject.calls.length; i = i + 2) {
224-
expect(databaseAdapter.createObject.calls.argsFor(i)[3]).toBe(
225-
databaseAdapter.createObject.calls.argsFor(i + 1)[3]
226-
);
227-
}
228-
expect(results.map(result => result.get('key')).sort()).toEqual([
229-
'value1',
230-
'value2',
231-
]);
232-
done();
233-
});
234-
});
235-
})
236-
.catch(done.fail);
158+
await myObject.save();
159+
await myObject.destroy();
160+
spyOn(databaseAdapter, 'createObject').and.callThrough();
161+
const response = await RESTController.request('POST', 'batch', {
162+
requests: [
163+
{
164+
method: 'POST',
165+
path: '/1/classes/MyObject',
166+
body: { key: 'value1' },
167+
},
168+
{
169+
method: 'POST',
170+
path: '/1/classes/MyObject',
171+
body: { key: 'value2' },
172+
},
173+
],
174+
transaction: true,
175+
});
176+
expect(response.length).toEqual(2);
177+
expect(response[0].success.objectId).toBeDefined();
178+
expect(response[0].success.createdAt).toBeDefined();
179+
expect(response[1].success.objectId).toBeDefined();
180+
expect(response[1].success.createdAt).toBeDefined();
181+
const query = new Parse.Query('MyObject');
182+
const results = await query.find();
183+
expect(databaseAdapter.createObject.calls.count() % 2).toBe(0);
184+
for (let i = 0; i + 1 < databaseAdapter.createObject.calls.length; i = i + 2) {
185+
expect(databaseAdapter.createObject.calls.argsFor(i)[3]).toBe(
186+
databaseAdapter.createObject.calls.argsFor(i + 1)[3]
187+
);
188+
}
189+
expect(results.map(result => result.get('key')).sort()).toEqual([
190+
'value1',
191+
'value2',
192+
]);
237193
});
238194

239195
it('should not save anything when one operation fails in a transaction', async () => {
@@ -560,21 +516,11 @@ describe('ParseServerRESTController', () => {
560516
});
561517
}
562518

563-
it('should handle a POST request', done => {
564-
RESTController.request('POST', '/classes/MyObject', { key: 'value' })
565-
.then(() => {
566-
return RESTController.request('GET', '/classes/MyObject');
567-
})
568-
.then(res => {
569-
expect(res.results.length).toBe(1);
570-
expect(res.results[0].key).toEqual('value');
571-
done();
572-
})
573-
.catch(err => {
574-
console.log(err);
575-
jfail(err);
576-
done();
577-
});
519+
it('should handle a POST request', async () => {
520+
await RESTController.request('POST', '/classes/MyObject', { key: 'value' });
521+
const res = await RESTController.request('GET', '/classes/MyObject');
522+
expect(res.results.length).toBe(1);
523+
expect(res.results[0].key).toEqual('value');
578524
});
579525

580526
it('should handle a POST request with context', async () => {
@@ -593,125 +539,76 @@ describe('ParseServerRESTController', () => {
593539
);
594540
});
595541

596-
it('ensures sessionTokens are properly handled', done => {
597-
let userId;
598-
Parse.User.signUp('user', 'pass')
599-
.then(user => {
600-
userId = user.id;
601-
const sessionToken = user.getSessionToken();
602-
return RESTController.request('GET', '/users/me', undefined, {
603-
sessionToken,
604-
});
605-
})
606-
.then(res => {
607-
// Result is in JSON format
608-
expect(res.objectId).toEqual(userId);
609-
done();
610-
})
611-
.catch(err => {
612-
console.log(err);
613-
jfail(err);
614-
done();
615-
});
542+
it('ensures sessionTokens are properly handled', async () => {
543+
const user = await Parse.User.signUp('user', 'pass');
544+
const sessionToken = user.getSessionToken();
545+
const res = await RESTController.request('GET', '/users/me', undefined, {
546+
sessionToken,
547+
});
548+
// Result is in JSON format
549+
expect(res.objectId).toEqual(user.id);
616550
});
617551

618-
it('ensures masterKey is properly handled', done => {
619-
let userId;
620-
Parse.User.signUp('user', 'pass')
621-
.then(user => {
622-
userId = user.id;
623-
return Parse.User.logOut().then(() => {
624-
return RESTController.request('GET', '/classes/_User', undefined, {
625-
useMasterKey: true,
626-
});
627-
});
628-
})
629-
.then(
630-
res => {
631-
expect(res.results.length).toBe(1);
632-
expect(res.results[0].objectId).toEqual(userId);
633-
done();
634-
},
635-
err => {
636-
jfail(err);
637-
done();
638-
}
639-
);
552+
it('ensures masterKey is properly handled', async () => {
553+
const user = await Parse.User.signUp('user', 'pass');
554+
const userId = user.id;
555+
await Parse.User.logOut();
556+
const res = await RESTController.request('GET', '/classes/_User', undefined, {
557+
useMasterKey: true,
558+
});
559+
expect(res.results.length).toBe(1);
560+
expect(res.results[0].objectId).toEqual(userId);
640561
});
641562

642-
it('ensures no user is created when passing an empty username', done => {
643-
RESTController.request('POST', '/classes/_User', {
644-
username: '',
645-
password: 'world',
646-
}).then(
647-
() => {
648-
jfail(new Error('Success callback should not be called when passing an empty username.'));
649-
done();
650-
},
651-
err => {
652-
expect(err.code).toBe(Parse.Error.USERNAME_MISSING);
653-
expect(err.message).toBe('bad or missing username');
654-
done();
655-
}
656-
);
563+
it('ensures no user is created when passing an empty username', async () => {
564+
try {
565+
await RESTController.request('POST', '/classes/_User', {
566+
username: '',
567+
password: 'world',
568+
});
569+
fail('Success callback should not be called when passing an empty username.');
570+
} catch (err) {
571+
expect(err.code).toBe(Parse.Error.USERNAME_MISSING);
572+
expect(err.message).toBe('bad or missing username');
573+
}
657574
});
658575

659-
it('ensures no user is created when passing an empty password', done => {
660-
RESTController.request('POST', '/classes/_User', {
661-
username: 'hello',
662-
password: '',
663-
}).then(
664-
() => {
665-
jfail(new Error('Success callback should not be called when passing an empty password.'));
666-
done();
667-
},
668-
err => {
669-
expect(err.code).toBe(Parse.Error.PASSWORD_MISSING);
670-
expect(err.message).toBe('password is required');
671-
done();
672-
}
673-
);
576+
it('ensures no user is created when passing an empty password', async () => {
577+
try {
578+
await RESTController.request('POST', '/classes/_User', {
579+
username: 'hello',
580+
password: '',
581+
});
582+
fail('Success callback should not be called when passing an empty password.');
583+
} catch (err) {
584+
expect(err.code).toBe(Parse.Error.PASSWORD_MISSING);
585+
expect(err.message).toBe('password is required');
586+
}
674587
});
675588

676-
it('ensures no session token is created on creating users', done => {
677-
RESTController.request('POST', '/classes/_User', {
589+
it('ensures no session token is created on creating users', async () => {
590+
const user = await RESTController.request('POST', '/classes/_User', {
678591
username: 'hello',
679592
password: 'world',
680-
})
681-
.then(user => {
682-
expect(user.sessionToken).toBeUndefined();
683-
const query = new Parse.Query('_Session');
684-
return query.find({ useMasterKey: true });
685-
})
686-
.then(sessions => {
687-
expect(sessions.length).toBe(0);
688-
done();
689-
}, done.fail);
593+
});
594+
expect(user.sessionToken).toBeUndefined();
595+
const query = new Parse.Query('_Session');
596+
const sessions = await query.find({ useMasterKey: true });
597+
expect(sessions.length).toBe(0);
690598
});
691599

692-
it('ensures a session token is created when passing installationId != cloud', done => {
693-
RESTController.request(
600+
it('ensures a session token is created when passing installationId != cloud', async () => {
601+
const user = await RESTController.request(
694602
'POST',
695603
'/classes/_User',
696604
{ username: 'hello', password: 'world' },
697605
{ installationId: 'my-installation' }
698-
)
699-
.then(user => {
700-
expect(user.sessionToken).not.toBeUndefined();
701-
const query = new Parse.Query('_Session');
702-
return query.find({ useMasterKey: true });
703-
})
704-
.then(
705-
sessions => {
706-
expect(sessions.length).toBe(1);
707-
expect(sessions[0].get('installationId')).toBe('my-installation');
708-
done();
709-
},
710-
err => {
711-
jfail(err);
712-
done();
713-
}
714-
);
606+
);
607+
expect(user.sessionToken).not.toBeUndefined();
608+
const query = new Parse.Query('_Session');
609+
const sessions = await query.find({ useMasterKey: true });
610+
expect(sessions.length).toBe(1);
611+
expect(sessions[0].get('installationId')).toBe('my-installation');
715612
});
716613

717614
it('ensures logIn is saved with installationId', async () => {

0 commit comments

Comments
 (0)