Skip to content

Commit

Permalink
Merge pull request #41 from ibm-cloud-security/label-fix
Browse files Browse the repository at this point in the history
added unit test - coverage 82% + some small code changes for testing
  • Loading branch information
rotembr authored Jun 7, 2017
2 parents 6b5de8f + 4c10921 commit 9e632dd
Show file tree
Hide file tree
Showing 13 changed files with 1,337 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@

public interface UserAttributeManager {
void setAttribute(@NonNull String name, @NonNull String value, UserAttributeResponseListener listener);
void setAttribute(@NonNull String name, @NonNull String value, @NonNull AccessToken accessToken, UserAttributeResponseListener listener);
void setAttribute(@NonNull String name, @NonNull String value, AccessToken accessToken, UserAttributeResponseListener listener);

void getAttribute(@NonNull String name, UserAttributeResponseListener listener);
void getAttribute(@NonNull String name, @NonNull AccessToken accessToken, UserAttributeResponseListener listener);
void getAttribute(@NonNull String name, AccessToken accessToken, UserAttributeResponseListener listener);

void deleteAttribute(@NonNull String name, UserAttributeResponseListener listener);
void deleteAttribute(@NonNull String name, @NonNull AccessToken accessToken, UserAttributeResponseListener listener);
void deleteAttribute(@NonNull String name, AccessToken accessToken, UserAttributeResponseListener listener);

void getAllAttributes(@NonNull UserAttributeResponseListener listener);
void getAllAttributes(@NonNull AccessToken accessToken, @NonNull UserAttributeResponseListener listener);
void getAllAttributes(AccessToken accessToken, @NonNull UserAttributeResponseListener listener);
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ public String getDescription(){
public String getDescription(){
return "Access to attribute is unauthorized";
}
},
JSON_PARSE_ERROR {
public String getDescription(){
return "Response text is not a valid JSON format";
}
};

public abstract String getDescription();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ class AuthorizationUIManager {
private static final String DEV_PACKAGE = "com.chrome.dev";
private static final String LOCAL_PACKAGE = "com.google.android.apps.chrome";
private static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
public static final String EXTRA_URL = "com.ibm.bluemix.appid.android.URL";
public static final String EXTRA_AUTH_FLOW_CONTEXT_GUID = "com.ibm.bluemix.appid.android.AUTH_FLOW_CONTEXT_GUID";
public static final String EXTRA_REDIRECT_URL = "com.ibm.bluemix.appid.android.REDIRECT_URL";
static final String EXTRA_URL = "com.ibm.bluemix.appid.android.URL";
static final String EXTRA_AUTH_FLOW_CONTEXT_GUID = "com.ibm.bluemix.appid.android.AUTH_FLOW_CONTEXT_GUID";
static final String EXTRA_REDIRECT_URL = "com.ibm.bluemix.appid.android.REDIRECT_URL";

private static CustomTabsClient mClient;
private static CustomTabsSession mCustomTabsSession;
Expand All @@ -64,13 +64,18 @@ class AuthorizationUIManager {
private static boolean isChromeTabSupported = true;

// TODO: document
public AuthorizationUIManager(OAuthManager oAuthManager, AuthorizationListener authorizationListener, String serverUrl, String redirectUrl) {
AuthorizationUIManager(OAuthManager oAuthManager, AuthorizationListener authorizationListener, String serverUrl, String redirectUrl) {
this.oAuthManager = oAuthManager;
this.authorizationListener = authorizationListener;
this.serverUrl = serverUrl;
this.redirectUrl = redirectUrl;
}

//for testing
Intent createChromeTabIntent(Activity activity) {
return new Intent(activity, ChromeTabActivity.class);
}

public void launch(final Activity activity) {
final Context context = activity.getApplicationContext();
String authFlowContextGuid = UUID.randomUUID().toString();
Expand All @@ -86,12 +91,11 @@ public void launch(final Activity activity) {
} else {
// Use Chrome tabs
logger.debug("Launching ChromeTabActivity");
Intent intent = new Intent(activity, ChromeTabActivity.class);
Intent intent = createChromeTabIntent(activity);
intent.putExtra(EXTRA_AUTH_FLOW_CONTEXT_GUID, authFlowContextGuid);
intent.putExtra(EXTRA_REDIRECT_URL, redirectUrl);
intent.putExtra(EXTRA_URL, serverUrl);
// Open ChromeTabActivity that will open the ChromeTab on top of it
intent.putExtra(EXTRA_URL, serverUrl);
activity.startActivity(intent);
}
}
Expand Down Expand Up @@ -230,5 +234,10 @@ public void onNavigationEvent(int navigationEvent, Bundle extras) {
return mCustomTabsSession;
}

//for testing
void reset_sPackageNameToUse(){
sPackageNameToUse = null;
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,14 @@ public UserAttributeManagerImpl(TokenManager tokenManager){

@Override
public void setAttribute (@NonNull String name, @NonNull String value, UserAttributeResponseListener listener) {

this.setAttribute(name, value, null, listener);
}

@Override
public void setAttribute (@NonNull String name, @NonNull String value, @NonNull AccessToken accessToken, final UserAttributeResponseListener listener) {
if(accessToken == null){
public void setAttribute (@NonNull String name, @NonNull String value, AccessToken accessToken, final UserAttributeResponseListener listener) {
if(accessToken == null) {
accessToken = tokenManager.getLatestAccessToken();
}

sendProtectedRequest(AppIDRequest.PUT, name, value, accessToken, listener);
}

Expand All @@ -64,7 +62,7 @@ public void getAttribute (@NonNull String name, UserAttributeResponseListener li
}

@Override
public void getAttribute (@NonNull String name, @NonNull AccessToken accessToken, UserAttributeResponseListener listener) {
public void getAttribute (@NonNull String name, AccessToken accessToken, UserAttributeResponseListener listener) {
if(accessToken == null){
accessToken = tokenManager.getLatestAccessToken();
}
Expand All @@ -77,7 +75,7 @@ public void deleteAttribute (@NonNull String name, UserAttributeResponseListener
}

@Override
public void deleteAttribute (@NonNull String name, @NonNull AccessToken accessToken, UserAttributeResponseListener listener) {
public void deleteAttribute (@NonNull String name, AccessToken accessToken, UserAttributeResponseListener listener) {
if(accessToken == null){
accessToken = tokenManager.getLatestAccessToken();
}
Expand All @@ -90,18 +88,27 @@ public void getAllAttributes(@NonNull UserAttributeResponseListener listener) {
}

@Override
public void getAllAttributes(@NonNull AccessToken accessToken, @NonNull UserAttributeResponseListener listener) {
if(accessToken == null){
public void getAllAttributes(AccessToken accessToken, @NonNull UserAttributeResponseListener listener) {
if (accessToken == null) {
accessToken = tokenManager.getLatestAccessToken();
}
sendProtectedRequest(AppIDRequest.GET, null, null, accessToken, listener);
}

//for testing purpose
AppIDRequest createAppIDRequest(String url, String method) {
return new AppIDRequest(url, method);
}
//for testing purpose
RequestBody createRequestBody(String value) {
return RequestBody.create(MediaType.parse("application/json"), value);
}

private void sendProtectedRequest(String method, String name, String value, AccessToken accessToken, final UserAttributeResponseListener listener){
String url = Config.getUserProfilesServerUrl(AppID.getInstance()) + USER_PROFILE_ATTRIBUTES_PATH;
url = (name == null || name.length() == 0) ? url : url + '/' + name;

AppIDRequest req = new AppIDRequest(url, method);
AppIDRequest req = createAppIDRequest(url, method);

ResponseListener resListener = new ResponseListener() {
@Override
Expand All @@ -111,6 +118,7 @@ public void onSuccess(Response response) {
try {
listener.onSuccess(new JSONObject(responseText));
} catch (JSONException e) {
listener.onFailure(new UserAttributesException(UserAttributesException.Error.JSON_PARSE_ERROR));
e.printStackTrace();
}
}
Expand All @@ -134,7 +142,7 @@ public void onFailure(Response response, Throwable t, JSONObject extendedInfo) {
};

RequestBody requestBody =
(value == null || value.length() == 0) ? null : RequestBody.create(MediaType.parse("application/json"), value);
(value == null || value.length() == 0) ? null : createRequestBody(value);

req.send (resListener, requestBody, accessToken);
}
Expand Down
12 changes: 11 additions & 1 deletion lib/src/test/java/com/ibm/bluemix/appid/android/TestSuite.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,16 @@
import com.ibm.bluemix.appid.android.api.tokens.OAuthClient_Test;
import com.ibm.bluemix.appid.android.api.userattributes.UserAttributesException_Test;
import com.ibm.bluemix.appid.android.internal.authorizationmanager.AuthorizationManager_Test;
import com.ibm.bluemix.appid.android.internal.authorizationmanager.AuthorizationUIManager_Test;
import com.ibm.bluemix.appid.android.internal.helpers.AuthorizationHeaderHelper_Test;
import com.ibm.bluemix.appid.android.internal.loginwidget.LoginWidgetImpl_Test;
import com.ibm.bluemix.appid.android.internal.network.AppIDRequestFactory_Test;
import com.ibm.bluemix.appid.android.internal.network.AppIDRequest_Test;
import com.ibm.bluemix.appid.android.internal.preferences.JSONPreference_Test;
import com.ibm.bluemix.appid.android.internal.preferences.StringPreference_Test;
import com.ibm.bluemix.appid.android.internal.tokenmanager.TokenManager_Test;
import com.ibm.bluemix.appid.android.internal.tokens.AbstractToken_Test;
import com.ibm.bluemix.appid.android.internal.userattributesmanager.UserAttributeManagerImpl_Test;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
Expand All @@ -50,6 +55,11 @@
JSONPreference_Test.class,
Config_Test.class,
AuthorizationManager_Test.class,
TokenManager_Test.class
TokenManager_Test.class,
AuthorizationUIManager_Test.class,
UserAttributeManagerImpl_Test.class,
AppIDRequest_Test.class,
AppIDRequestFactory_Test.class,
LoginWidgetImpl_Test.class
})
public class TestSuite {}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

package com.ibm.bluemix.appid.android.api;

import android.app.Activity;
import android.os.Build;

import com.ibm.bluemix.appid.android.api.tokens.AccessToken;
Expand All @@ -25,17 +26,23 @@
import com.ibm.bluemix.appid.android.testing.helpers.Consts;
import com.ibm.bluemix.appid.android.testing.mocks.HttpURLConnection_Mock;
import com.ibm.mobilefirstplatform.appid_clientsdk_android.BuildConfig;
import com.ibm.mobilefirstplatform.clientsdk.android.core.api.Response;
import com.ibm.mobilefirstplatform.clientsdk.android.core.api.ResponseListener;
import com.ibm.mobilefirstplatform.clientsdk.android.security.api.AppIdentity;
import com.ibm.mobilefirstplatform.clientsdk.android.security.api.DeviceIdentity;
import com.ibm.mobilefirstplatform.clientsdk.android.security.api.UserIdentity;

import org.json.JSONObject;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
Expand All @@ -47,6 +54,7 @@
import java.util.Map;


import static junit.framework.Assert.assertEquals;
import static org.assertj.core.api.Java6Assertions.*;
import static org.mockito.Mockito.*;

Expand Down Expand Up @@ -182,4 +190,83 @@ public void testLogout(){
appIdAuthManager.logout(RuntimeEnvironment.application, null);
verify(tokenManagerMock, times(2)).clearStoredTokens();
}

@Test
public void obtainAuthorization_test_onAuthorizationSuccess(){
Mockito.doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
AuthorizationListener authorizationListener = (AuthorizationListener) args[1];
authorizationListener.onAuthorizationSuccess(accessToken,idToken);
return null;
}
}).when(authorizationManagerMock).launchAuthorizationUI(any(Activity.class), any(AuthorizationListener.class));


appIdAuthManager.obtainAuthorization(Mockito.mock(Activity.class), new ResponseListener() {
@Override
public void onSuccess(Response response) {
assertEquals(response, null);
}

@Override
public void onFailure(Response response, Throwable t, JSONObject extendedInfo) {
fail("should get to onSuccess");
}
}, null);
}

@Test
public void obtainAuthorization_test_onAuthorizationFailure(){
Mockito.doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
AuthorizationListener authorizationListener = (AuthorizationListener) args[1];
authorizationListener.onAuthorizationFailure(new AuthorizationException("test exception"));
return null;
}
}).when(authorizationManagerMock).launchAuthorizationUI(any(Activity.class), any(AuthorizationListener.class));


appIdAuthManager.obtainAuthorization(Mockito.mock(Activity.class), new ResponseListener() {
@Override
public void onSuccess(Response response) {
fail("should get to onFailure");
}

@Override
public void onFailure(Response response, Throwable t, JSONObject extendedInfo) {
assertEquals(t.getMessage(), "test exception");
}
}, null);
}

@Test
public void obtainAuthorization_test_onAuthorizationCanceled(){
Mockito.doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
AuthorizationListener authorizationListener = (AuthorizationListener) args[1];
authorizationListener.onAuthorizationCanceled();
return null;
}
}).when(authorizationManagerMock).launchAuthorizationUI(any(Activity.class), any(AuthorizationListener.class));


appIdAuthManager.obtainAuthorization(Mockito.mock(Activity.class), new ResponseListener() {
@Override
public void onSuccess(Response response) {
fail("should get to onFailure");
}

@Override
public void onFailure(Response response, Throwable t, JSONObject extendedInfo) {
assertEquals(t.getMessage(), "Authorization canceled");
}
}, null);
}

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,19 @@
/*
Copyright 2017 IBM Corp.
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.ibm.bluemix.appid.android.internal.authorizationmanager;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;

import com.ibm.bluemix.appid.android.api.AppID;
Expand Down Expand Up @@ -111,8 +122,6 @@ public void before() {
when(oAuthManagerMock.getRegistrationManager()).thenReturn(registrationManager);
when(appidMock.getBluemixRegionSuffix()).thenReturn(".stubPrefix");
when(mockContext.getPackageManager()).thenReturn(pmMock);
when(pmMock.resolveActivity(eq(any(Intent.class)), 0)).thenReturn(null);
when(pmMock.queryIntentActivities(eq(any(Intent.class)), 0)).thenReturn(null);

when(oAuthManagerMock.getTokenManager()).thenReturn(tokenManagerMock);
doAnswer(new Answer<Void>() {
Expand Down
Loading

0 comments on commit 9e632dd

Please sign in to comment.