Skip to content

Commit 9d8fbbf

Browse files
committed
Adds unit tests for handlers
1 parent 2acd64c commit 9d8fbbf

12 files changed

+749
-39
lines changed

auth/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import Config.Libs.Lint.api
2+
import Config.Plugins.android
13
import com.android.build.gradle.internal.dsl.TestOptions
24

35
android {
@@ -40,6 +42,7 @@ dependencies {
4042
compileOnly(Config.Libs.Provider.twitter) { isTransitive = true }
4143

4244
testImplementation(Config.Libs.Test.junit)
45+
testImplementation(Config.Libs.Test.truth)
4346
testImplementation(Config.Libs.Test.mockito)
4447
testImplementation(Config.Libs.Test.robolectric)
4548
testImplementation(Config.Libs.Provider.facebook)

auth/src/main/java/com/firebase/ui/auth/util/data/AuthOperationManager.java

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.support.annotation.NonNull;
44
import android.support.annotation.RestrictTo;
5+
import android.support.annotation.VisibleForTesting;
56

67
import com.firebase.ui.auth.data.model.FlowParameters;
78
import com.google.android.gms.tasks.Continuation;
@@ -20,7 +21,21 @@ public class AuthOperationManager {
2021

2122
private static String firebaseAppName = "FUIScratchApp";
2223

23-
private static synchronized FirebaseApp getScratchApp(FirebaseApp defaultApp) {
24+
private static AuthOperationManager mAuthManager;
25+
26+
@VisibleForTesting
27+
public FirebaseAuth mScratchAuth;
28+
29+
private AuthOperationManager() {}
30+
31+
public static synchronized AuthOperationManager getInstance() {
32+
if (mAuthManager == null) {
33+
mAuthManager = new AuthOperationManager();
34+
}
35+
return mAuthManager;
36+
}
37+
38+
private FirebaseApp getScratchApp(FirebaseApp defaultApp) {
2439
try {
2540
return FirebaseApp.getInstance(firebaseAppName);
2641
} catch (IllegalStateException e) {
@@ -29,17 +44,20 @@ private static synchronized FirebaseApp getScratchApp(FirebaseApp defaultApp) {
2944
}
3045
}
3146

32-
public static FirebaseAuth getScratchAuth(FlowParameters flowParameters) {
47+
private FirebaseAuth getScratchAuth(FlowParameters flowParameters) {
3348
// Use a different FirebaseApp so that the anonymous user state is not lost in our
3449
// original FirebaseAuth instance.
35-
FirebaseApp app = FirebaseApp.getInstance(flowParameters.appName);
36-
return FirebaseAuth.getInstance(getScratchApp(app));
50+
if (mScratchAuth == null) {
51+
FirebaseApp app = FirebaseApp.getInstance(flowParameters.appName);
52+
mScratchAuth = FirebaseAuth.getInstance(getScratchApp(app));
53+
}
54+
return mScratchAuth;
3755
}
3856

39-
public static Task<AuthResult> createOrLinkUserWithEmailAndPassword(@NonNull FirebaseAuth auth,
40-
@NonNull FlowParameters flowParameters,
41-
@NonNull String email,
42-
@NonNull String password) {
57+
public Task<AuthResult> createOrLinkUserWithEmailAndPassword(@NonNull FirebaseAuth auth,
58+
@NonNull FlowParameters flowParameters,
59+
@NonNull String email,
60+
@NonNull String password) {
4361
if (canUpgradeAnonymous(auth, flowParameters)) {
4462
AuthCredential credential = EmailAuthProvider.getCredential(email, password);
4563
return auth.getCurrentUser().linkWithCredential(credential);
@@ -48,41 +66,37 @@ public static Task<AuthResult> createOrLinkUserWithEmailAndPassword(@NonNull Fir
4866
}
4967
}
5068

51-
public static Task<AuthResult> signInAndLinkWithCredential(@NonNull FirebaseAuth auth,
52-
@NonNull FlowParameters flowParameters,
53-
@NonNull AuthCredential credential) {
69+
public Task<AuthResult> signInAndLinkWithCredential(@NonNull FirebaseAuth auth,
70+
@NonNull FlowParameters flowParameters,
71+
@NonNull AuthCredential credential) {
5472
if (canUpgradeAnonymous(auth, flowParameters)) {
5573
return auth.getCurrentUser().linkWithCredential(credential);
5674
} else {
5775
return auth.signInWithCredential(credential);
5876
}
5977
}
6078

61-
public static boolean canUpgradeAnonymous(FirebaseAuth auth, FlowParameters flowParameters) {
79+
public boolean canUpgradeAnonymous(FirebaseAuth auth, FlowParameters flowParameters) {
6280
return flowParameters.isAnonymousUpgradeEnabled() && auth.getCurrentUser() != null &&
6381
auth.getCurrentUser().isAnonymous();
6482
}
6583

6684
@NonNull
67-
public static Task<AuthResult> validateCredential(AuthCredential credential,
68-
FlowParameters flowParameters) {
85+
public Task<AuthResult> validateCredential(AuthCredential credential,
86+
FlowParameters flowParameters) {
6987
return getScratchAuth(flowParameters).signInWithCredential(credential);
7088
}
7189

72-
public static Task<AuthResult> safeLink(final AuthCredential credential,
73-
final AuthCredential credentialToLink,
74-
final FlowParameters flowParameters) {
75-
76-
90+
public Task<AuthResult> safeLink(final AuthCredential credential,
91+
final AuthCredential credentialToLink,
92+
final FlowParameters flowParameters) {
7793
return getScratchAuth(flowParameters)
7894
.signInWithCredential(credential)
7995
.continueWithTask(new Continuation<AuthResult, Task<AuthResult>>() {
8096
@Override
8197
public Task<AuthResult> then(@NonNull Task<AuthResult> task) throws Exception {
8298
if (task.isSuccessful()) {
83-
return AuthOperationManager.getScratchAuth(flowParameters)
84-
.getCurrentUser()
85-
.linkWithCredential(credentialToLink);
99+
return task.getResult().getUser().linkWithCredential(credentialToLink);
86100
}
87101
return task;
88102
}

auth/src/main/java/com/firebase/ui/auth/viewmodel/email/EmailProviderResponseHandler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ public void startSignIn(@NonNull final IdpResponse response, @NonNull final Stri
4242
}
4343
setResult(Resource.<IdpResponse>forLoading());
4444

45+
final AuthOperationManager authOperationManager = AuthOperationManager.getInstance();
4546
final String email = response.getEmail();
46-
AuthOperationManager.createOrLinkUserWithEmailAndPassword(getAuth(),
47+
authOperationManager.createOrLinkUserWithEmailAndPassword(getAuth(),
4748
getArguments(),
4849
email,
4950
password)
@@ -59,7 +60,7 @@ public void onSuccess(AuthResult result) {
5960
@Override
6061
public void onFailure(@NonNull Exception e) {
6162
if (e instanceof FirebaseAuthUserCollisionException) {
62-
if (AuthOperationManager.canUpgradeAnonymous(getAuth(),
63+
if (authOperationManager.canUpgradeAnonymous(getAuth(),
6364
getArguments())) {
6465
AuthCredential credential = EmailAuthProvider.getCredential(email,
6566
password);

auth/src/main/java/com/firebase/ui/auth/viewmodel/email/WelcomeBackPasswordHandler.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,14 @@ public void startSignIn(@NonNull final String email,
6565
.build();
6666
}
6767

68-
69-
if (AuthOperationManager.canUpgradeAnonymous(getAuth(), getArguments())) {
68+
final AuthOperationManager authOperationManager = AuthOperationManager.getInstance();
69+
if (authOperationManager.canUpgradeAnonymous(getAuth(), getArguments())) {
7070
final AuthCredential credToValidate = EmailAuthProvider.getCredential(email, password);
7171

7272
// Check to see if we need to link (for social providers with the same email)
7373
if (AuthUI.SOCIAL_PROVIDERS.contains(inputResponse.getProviderType())) {
7474
// Add the provider to the same account before triggering a merge failure.
75-
AuthOperationManager.safeLink(credToValidate, credential, getArguments())
75+
authOperationManager.safeLink(credToValidate, credential, getArguments())
7676
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
7777
@Override
7878
public void onSuccess(AuthResult result) {
@@ -90,7 +90,7 @@ public void onFailure(@NonNull Exception e) {
9090
// In this case, we just need to verify that the credential they provided is valid.
9191
// No linking is done for non-federated IDPs.
9292
// A merge failure occurs because the account exists and the user is anonymous.
93-
AuthOperationManager.validateCredential(credToValidate, getArguments())
93+
authOperationManager.validateCredential(credToValidate, getArguments())
9494
.addOnCompleteListener(
9595
new OnCompleteListener<AuthResult>() {
9696
@Override

auth/src/main/java/com/firebase/ui/auth/viewmodel/idp/LinkingSocialProviderResponseHandler.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,11 @@ public void startSignIn(@NonNull final IdpResponse response) {
5252
}
5353

5454
setResult(Resource.<IdpResponse>forLoading());
55+
56+
final AuthOperationManager authOperationManager = AuthOperationManager.getInstance();
5557
final AuthCredential credential = ProviderUtils.getAuthCredential(response);
56-
if (AuthOperationManager.canUpgradeAnonymous(getAuth(), getArguments())) {
58+
59+
if (authOperationManager.canUpgradeAnonymous(getAuth(), getArguments())) {
5760
if (mRequestedSignInCredential == null) {
5861
// The user has provided a valid credential by signing in with a federated
5962
// idp. linkWithCredential will fail because the user is anonymous and the account
@@ -67,7 +70,7 @@ public void startSignIn(@NonNull final IdpResponse response) {
6770
// present on the account.
6871
// These IDPs belong to the same account - they must be linked, but we can't lose
6972
// our anonymous user session
70-
AuthOperationManager.safeLink(credential, mRequestedSignInCredential, getArguments())
73+
authOperationManager.safeLink(credential, mRequestedSignInCredential, getArguments())
7174
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
7275
@Override
7376
public void onSuccess(AuthResult result) {

auth/src/main/java/com/firebase/ui/auth/viewmodel/idp/SocialProviderResponseHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ public void startSignIn(@NonNull final IdpResponse response) {
5050
setResult(Resource.<IdpResponse>forLoading());
5151

5252
final AuthCredential credential = ProviderUtils.getAuthCredential(response);
53-
AuthOperationManager.signInAndLinkWithCredential(
53+
54+
AuthOperationManager.getInstance().signInAndLinkWithCredential(
5455
getAuth(),
5556
getArguments(),
5657
credential)

auth/src/main/java/com/firebase/ui/auth/viewmodel/phone/PhoneProviderResponseHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ public void startSignIn(@NonNull PhoneAuthCredential credential,
3131
throw new IllegalStateException(
3232
"This handler cannot be used without a phone response.");
3333
}
34+
3435
setResult(Resource.<IdpResponse>forLoading());
3536

36-
AuthOperationManager.signInAndLinkWithCredential(getAuth(), getArguments(), credential)
37+
AuthOperationManager.getInstance()
38+
.signInAndLinkWithCredential(getAuth(), getArguments(), credential)
3739
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
3840
@Override
3941
public void onSuccess(AuthResult result) {

auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,11 @@ public static FirebaseUser getMockFirebaseUser() {
9696
}
9797

9898
public static FlowParameters getFlowParameters(Collection<String> providerIds) {
99+
return getFlowParameters(providerIds, false);
100+
}
101+
102+
public static FlowParameters getFlowParameters(Collection<String> providerIds,
103+
boolean enableAnonymousUpgrade) {
99104
List<IdpConfig> idpConfigs = new ArrayList<>();
100105
for (String providerId : providerIds) {
101106
switch (providerId) {
@@ -127,7 +132,8 @@ public static FlowParameters getFlowParameters(Collection<String> providerIds) {
127132
null,
128133
true,
129134
true,
130-
false);
135+
enableAnonymousUpgrade);
131136
}
132137

138+
133139
}

0 commit comments

Comments
 (0)