diff --git a/Parse/src/main/java/com/parse/ParseUser.java b/Parse/src/main/java/com/parse/ParseUser.java index ca6a9676e..2658afeb6 100644 --- a/Parse/src/main/java/com/parse/ParseUser.java +++ b/Parse/src/main/java/com/parse/ParseUser.java @@ -503,10 +503,17 @@ public Task then(Task task) throws Exception { @Override /* package */ void setState(ParseObject.State newState) { - // Avoid clearing sessionToken when updating the current user's State via ParseQuery result - if (isCurrentUser() && getSessionToken() != null - && newState.get("sessionToken") == null) { - newState = newState.newBuilder().put("sessionToken", getSessionToken()).build(); + if (isCurrentUser()) { + State.Builder newStateBuilder = newState.newBuilder(); + // Avoid clearing sessionToken when updating the current user's State via ParseQuery result + if (getSessionToken() != null && newState.get(KEY_SESSION_TOKEN) == null) { + newStateBuilder.put(KEY_SESSION_TOKEN, getSessionToken()); + } + // Avoid clearing authData when updating the current user's State via ParseQuery result + if (getAuthData() != null && newState.get(KEY_AUTH_DATA) == null) { + newStateBuilder.put(KEY_AUTH_DATA, getAuthData()); + } + newState = newStateBuilder.build(); } super.setState(newState); } diff --git a/Parse/src/test/java/com/parse/ParseUserTest.java b/Parse/src/test/java/com/parse/ParseUserTest.java index 0db427134..4688fcaec 100644 --- a/Parse/src/test/java/com/parse/ParseUserTest.java +++ b/Parse/src/test/java/com/parse/ParseUserTest.java @@ -1401,6 +1401,42 @@ public void testRemoveWithUserName() throws Exception { //endregion + //region testSetState + + @Test + public void testSetCurrentUserStateWithoutAuthData() throws Exception { + // Set user initial state + String authType = "facebook"; + Map authData = new HashMap<>(); + authData.put("facebookToken", "facebookTest"); + ParseUser.State userState = new ParseUser.State.Builder() + .objectId("test") + .put("oldKey", "oldValue") + .put("key", "value") + .putAuthData(authType, authData) + .build(); + ParseUser user = ParseObject.from(userState); + user.setIsCurrentUser(true); + // Build new state + ParseUser.State newUserState = new ParseUser.State.Builder() + .objectId("testAgain") + .put("key", "valueAgain") + .build(); + + user.setState(newUserState); + + // Make sure we keep the authData + assertEquals(1, user.getAuthData().size()); + assertEquals(authData, user.getAuthData().get(authType)); + // Make sure old state is deleted + assertFalse(user.has("oldKey")); + // Make sure new state is set + assertEquals("testAgain", user.getObjectId()); + assertEquals("valueAgain", user.get("key")); + } + + //endregion + private static void setLazy(ParseUser user) { Map anonymousAuthData = new HashMap<>(); anonymousAuthData.put("anonymousToken", "anonymousTest");