/*
* Copyright (c) 2015-present, Parse, LLC.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.parse;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
// For Uri.encode
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = TestHelper.ROBOLECTRIC_SDK_VERSION)
public class NetworkUserControllerTest {
@Before
public void setUp() throws MalformedURLException {
ParseRESTCommand.server = new URL("https://api.parse.com/1");
}
@After
public void tearDown() {
ParseRESTCommand.server = null;
}
//region testSignUpAsync
@Test
public void testSignUpAsync() throws Exception {
// Make mock response and client
JSONObject mockResponse = generateBasicMockResponse();
ParseHttpClient restClient =
ParseTestUtils.mockParseHttpClientWithResponse(generateBasicMockResponse(), 200, "OK");
// Make test user state and operationSet
ParseUser.State state = new ParseUser.State.Builder()
.put("username", "testUserName")
.put("password", "testPassword")
.build();
ParseOperationSet operationSet = new ParseOperationSet();
operationSet.put("username", new ParseSetOperation("testUserName"));
operationSet.put("password", new ParseSetOperation("testPassword"));
NetworkUserController controller = new NetworkUserController(restClient, true);
ParseUser.State newState = ParseTaskUtils.wait(
controller.signUpAsync(state, operationSet, "sessionToken"));
verifyBasicUserState(mockResponse, newState);
assertFalse(newState.isComplete());
assertTrue(newState.isNew());
}
//endregion
//region testLoginAsync
@Test
public void testLoginAsyncWithUserNameAndPassword() throws Exception {
// Make mock response and client
JSONObject mockResponse = generateBasicMockResponse();
ParseHttpClient restClient =
ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 200, "OK");
NetworkUserController controller = new NetworkUserController(restClient);
ParseUser.State newState = ParseTaskUtils.wait(controller.logInAsync("userName", "password"));
// Verify user state
verifyBasicUserState(mockResponse, newState);
assertTrue(newState.isComplete());
assertFalse(newState.isNew());
}
@Test
public void testLoginAsyncWithUserStateCreated() throws Exception {
// Make mock response and client
JSONObject mockResponse = generateBasicMockResponse();
ParseHttpClient restClient =
ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 201, "OK");
// Make test user state and operationSet
ParseUser.State state = new ParseUser.State.Builder()
.put("username", "testUserName")
.put("password", "testPassword")
.build();
ParseOperationSet operationSet = new ParseOperationSet();
operationSet.put("username", new ParseSetOperation("testUserName"));
operationSet.put("password", new ParseSetOperation("testPassword"));
NetworkUserController controller = new NetworkUserController(restClient, true);
ParseUser.State newState = ParseTaskUtils.wait(controller.logInAsync(state, operationSet));
// Verify user state
verifyBasicUserState(mockResponse, newState);
assertTrue(newState.isNew());
assertFalse(newState.isComplete());
}
@Test
public void testLoginAsyncWithUserStateNotCreated() throws Exception {
// Make mock response and client
JSONObject mockResponse = generateBasicMockResponse();
ParseHttpClient restClient =
ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 200, "OK");
// Make test user state and operationSet
ParseUser.State state = new ParseUser.State.Builder()
.put("username", "testUserName")
.put("password", "testPassword")
.build();
ParseOperationSet operationSet = new ParseOperationSet();
operationSet.put("username", new ParseSetOperation("testUserName"));
operationSet.put("password", new ParseSetOperation("testPassword"));
NetworkUserController controller = new NetworkUserController(restClient, true);
ParseUser.State newState = ParseTaskUtils.wait(controller.logInAsync(state, operationSet));
// Verify user state
verifyBasicUserState(mockResponse, newState);
assertFalse(newState.isNew());
assertTrue(newState.isComplete());
}
@Test
public void testLoginAsyncWithAuthTypeCreated() throws Exception {
// Make mock response and client
JSONObject mockResponse = generateBasicMockResponse();
mockResponse.put("authData", generateMockAuthData());
ParseHttpClient restClient =
ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 201, "OK");
// Make test user auth data
Map<String, String> facebookAuthInfoMap = new HashMap<>();
facebookAuthInfoMap.put("token", "test");
NetworkUserController controller = new NetworkUserController(restClient, true);
ParseUser.State newState = ParseTaskUtils.wait(
controller.logInAsync("facebook", facebookAuthInfoMap));
// Verify user state
verifyBasicUserState(mockResponse, newState);
assertTrue(newState.isNew());
assertTrue(newState.isComplete());
}
@Test
public void testLoginAsyncWithAuthTypeNotCreated() throws Exception {
// Make mock response and client
JSONObject mockResponse = generateBasicMockResponse();
mockResponse.put("authData", generateMockAuthData());
ParseHttpClient restClient =
ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 200, "OK");
// Make test user auth data
Map<String, String> facebookAuthInfoMap = new HashMap<>();
facebookAuthInfoMap.put("token", "test");
NetworkUserController controller = new NetworkUserController(restClient, true);
ParseUser.State newState = ParseTaskUtils.wait(
controller.logInAsync("facebook", facebookAuthInfoMap));
// Verify user state
verifyBasicUserState(mockResponse, newState);
assertFalse(newState.isNew());
assertTrue(newState.isComplete());
}
//endregion
//region testGetUserAsync
@Test
public void testGetUserAsync() throws Exception {
// Make mock response and client
JSONObject mockResponse = generateBasicMockResponse();
ParseHttpClient restClient =
ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 201, "OK");
NetworkUserController controller = new NetworkUserController(restClient, true);
ParseUser.State newState = ParseTaskUtils.wait(controller.getUserAsync("sessionToken"));
// Verify user state
verifyBasicUserState(mockResponse, newState);
assertTrue(newState.isComplete());
assertFalse(newState.isNew());
}
//endregion
//region testRequestPasswordResetAsync
@Test
public void testRequestPasswordResetAsync() throws Exception {
// Make mock response and client
ParseHttpClient restClient =
ParseTestUtils.mockParseHttpClientWithResponse(new JSONObject(), 200, "OK");
NetworkUserController controller = new NetworkUserController(restClient, true);
// We just need to verify task is finished since sever returns an empty json here
ParseTaskUtils.wait(controller.requestPasswordResetAsync("sessionToken"));
}
//endregion
private JSONObject generateBasicMockResponse() throws JSONException {
JSONObject mockResponse = new JSONObject();
String createAtStr = "2015-08-09T22:15:13.460Z";
mockResponse.put("createdAt", createAtStr);
mockResponse.put("objectId", "testObjectId");
mockResponse.put("sessionToken", "testSessionToken");
mockResponse.put("username", "testUserName");
mockResponse.put("email", "test@parse.com");
return mockResponse;
}
private JSONObject generateMockAuthData() throws JSONException {
JSONObject facebookAuthInfo = new JSONObject();
facebookAuthInfo.put("token", "test");
JSONObject facebookAuthData = new JSONObject();
facebookAuthData.put("facebook", facebookAuthInfo);
return facebookAuthData;
}
private void verifyBasicUserState(JSONObject mockResponse, ParseUser.State state)
throws JSONException {
long createAtLong =
ParseDateFormat.getInstance().parse(mockResponse.getString("createdAt")).getTime();
assertEquals(createAtLong, state.createdAt());
assertEquals(mockResponse.getString("objectId"), state.objectId());
assertEquals(mockResponse.getString("sessionToken"), state.sessionToken());
assertEquals(mockResponse.getString("username"), state.get("username"));
assertEquals(mockResponse.getString("email"), state.get("email"));
}
}