Skip to content

Commit 5625eb1

Browse files
dplewisdavimacedo
authored andcommitted
User signup with installationId (#1031)
Fixes: #536 Parse.User.signUp actually does a ParseObject.save() at its core which does not send an installationId. This is useful to prevent invalid session token and tests session clean up.
1 parent e974daf commit 5625eb1

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

integration/test/ParseUserTest.js

+35
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,41 @@ describe('Parse User', () => {
109109
});
110110
});
111111

112+
it('can login users with installationId', async () => {
113+
Parse.User.enableUnsafeCurrentUser();
114+
const currentInstallation = await Parse.CoreManager.getInstallationController().currentInstallationId();
115+
const installationId = '12345678';
116+
const user = new Parse.User();
117+
user.set('username', 'parse');
118+
user.set('password', 'mypass');
119+
await user.signUp(null, { installationId });
120+
121+
const query = new Parse.Query(Parse.Session);
122+
query.equalTo('user', user);
123+
const result = await query.first({ useMasterKey: true });
124+
expect(result.get('installationId')).toBe(installationId);
125+
expect(result.get('sessionToken')).toBe(user.getSessionToken());
126+
127+
// Should not clean up sessions
128+
const loggedUser = await Parse.User.logIn('parse', 'mypass');
129+
const sessionQuery = new Parse.Query(Parse.Session);
130+
let sessions = await sessionQuery.find({ useMasterKey: true });
131+
expect(sessions.length).toBe(2);
132+
expect(sessions[0].get('installationId')).toBe(installationId);
133+
expect(sessions[1].get('installationId')).toBe(currentInstallation);
134+
expect(sessions[0].get('sessionToken')).toBe(user.getSessionToken());
135+
expect(sessions[1].get('sessionToken')).toBe(loggedUser.getSessionToken());
136+
137+
// Should clean up sessions
138+
const installationUser = await Parse.User.logIn('parse', 'mypass', { installationId });
139+
sessions = await sessionQuery.find({ useMasterKey: true });
140+
expect(sessions.length).toBe(2);
141+
expect(sessions[0].get('installationId')).toBe(currentInstallation);
142+
expect(sessions[1].get('installationId')).toBe(installationId);
143+
expect(sessions[0].get('sessionToken')).toBe(loggedUser.getSessionToken());
144+
expect(sessions[1].get('sessionToken')).toBe(installationUser.getSessionToken());
145+
});
146+
112147
it('can become a user', (done) => {
113148
Parse.User.enableUnsafeCurrentUser();
114149
let session = null;

src/ParseObject.js

+3
Original file line numberDiff line numberDiff line change
@@ -1232,6 +1232,9 @@ class ParseObject {
12321232
if (options.hasOwnProperty('sessionToken') && typeof options.sessionToken === 'string') {
12331233
saveOptions.sessionToken = options.sessionToken;
12341234
}
1235+
if (options.hasOwnProperty('installationId') && typeof options.installationId === 'string') {
1236+
saveOptions.installationId = options.installationId;
1237+
}
12351238
const controller = CoreManager.getObjectController();
12361239
const unsaved = options.cascadeSave !== false ? unsavedChildren(this) : null;
12371240
return controller.save(unsaved, saveOptions).then(() => {

src/__tests__/ParseUser-test.js

+53
Original file line numberDiff line numberDiff line change
@@ -1009,4 +1009,57 @@ describe('ParseUser', () => {
10091009
const authProvider = user.linkWith.mock.calls[0][0];
10101010
expect(authProvider).toBe('testProvider');
10111011
});
1012+
1013+
it('can static signup a user with installationId', async () => {
1014+
ParseUser.disableUnsafeCurrentUser();
1015+
ParseUser._clearCache();
1016+
const installationId = '12345678';
1017+
CoreManager.setRESTController({
1018+
request(method, path, body, options) {
1019+
expect(method).toBe('POST');
1020+
expect(path).toBe('users');
1021+
console.log(options);
1022+
expect(options.installationId).toBe(installationId);
1023+
return Promise.resolve({
1024+
objectId: 'uid3',
1025+
username: 'username',
1026+
sessionToken: '123abc'
1027+
}, 200);
1028+
},
1029+
ajax() {}
1030+
});
1031+
1032+
const user = await ParseUser.signUp('username', 'password', null, { installationId });
1033+
expect(user.id).toBe('uid3');
1034+
expect(user.isCurrent()).toBe(false);
1035+
expect(user.existed()).toBe(true);
1036+
});
1037+
1038+
it('can signup a user with installationId', async () => {
1039+
ParseUser.disableUnsafeCurrentUser();
1040+
ParseUser._clearCache();
1041+
const installationId = '12345678';
1042+
CoreManager.setRESTController({
1043+
request(method, path, body, options) {
1044+
expect(method).toBe('POST');
1045+
expect(path).toBe('users');
1046+
console.log(options);
1047+
expect(options.installationId).toBe(installationId);
1048+
return Promise.resolve({
1049+
objectId: 'uid3',
1050+
username: 'username',
1051+
sessionToken: '123abc'
1052+
}, 200);
1053+
},
1054+
ajax() {}
1055+
});
1056+
1057+
const user = new ParseUser();
1058+
user.setUsername('name');
1059+
user.setPassword('pass');
1060+
await user.signUp(null, { installationId });
1061+
expect(user.id).toBe('uid3');
1062+
expect(user.isCurrent()).toBe(false);
1063+
expect(user.existed()).toBe(true);
1064+
});
10121065
});

0 commit comments

Comments
 (0)