/* * 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 android.os.Bundle; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.net.URL; import java.util.Collection; import java.util.Iterator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class) public class ParseClientConfigurationTest { private final String serverUrl = "http://example.com/parse"; private final String appId = "MyAppId"; private final String clientKey = "MyClientKey"; private final String PARSE_SERVER_URL = "com.parse.SERVER_URL"; private final String PARSE_APPLICATION_ID = "com.parse.APPLICATION_ID"; private final String PARSE_CLIENT_KEY = "com.parse.CLIENT_KEY"; @Test public void testBuilder() { Parse.Configuration.Builder builder = new Parse.Configuration.Builder(null); builder.applicationId("foo"); builder.clientKey("bar"); builder.enableLocalDataStore(); Parse.Configuration configuration = builder.build(); assertNull(configuration.context); assertEquals(configuration.applicationId, "foo"); assertEquals(configuration.clientKey, "bar"); assertEquals(configuration.localDataStoreEnabled, true); } @Test public void testBuilderServerURL() { Parse.Configuration.Builder builder = new Parse.Configuration.Builder(null); builder.server("http://myserver.com/parse/"); Parse.Configuration configuration = builder.build(); assertEquals(configuration.server, "http://myserver.com/parse/"); } @Test public void testBuilderServerMissingSlashURL() { Parse.Configuration.Builder builder = new Parse.Configuration.Builder(null); builder.server("http://myserver.com/missingslash"); Parse.Configuration configuration = builder.build(); assertEquals(configuration.server, "http://myserver.com/missingslash/"); } @Test public void testConfigureFromManifest() throws Exception { Bundle metaData = setupMockMetaData(); when(metaData.getString(PARSE_SERVER_URL)).thenReturn(serverUrl); when(metaData.getString(PARSE_APPLICATION_ID)).thenReturn(appId); when(metaData.getString(PARSE_CLIENT_KEY)).thenReturn(clientKey); Parse.Configuration.Builder builder = new Parse.Configuration.Builder(RuntimeEnvironment.application); Parse.Configuration config = builder.build(); assertEquals(serverUrl + "/", config.server); assertEquals(appId, config.applicationId); assertEquals(clientKey, config.clientKey); verifyMockMetaData(metaData); } @Test(expected = RuntimeException.class) public void testConfigureFromManifestWithoutServer() throws Exception { Bundle metaData = setupMockMetaData(); when(metaData.getString(PARSE_SERVER_URL)).thenReturn(null); when(metaData.getString(PARSE_APPLICATION_ID)).thenReturn(appId); when(metaData.getString(PARSE_CLIENT_KEY)).thenReturn(clientKey); // RuntimeException due to serverUrl = null Parse.initialize(RuntimeEnvironment.application); } @Test(expected = RuntimeException.class) public void testConfigureFromManifestWithoutAppId() throws Exception { Bundle metaData = setupMockMetaData(); when(metaData.getString(PARSE_SERVER_URL)).thenReturn(serverUrl); when(metaData.getString(PARSE_APPLICATION_ID)).thenReturn(null); when(metaData.getString(PARSE_CLIENT_KEY)).thenReturn(clientKey); // RuntimeException due to applicationId = null Parse.initialize(RuntimeEnvironment.application); } @Test public void testConfigureFromManifestWithoutClientKey() throws Exception { Bundle metaData = setupMockMetaData(); when(metaData.getString(PARSE_SERVER_URL)).thenReturn(serverUrl); when(metaData.getString(PARSE_APPLICATION_ID)).thenReturn(appId); when(metaData.getString(PARSE_CLIENT_KEY)).thenReturn(null); Parse.initialize(RuntimeEnvironment.application); assertEquals(new URL(serverUrl + "/"), ParseRESTCommand.server); assertEquals(appId, ParsePlugins.get().applicationId()); assertNull(ParsePlugins.get().clientKey()); verifyMockMetaData(metaData); } private void verifyMockMetaData(Bundle metaData) throws Exception { verify(metaData).getString(PARSE_SERVER_URL); verify(metaData).getString(PARSE_APPLICATION_ID); verify(metaData).getString(PARSE_CLIENT_KEY); } private Bundle setupMockMetaData() throws Exception { Bundle metaData = mock(Bundle.class); RuntimeEnvironment.application.getApplicationInfo().metaData = metaData; return metaData; } private static <T> boolean collectionsEqual(Collection<T> a, Collection<T> b) { if (a.size() != b.size()) { return false; } Iterator<T> iteratorA = a.iterator(); Iterator<T> iteratorB = b.iterator(); for (; iteratorA.hasNext() && iteratorB.hasNext();) { T objectA = iteratorA.next(); T objectB = iteratorB.next(); if (objectA == null || objectB == null) { if (objectA != objectB) { return false; } continue; } if (!objectA.equals(objectB)) { return false; } } if (iteratorA.hasNext() || iteratorB.hasNext()) { return false; } return true; } }