From 8832dbd63f0ab562930fd26745fdf26fd1994ffd Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Sat, 2 Jun 2018 13:06:52 -0700 Subject: [PATCH 1/3] Remove testing hacks Signed-off-by: Alex Saveau --- .../java/com/firebase/ui/auth/AuthUI.java | 12 +--- .../java/com/firebase/ui/auth/AuthUITest.java | 3 - .../ui/auth/testhelpers/TestHelper.java | 58 ++++++++++++++----- 3 files changed, 43 insertions(+), 30 deletions(-) diff --git a/auth/src/main/java/com/firebase/ui/auth/AuthUI.java b/auth/src/main/java/com/firebase/ui/auth/AuthUI.java index 6c3db66ef..6445f79f4 100644 --- a/auth/src/main/java/com/firebase/ui/auth/AuthUI.java +++ b/auth/src/main/java/com/firebase/ui/auth/AuthUI.java @@ -26,7 +26,6 @@ import android.support.annotation.RestrictTo; import android.support.annotation.StringDef; import android.support.annotation.StyleRes; -import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import android.util.Log; @@ -92,9 +91,6 @@ */ public final class AuthUI { - @VisibleForTesting - protected static FirebaseAuth sDefaultAuth; - @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP) public static final String TAG = "AuthUI"; @@ -147,13 +143,7 @@ public final class AuthUI { private AuthUI(FirebaseApp app) { mApp = app; - - // TODO: This is a bad testing hack - if (sDefaultAuth != null) { - mAuth = sDefaultAuth; - } else { - mAuth = FirebaseAuth.getInstance(mApp); - } + mAuth = FirebaseAuth.getInstance(mApp); try { mAuth.setFirebaseUIVersion(BuildConfig.VERSION_NAME); diff --git a/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java b/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java index fafb8bb06..5c9fb5978 100644 --- a/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java +++ b/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java @@ -22,7 +22,6 @@ import com.firebase.ui.auth.util.ExtraConstants; import com.google.firebase.FirebaseApp; import com.google.firebase.auth.EmailAuthProvider; -import com.google.firebase.auth.FirebaseAuth; import org.junit.Before; import org.junit.Test; @@ -32,14 +31,12 @@ import java.util.Arrays; import static junit.framework.Assert.assertEquals; -import static org.mockito.Mockito.mock; @RunWith(RobolectricTestRunner.class) public class AuthUITest { @Before public void setUp() { TestHelper.initialize(); - AuthUI.sDefaultAuth = mock(FirebaseAuth.class); } @Test diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java index 37f282a83..39be48735 100644 --- a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java +++ b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java @@ -31,9 +31,9 @@ import com.firebase.ui.auth.util.data.ProviderUtils; import com.google.android.gms.auth.api.credentials.Credential; import com.google.firebase.FirebaseApp; -import com.google.firebase.FirebaseOptions; import com.google.firebase.auth.EmailAuthProvider; import com.google.firebase.auth.FacebookAuthProvider; +import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.GoogleAuthProvider; import com.google.firebase.auth.PhoneAuthProvider; @@ -44,19 +44,21 @@ import org.robolectric.Shadows; import org.robolectric.shadows.ShadowActivity; +import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import static junit.framework.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; public class TestHelper { - private static final String APPLICATION_ID = "testAppId"; - private static final String API_KEY = "fakeKey"; - public static void initialize() { spyContextAndResources(); AuthUI.setApplicationContext(RuntimeEnvironment.application); @@ -72,18 +74,42 @@ private static void spyContextAndResources() { when(RuntimeEnvironment.application.getResources()).thenReturn(spiedResources); } - private static FirebaseApp initializeApp(Context context) { - try { - return FirebaseApp.initializeApp( - context, - new FirebaseOptions.Builder() - .setApiKey(API_KEY) - .setApplicationId(APPLICATION_ID) - .build(), - FirebaseApp.DEFAULT_APP_NAME); - } catch (IllegalStateException e) { - return FirebaseApp.getInstance(FirebaseApp.DEFAULT_APP_NAME); + private static void initializeApp(Context context) { + if (!FirebaseApp.getApps(context).isEmpty()) { return; } + + for (Field field : FirebaseApp.class.getDeclaredFields()) { + field.setAccessible(true); + + Object o; + try { + o = field.get(null); + } catch (IllegalAccessException e) { + throw new IllegalStateException(e); + } catch (NullPointerException e) { + continue; // Instance field, move on + } + + Type genericType = field.getGenericType(); + if (o instanceof Map && genericType instanceof ParameterizedType) { + Type[] parameterTypes = ((ParameterizedType) genericType).getActualTypeArguments(); + if (parameterTypes.length != 2 || parameterTypes[0] != String.class + || parameterTypes[1] != FirebaseApp.class) { + continue; + } + + //noinspection unchecked + Map instances = (Map) o; + + instances.put(FirebaseApp.DEFAULT_APP_NAME, mock(FirebaseApp.class)); + + break; + } } + + FirebaseApp app = FirebaseApp.getInstance(); + when(app.get(eq(FirebaseAuth.class))).thenReturn(mock(FirebaseAuth.class)); + when(app.getApplicationContext()).thenReturn(context); + when(app.getName()).thenReturn(FirebaseApp.DEFAULT_APP_NAME); } private static void initializeProviders() { @@ -138,7 +164,7 @@ public static FlowParameters getFlowParameters(Collection providerIds) { true); } - public static void verifyCredentialSaveStarted(@NonNull Activity activity, + public static void verifyCredentialSaveStarted(@NonNull Activity activity, @Nullable String providerId, @Nullable String email, @Nullable String password, From 519f887f5caae1e09a221f789911c07aab27d77e Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Tue, 12 Jun 2018 14:06:11 -0700 Subject: [PATCH 2/3] Remove all hacks Signed-off-by: Alex Saveau --- .../java/com/firebase/ui/auth/AuthUITest.java | 17 +-- .../ui/auth/testhelpers/TestHelper.java | 105 ++++-------------- 2 files changed, 29 insertions(+), 93 deletions(-) diff --git a/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java b/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java index 5c9fb5978..384d914aa 100644 --- a/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java +++ b/auth/src/test/java/com/firebase/ui/auth/AuthUITest.java @@ -20,7 +20,6 @@ import com.firebase.ui.auth.testhelpers.TestConstants; import com.firebase.ui.auth.testhelpers.TestHelper; import com.firebase.ui.auth.util.ExtraConstants; -import com.google.firebase.FirebaseApp; import com.google.firebase.auth.EmailAuthProvider; import org.junit.Before; @@ -34,15 +33,17 @@ @RunWith(RobolectricTestRunner.class) public class AuthUITest { + private AuthUI mAuthUi; + @Before public void setUp() { TestHelper.initialize(); + mAuthUi = AuthUI.getInstance(TestHelper.MOCK_APP); } @Test public void testCreateStartIntent_shouldHaveEmailAsDefaultProvider() { - FlowParameters flowParameters = AuthUI - .getInstance() + FlowParameters flowParameters = mAuthUi .createSignInIntentBuilder() .build() .getParcelableExtra(ExtraConstants.FLOW_PARAMS); @@ -53,7 +54,7 @@ public void testCreateStartIntent_shouldHaveEmailAsDefaultProvider() { @Test(expected = IllegalArgumentException.class) public void testCreateStartIntent_shouldOnlyAllowOneInstanceOfAnIdp() { - SignInIntentBuilder startIntent = AuthUI.getInstance().createSignInIntentBuilder(); + SignInIntentBuilder startIntent = mAuthUi.createSignInIntentBuilder(); startIntent.setAvailableProviders(Arrays.asList( new IdpConfig.EmailBuilder().build(), new IdpConfig.EmailBuilder().build())); @@ -61,7 +62,7 @@ public void testCreateStartIntent_shouldOnlyAllowOneInstanceOfAnIdp() { @Test public void testCreatingStartIntent() { - FlowParameters flowParameters = AuthUI.getInstance() + FlowParameters flowParameters = mAuthUi .createSignInIntentBuilder() .setAvailableProviders(Arrays.asList( new IdpConfig.EmailBuilder().build(), @@ -72,7 +73,7 @@ public void testCreatingStartIntent() { .getParcelableExtra(ExtraConstants.FLOW_PARAMS); assertEquals(3, flowParameters.providerInfo.size()); - assertEquals(FirebaseApp.getInstance().getName(), flowParameters.appName); + assertEquals(TestHelper.MOCK_APP.getName(), flowParameters.appName); assertEquals(TestConstants.TOS_URL, flowParameters.termsOfServiceUrl); assertEquals(TestConstants.PRIVACY_URL, flowParameters.privacyPolicyUrl); assertEquals(AuthUI.getDefaultTheme(), flowParameters.themeId); @@ -80,13 +81,13 @@ public void testCreatingStartIntent() { @Test(expected = NullPointerException.class) public void testCreatingStartIntent_withNullTos_expectEnforcesNonNullTosUrl() { - SignInIntentBuilder startIntent = AuthUI.getInstance().createSignInIntentBuilder(); + SignInIntentBuilder startIntent = mAuthUi.createSignInIntentBuilder(); startIntent.setTosAndPrivacyPolicyUrls(null, TestConstants.PRIVACY_URL); } @Test(expected = NullPointerException.class) public void testCreatingStartIntent_withNullPp_expectEnforcesNonNullPpUrl() { - SignInIntentBuilder startIntent = AuthUI.getInstance().createSignInIntentBuilder(); + SignInIntentBuilder startIntent = mAuthUi.createSignInIntentBuilder(); startIntent.setTosAndPrivacyPolicyUrls(TestConstants.TOS_URL, null); } } diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java index 39be48735..15ef359ef 100644 --- a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java +++ b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java @@ -14,23 +14,15 @@ package com.firebase.ui.auth.testhelpers; -import android.app.Activity; import android.content.Context; -import android.content.Intent; import android.content.res.Resources; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.text.TextUtils; import com.firebase.ui.auth.AuthUI; import com.firebase.ui.auth.AuthUI.IdpConfig; import com.firebase.ui.auth.R; import com.firebase.ui.auth.data.model.FlowParameters; -import com.firebase.ui.auth.ui.credentials.CredentialSaveActivity; -import com.firebase.ui.auth.util.ExtraConstants; -import com.firebase.ui.auth.util.data.ProviderUtils; -import com.google.android.gms.auth.api.credentials.Credential; import com.google.firebase.FirebaseApp; +import com.google.firebase.FirebaseOptions; import com.google.firebase.auth.EmailAuthProvider; import com.google.firebase.auth.FacebookAuthProvider; import com.google.firebase.auth.FirebaseAuth; @@ -39,26 +31,28 @@ import com.google.firebase.auth.PhoneAuthProvider; import com.google.firebase.auth.TwitterAuthProvider; -import org.junit.Assert; import org.robolectric.RuntimeEnvironment; -import org.robolectric.Shadows; -import org.robolectric.shadows.ShadowActivity; -import java.lang.reflect.Field; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; -import static junit.framework.Assert.assertEquals; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; -public class TestHelper { +public final class TestHelper { + public static final FirebaseApp MOCK_APP; + + static { + FirebaseApp app = mock(FirebaseApp.class); + when(app.get(eq(FirebaseAuth.class))).thenReturn(mock(FirebaseAuth.class)); + when(app.getApplicationContext()).thenReturn(RuntimeEnvironment.application); + when(app.getName()).thenReturn(FirebaseApp.DEFAULT_APP_NAME); + MOCK_APP = app; + } + public static void initialize() { spyContextAndResources(); AuthUI.setApplicationContext(RuntimeEnvironment.application); @@ -75,41 +69,14 @@ private static void spyContextAndResources() { } private static void initializeApp(Context context) { - if (!FirebaseApp.getApps(context).isEmpty()) { return; } - - for (Field field : FirebaseApp.class.getDeclaredFields()) { - field.setAccessible(true); - - Object o; - try { - o = field.get(null); - } catch (IllegalAccessException e) { - throw new IllegalStateException(e); - } catch (NullPointerException e) { - continue; // Instance field, move on - } - - Type genericType = field.getGenericType(); - if (o instanceof Map && genericType instanceof ParameterizedType) { - Type[] parameterTypes = ((ParameterizedType) genericType).getActualTypeArguments(); - if (parameterTypes.length != 2 || parameterTypes[0] != String.class - || parameterTypes[1] != FirebaseApp.class) { - continue; - } - - //noinspection unchecked - Map instances = (Map) o; - - instances.put(FirebaseApp.DEFAULT_APP_NAME, mock(FirebaseApp.class)); - - break; - } - } - - FirebaseApp app = FirebaseApp.getInstance(); - when(app.get(eq(FirebaseAuth.class))).thenReturn(mock(FirebaseAuth.class)); - when(app.getApplicationContext()).thenReturn(context); - when(app.getName()).thenReturn(FirebaseApp.DEFAULT_APP_NAME); + if (!FirebaseApp.getApps(context).isEmpty()) return; + + FirebaseApp.initializeApp( + context, + new FirebaseOptions.Builder() + .setApiKey("fake") + .setApplicationId("fake") + .build()); } private static void initializeProviders() { @@ -164,36 +131,4 @@ public static FlowParameters getFlowParameters(Collection providerIds) { true); } - public static void verifyCredentialSaveStarted(@NonNull Activity activity, - @Nullable String providerId, - @Nullable String email, - @Nullable String password, - @Nullable String phoneNumber) { - - ShadowActivity shadowActivity = Shadows.shadowOf(activity); - Intent startedIntent = shadowActivity.getNextStartedActivity(); - - // Verify that CredentialSaveActivity is next up - Assert.assertEquals(startedIntent.getComponent().getClassName(), - CredentialSaveActivity.class.getName()); - - // Check the credential passed - Credential credential = startedIntent.getParcelableExtra(ExtraConstants.CREDENTIAL); - - // Check the password - assertEquals(credential.getPassword(), password); - - // Non-password credentials have a provider ID - if (TextUtils.isEmpty(password)) { - assertEquals(credential.getAccountType(), - ProviderUtils.providerIdToAccountType(providerId)); - } - - // ID can either be email or phone number - if (!TextUtils.isEmpty(phoneNumber)) { - assertEquals(credential.getId(), phoneNumber); - } else { - assertEquals(credential.getId(), email); - } - } } From 8c514adc276ecac6eff168f978ff0c363b9557bd Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Tue, 12 Jun 2018 14:11:51 -0700 Subject: [PATCH 3/3] Tidy Signed-off-by: Alex Saveau --- .../com/firebase/ui/auth/testhelpers/TestHelper.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java index 15ef359ef..92d57d69c 100644 --- a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java +++ b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java @@ -71,12 +71,10 @@ private static void spyContextAndResources() { private static void initializeApp(Context context) { if (!FirebaseApp.getApps(context).isEmpty()) return; - FirebaseApp.initializeApp( - context, - new FirebaseOptions.Builder() - .setApiKey("fake") - .setApplicationId("fake") - .build()); + FirebaseApp.initializeApp(context, new FirebaseOptions.Builder() + .setApiKey("fake") + .setApplicationId("fake") + .build()); } private static void initializeProviders() {