Skip to content

Commit 77e4068

Browse files
authored
Fix user.become for AsyncStorage (#1056)
* Fix user.become for AsyncStorage Closes: #1052 * lint!!!
1 parent ac38333 commit 77e4068

File tree

3 files changed

+59
-5
lines changed

3 files changed

+59
-5
lines changed

src/ParseUser.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -891,16 +891,15 @@ const DefaultController = {
891891
return Storage.removeItemAsync(path);
892892
},
893893

894-
setCurrentUser(user) {
895-
const currentUser = this.currentUser();
896-
let promise = Promise.resolve();
894+
async setCurrentUser(user) {
895+
const currentUser = await this.currentUserAsync();
897896
if (currentUser && !user.equals(currentUser) && AnonymousUtils.isLinked(currentUser)) {
898-
promise = currentUser.destroy({ sessionToken: currentUser.getSessionToken() })
897+
await currentUser.destroy({ sessionToken: currentUser.getSessionToken() })
899898
}
900899
currentUserCache = user;
901900
user._cleanupAuthData();
902901
user._synchronizeAllAuthData();
903-
return promise.then(() => DefaultController.updateUserOnDisk(user));
902+
return DefaultController.updateUserOnDisk(user);
904903
},
905904

906905
currentUser(): ?ParseUser {

src/__tests__/ParseUser-test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ jest.mock('uuid/v4', () => {
3535
return () => value++;
3636
});
3737
jest.dontMock('./test_helpers/mockXHR');
38+
jest.dontMock('./test_helpers/mockAsyncStorage');
3839

40+
const mockAsyncStorage = require('./test_helpers/mockAsyncStorage');
3941
const CoreManager = require('../CoreManager');
4042
const CryptoController = require('../CryptoController');
4143
const LocalDatastore = require('../LocalDatastore');
@@ -299,6 +301,34 @@ describe('ParseUser', () => {
299301
});
300302
});
301303

304+
it('can become a user with async storage', async () => {
305+
const currentStorage = CoreManager.getStorageController();
306+
CoreManager.setStorageController(mockAsyncStorage);
307+
ParseUser.enableUnsafeCurrentUser();
308+
ParseUser._clearCache();
309+
CoreManager.setRESTController({
310+
request(method, path, body, options) {
311+
expect(method).toBe('GET');
312+
expect(path).toBe('users/me');
313+
expect(options.sessionToken).toBe('123abc');
314+
315+
return Promise.resolve({
316+
objectId: 'uid3',
317+
username: 'username',
318+
sessionToken: '123abc'
319+
}, 200);
320+
},
321+
ajax() {}
322+
});
323+
324+
const u = await ParseUser.become('123abc');
325+
expect(u.id).toBe('uid3');
326+
expect(u.isCurrent()).toBe(true);
327+
expect(u.existed()).toBe(true);
328+
CoreManager.setStorageController(currentStorage);
329+
});
330+
331+
302332
it('can hydrate a user with sessionToken in server environment', async () => {
303333
ParseUser.enableUnsafeCurrentUser();
304334
ParseUser._clearCache();
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
let mockStorage = {};
2+
const mockAsyncStorage = {
3+
async: 1,
4+
async getItemAsync(path) {
5+
return mockStorage[path];
6+
},
7+
8+
async setItemAsync(path, value) {
9+
mockStorage[path] = value;
10+
},
11+
12+
async removeItemAsync(path) {
13+
delete mockStorage[path];
14+
},
15+
16+
async getAllKeysAsync() {
17+
return Object.keys(mockStorage);
18+
},
19+
20+
clear() {
21+
mockStorage = {};
22+
},
23+
};
24+
25+
module.exports = mockAsyncStorage;

0 commit comments

Comments
 (0)