diff --git a/src/ParseUser.js b/src/ParseUser.js index 8ba9ba8c0..e285c7127 100644 --- a/src/ParseUser.js +++ b/src/ParseUser.js @@ -1208,8 +1208,14 @@ const DefaultController = { logOut(options: RequestOptions): Promise { const RESTController = CoreManager.getRESTController(); + const promiseCatch = e => { + if (e.code === ParseError.INVALID_SESSION_TOKEN && options.clearSession) { + return; + } + throw e; + }; if (options.sessionToken) { - return RESTController.request('POST', 'logout', {}, options); + return RESTController.request('POST', 'logout', {}, options).catch(promiseCatch); } return DefaultController.currentUserAsync().then(currentUser => { const path = Storage.generatePath(CURRENT_USER_KEY); @@ -1217,9 +1223,11 @@ const DefaultController = { if (currentUser !== null) { const currentSession = currentUser.getSessionToken(); if (currentSession && isRevocableSession(currentSession)) { - promise = promise.then(() => { - return RESTController.request('POST', 'logout', {}, { sessionToken: currentSession }); - }); + promise = promise + .then(() => { + return RESTController.request('POST', 'logout', {}, { sessionToken: currentSession }); + }) + .catch(promiseCatch); } currentUser._logOutWithAll(); currentUser._finishFetch({ sessionToken: undefined }); diff --git a/src/__tests__/ParseUser-test.js b/src/__tests__/ParseUser-test.js index 631842b8e..c9cfa3f7e 100644 --- a/src/__tests__/ParseUser-test.js +++ b/src/__tests__/ParseUser-test.js @@ -1039,6 +1039,40 @@ describe('ParseUser', () => { }); }); + it('can logout user with clear session', async () => { + ParseUser.disableUnsafeCurrentUser(); + ParseUser._clearCache(); + Storage._clear(); + const RESTController = { + request() { + const error = new ParseError(ParseError.INVALID_SESSION_TOKEN, 'Invalid session token.'); + return Promise.reject(error); + }, + ajax() {}, + }; + jest.spyOn(RESTController, 'request'); + CoreManager.setRESTController(RESTController); + + await ParseUser.logOut({ clearSession: true }); + }); + + it('can logout user with clear session and session token', async () => { + ParseUser.disableUnsafeCurrentUser(); + ParseUser._clearCache(); + Storage._clear(); + const RESTController = { + request() { + const error = new ParseError(ParseError.INVALID_SESSION_TOKEN, 'Invalid session token.'); + return Promise.reject(error); + }, + ajax() {}, + }; + jest.spyOn(RESTController, 'request'); + CoreManager.setRESTController(RESTController); + + await ParseUser.logOut({ sessionToken: '1234', clearSession: true }); + }); + it('can retreive a user with sessionToken (me)', async () => { ParseUser.disableUnsafeCurrentUser(); ParseUser._clearCache();