/* * 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.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import bolts.Task; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class NetworkQueryControllerTest { @Before public void setUp() throws MalformedURLException { ParseRESTCommand.server = new URL("https://api.parse.com/1"); } @After public void tearDown() { ParseRESTCommand.server = null; } //region testConvertFindResponse @Test public void testConvertFindResponse() throws Exception { // Make mock response JSONObject mockResponse = generateBasicMockResponse(); // Make mock state ParseQuery.State mockState = mock(ParseQuery.State.class); when(mockState.className()).thenReturn("Test"); when(mockState.selectedKeys()).thenReturn(null); when(mockState.constraints()).thenReturn(new ParseQuery.QueryConstraints()); NetworkQueryController controller = new NetworkQueryController(mock(ParseHttpClient.class)); List<ParseObject> objects = controller.convertFindResponse(mockState, mockResponse); verifyBasicParseObjects(mockResponse, objects, "Test"); } //endregion //region testFindAsync @Test public void testFindAsyncWithSessionToken() throws Exception { // Make mock response JSONObject mockResponse = generateBasicMockResponse(); mockResponse.put("trace", "serverTrace"); ParseHttpClient restClient = ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 200, "OK"); // Make mock state ParseQuery.State mockState = mock(ParseQuery.State.class); when(mockState.className()).thenReturn("Test"); when(mockState.selectedKeys()).thenReturn(null); when(mockState.constraints()).thenReturn(new ParseQuery.QueryConstraints()); NetworkQueryController controller = new NetworkQueryController(restClient); Task<List<ParseObject>> findTask = controller.findAsync(mockState, "sessionToken", true, null); ParseTaskUtils.wait(findTask); List<ParseObject> objects = findTask.getResult(); verifyBasicParseObjects(mockResponse, objects, "Test"); // TODO(mengyan): Verify PLog is called } // TODO(mengyan): Add testFindAsyncWithCachePolicy to verify command is added to // ParseKeyValueCache //endregion //region testCountAsync @Test public void testCountAsyncWithSessionToken() throws Exception { // Make mock response and client JSONObject mockResponse = new JSONObject(); mockResponse.put("count", 2); ParseHttpClient restClient = ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 200, "OK"); // Make mock state ParseQuery.State mockState = mock(ParseQuery.State.class); when(mockState.className()).thenReturn("Test"); when(mockState.selectedKeys()).thenReturn(null); when(mockState.constraints()).thenReturn(new ParseQuery.QueryConstraints()); NetworkQueryController controller = new NetworkQueryController(restClient); Task<Integer> countTask = controller.countAsync(mockState, "sessionToken", true, null); ParseTaskUtils.wait(countTask); int count = countTask.getResult(); assertEquals(2, count); } // TODO(mengyan): Add testFindAsyncWithCachePolicy to verify command is added to // ParseKeyValueCache //endregion private static JSONObject generateBasicMockResponse() throws JSONException { JSONObject objectJSON = new JSONObject(); String createAtStr = "2015-08-09T22:15:13.460Z"; objectJSON.put("createdAt", createAtStr); objectJSON.put("updatedAt", createAtStr); objectJSON.put("objectId", "testObjectId"); objectJSON.put("sessionToken", "testSessionToken"); objectJSON.put("key", "value"); createAtStr = "2015-08-10T22:15:13.460Z"; JSONObject objectJSONAgain = new JSONObject(); objectJSONAgain.put("createdAt", createAtStr); objectJSONAgain.put("updatedAt", createAtStr); objectJSONAgain.put("objectId", "testObjectIdAgain"); objectJSONAgain.put("sessionToken", "testSessionTokenAgain"); objectJSONAgain.put("keyAgain", "valueAgain"); JSONArray objectJSONArray = new JSONArray(); objectJSONArray.put(objectJSON); objectJSONArray.put(objectJSONAgain); JSONObject mockResponse = new JSONObject(); mockResponse.put("results", objectJSONArray); return mockResponse; } private void verifyBasicParseObjects( JSONObject mockResponse, List<ParseObject> objects, String className) throws JSONException { JSONArray objectsJSON = mockResponse.getJSONArray("results"); assertEquals(objectsJSON.length(), objects.size()); ParseObject object = objects.get(0); JSONObject objectJSON = objectsJSON.getJSONObject(0); assertEquals(className, object.getClassName()); long dateLong = ParseDateFormat.getInstance().parse(objectJSON.getString("createdAt")).getTime(); assertEquals(dateLong, object.getState().createdAt()); dateLong = ParseDateFormat.getInstance().parse(objectJSON.getString("updatedAt")).getTime(); assertEquals(dateLong, object.getState().updatedAt()); assertEquals(objectJSON.getString("objectId"), object.getObjectId()); assertEquals(objectJSON.getString("sessionToken"), object.get("sessionToken")); assertEquals(objectJSON.getString("key"), object.getString("key")); ParseObject objectAgain = objects.get(1); assertEquals(className, objectAgain.getClassName()); JSONObject objectAgainJSON = objectsJSON.getJSONObject(1); dateLong = ParseDateFormat.getInstance().parse(objectAgainJSON.getString("createdAt")).getTime(); assertEquals(dateLong, objectAgain.getState().createdAt()); dateLong = ParseDateFormat.getInstance().parse(objectAgainJSON.getString("updatedAt")).getTime(); assertEquals(dateLong, objectAgain.getState().updatedAt()); assertEquals(objectAgainJSON.getString("objectId"), objectAgain.getObjectId()); assertEquals(objectAgainJSON.getString("sessionToken"), objectAgain.get("sessionToken")); assertEquals(objectAgainJSON.getString("keyAgain"), objectAgain.getString("keyAgain")); } }