/* * Copyright (C) 2014 SCVNGR, Inc. d/b/a LevelUp * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.scvngr.levelup.core.net.request.factory; import android.test.suitebuilder.annotation.SmallTest; import com.scvngr.levelup.core.model.Permission; import com.scvngr.levelup.core.net.AbstractRequest.BadRequestException; import com.scvngr.levelup.core.net.AccessTokenRetriever; import com.scvngr.levelup.core.net.HttpMethod; import com.scvngr.levelup.core.net.LevelUpRequest; import com.scvngr.levelup.core.net.MockAccessTokenRetriever; import com.scvngr.levelup.core.net.RequestUtils; import com.scvngr.levelup.core.test.SupportAndroidTestCase; import com.scvngr.levelup.core.util.CryptographicHashUtil; import com.scvngr.levelup.core.util.CryptographicHashUtil.Algorithms; import com.scvngr.levelup.core.util.DeviceIdentifier; import com.scvngr.levelup.core.util.NullUtils; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.json.JSONException; import org.json.JSONObject; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Tests {@link com.scvngr.levelup.core.net.request.factory.AccessTokenRequestFactory}. */ public final class AccessTokenRequestFactoryTest extends SupportAndroidTestCase { /** * Tests the constructor and expected invariants. */ @SmallTest public void testConstructor() { final AccessTokenRequestFactory factory = new AccessTokenRequestFactory(getContext()); assertEquals(getContext().getApplicationContext(), factory.getContext()); assertNull(factory.getAccessTokenRetriever()); } /** * Tests {@link com.scvngr.levelup.core.net.request.factory.AccessTokenRequestFactory#buildLoginRequest(String, String)}. * * @throws com.scvngr.levelup.core.net.AbstractRequest.BadRequestException on bad requests. * @throws org.json.JSONException on malformed JSON */ @SmallTest public void testGetLoginRequest_withValidArguments() throws BadRequestException, JSONException { final AccessTokenRequestFactory builder = new AccessTokenRequestFactory(getContext()); final LevelUpRequest request = (LevelUpRequest) builder.buildLoginRequest("email", "password"); assertEquals(0, request.getQueryParams(getContext()).size()); assertFalse(request.getRequestHeaders(getContext()).containsKey( LevelUpRequest.HEADER_AUTHORIZATION)); final JSONObject params = new JSONObject(request.getBody(getContext())); assertEquals(HttpMethod.POST, request.getMethod()); assertTrue("Url points to proper api version", request.getUrl(getContext()).getPath() .contains(LevelUpRequest.API_VERSION_CODE_V14)); assertTrue("Url ends with the proper endpoint", request.getUrl(getContext()).getPath().endsWith("access_tokens")); assertTrue(params.has(AccessTokenRequestFactory.PARAM_OUTER_ACCESS_TOKEN)); final JSONObject token = params.getJSONObject(AccessTokenRequestFactory.PARAM_OUTER_ACCESS_TOKEN); assertTrue("Params include username", token.has(AccessTokenRequestFactory.PARAM_USERNAME)); assertTrue("Params include password", token.has(AccessTokenRequestFactory.PARAM_PASSWORD)); assertTrue("Params include device id", token.has(RequestUtils.PARAM_DEVICE_IDENTIFIER)); assertTrue("Params include api_key", token.has(RequestUtils.PARAM_API_KEY)); assertEquals("email", token.getString(AccessTokenRequestFactory.PARAM_USERNAME)); assertEquals("password", token.getString(AccessTokenRequestFactory.PARAM_PASSWORD)); final String deviceId = DeviceIdentifier.getDeviceId(getContext()); if (null != deviceId) { assertEquals(CryptographicHashUtil.getHexHash(deviceId, Algorithms.SHA256), token.getString(RequestUtils.PARAM_DEVICE_IDENTIFIER)); } else { fail("Device ID was null"); } assertEquals(getContext().getString(com.scvngr.levelup.core.R.string.levelup_api_key), token.getString(RequestUtils.PARAM_API_KEY)); } /** * Tests {@link com.scvngr.levelup.core.net.request.factory.AccessTokenRequestFactory#buildFacebookLoginRequest(String)}. * * @throws com.scvngr.levelup.core.net.AbstractRequest.BadRequestException on bad requests. * @throws org.json.JSONException on malformed JSON */ @SmallTest public void testGetFacebookLoginRequest_withValidArgument() throws BadRequestException, JSONException { final AccessTokenRequestFactory builder = new AccessTokenRequestFactory(getContext()); final LevelUpRequest request = (LevelUpRequest) builder.buildFacebookLoginRequest("facebook_access_token"); assertEquals(0, request.getQueryParams(getContext()).size()); assertFalse(request.getRequestHeaders(getContext()).containsKey( LevelUpRequest.HEADER_AUTHORIZATION)); final JSONObject params = new JSONObject(request.getBody(getContext())); assertEquals(HttpMethod.POST, request.getMethod()); assertTrue("Url points to proper api version", request.getUrl(getContext()).getPath() .contains(LevelUpRequest.API_VERSION_CODE_V14)); assertTrue("Url ends with the proper endpoint", request.getUrl(getContext()).getPath().endsWith("access_tokens")); assertTrue(params.has(AccessTokenRequestFactory.PARAM_OUTER_ACCESS_TOKEN)); final JSONObject token = params.getJSONObject(AccessTokenRequestFactory.PARAM_OUTER_ACCESS_TOKEN); assertTrue("Params include facebook_access_token", token.has(AccessTokenRequestFactory.PARAM_FACEBOOK_ACCESS_TOKEN)); assertTrue("Params include device id", token.has(RequestUtils.PARAM_DEVICE_IDENTIFIER)); assertTrue("Params include api_key", token.has(RequestUtils.PARAM_API_KEY)); assertEquals("facebook_access_token", token.getString(AccessTokenRequestFactory.PARAM_FACEBOOK_ACCESS_TOKEN)); final String deviceId = DeviceIdentifier.getDeviceId(getContext()); if (null != deviceId) { assertEquals(CryptographicHashUtil.getHexHash(deviceId, Algorithms.SHA256), token.getString(RequestUtils.PARAM_DEVICE_IDENTIFIER)); } else { fail("Device ID was null"); } assertEquals(getContext().getString(com.scvngr.levelup.core.R.string.levelup_api_key), token.getString(RequestUtils.PARAM_API_KEY)); } public void testBuildDowngradeRequest_withValidArgument() throws BadRequestException { final AccessTokenRetriever retriever = new MockAccessTokenRetriever(); final AccessTokenRequestFactory builder = new AccessTokenRequestFactory(getContext(), retriever); assertEquals(retriever, builder.getAccessTokenRetriever()); final List<Permission> permissions = NullUtils.nonNullContract(Arrays .asList(new Permission[] { new Permission("Create orders for you", "create_orders"), new Permission("Do dances for you through LevelUp(R)", "do_a_little_dance") })); final LevelUpRequest request = (LevelUpRequest) builder .buildDowngradeRequest("create_orders", "do_a_little_dance"); assertEquals(HttpMethod.POST, request.getMethod()); assertTrue("Url points to proper api version", request.getUrl(getContext()).getPath() .contains(LevelUpRequest.API_VERSION_CODE_V15)); assertTrue("Url ends with the proper endpoint", request.getUrl(getContext()).getPath().endsWith("access_tokens/downgrades")); final JsonObject params = (JsonObject) new JsonParser().parse(request.getBody(getContext())); assertTrue(params.has(AccessTokenRequestFactory.PARAM_OUTER_ACCESS_TOKEN)); final JsonObject token = params.getAsJsonObject(AccessTokenRequestFactory.PARAM_OUTER_ACCESS_TOKEN); assertTrue(token.has(AccessTokenRequestFactory.PARAM_PERMISSION_KEYNAMES)); final JsonArray permissionKeyNames = token.getAsJsonArray(AccessTokenRequestFactory.PARAM_PERMISSION_KEYNAMES); final Set<String> expectedPermissionKeyNames = new HashSet<String>(); for (final Permission permission : permissions) { expectedPermissionKeyNames.add(permission.getKeyname()); } final Set<String> actualPermissionKeyNames = new HashSet<String>(); for (final JsonElement permission : permissionKeyNames) { actualPermissionKeyNames.add(permission.getAsString()); } assertEquals(expectedPermissionKeyNames, actualPermissionKeyNames); } }