package com.kickstarter.viewmodels; import android.content.Intent; import android.support.annotation.NonNull; import com.kickstarter.KSRobolectricTestCase; import com.kickstarter.factories.ApiExceptionFactory; import com.kickstarter.libs.Environment; import com.kickstarter.services.ApiClientType; import com.kickstarter.services.MockApiClient; import com.kickstarter.services.apiresponses.AccessTokenEnvelope; import com.kickstarter.services.apiresponses.ErrorEnvelope; import com.kickstarter.ui.IntentKey; import org.junit.Test; import rx.Observable; import rx.observers.TestSubscriber; public class TwoFactorViewModelTest extends KSRobolectricTestCase { @Test public void testTwoFactorViewModel_FormValidation() { final Intent intent = new Intent(); intent.putExtra(IntentKey.EMAIL, "gina@kickstarter.com"); intent.putExtra(IntentKey.PASSWORD, "hello"); intent.putExtra(IntentKey.FACEBOOK_LOGIN, false); intent.putExtra(IntentKey.FACEBOOK_TOKEN, ""); final TwoFactorViewModel vm = new TwoFactorViewModel(environment()); vm.intent(intent); final TestSubscriber<Boolean> formIsValid = new TestSubscriber<>(); vm.outputs.formIsValid().subscribe(formIsValid); formIsValid.assertNoValues(); vm.inputs.code("444444"); formIsValid.assertValue(true); vm.inputs.code(""); formIsValid.assertValues(true, false); koalaTest.assertValue("Two-factor Authentication Confirm View"); } @Test public void testTwoFactorViewModel_TfaSuccess() { final Intent intent = new Intent(); intent.putExtra(IntentKey.EMAIL, "gina@kickstarter.com"); intent.putExtra(IntentKey.PASSWORD, "hello"); intent.putExtra(IntentKey.FACEBOOK_LOGIN, false); intent.putExtra(IntentKey.FACEBOOK_TOKEN, ""); final TwoFactorViewModel vm = new TwoFactorViewModel(environment()); vm.intent(intent); final TestSubscriber<Void> tfaSuccess = new TestSubscriber<>(); vm.outputs.tfaSuccess().subscribe(tfaSuccess); final TestSubscriber<Boolean> formSubmitting = new TestSubscriber<>(); vm.outputs.formSubmitting().subscribe(formSubmitting); vm.inputs.code("88888"); vm.inputs.loginClick(); formSubmitting.assertValues(true, false); tfaSuccess.assertValueCount(1); koalaTest.assertValues("Two-factor Authentication Confirm View", "Login"); } @Test public void testTwoFactorViewModel_TfaSuccessFacebook() { final Intent intent = new Intent(); intent.putExtra(IntentKey.EMAIL, "gina@kickstarter.com"); intent.putExtra(IntentKey.PASSWORD, "hello"); intent.putExtra(IntentKey.FACEBOOK_LOGIN, true); intent.putExtra(IntentKey.FACEBOOK_TOKEN, "pajamas1234"); final TwoFactorViewModel vm = new TwoFactorViewModel(environment()); vm.intent(intent); final TestSubscriber<Void> tfaSuccess = new TestSubscriber<>(); vm.outputs.tfaSuccess().subscribe(tfaSuccess); final TestSubscriber<Boolean> formSubmitting = new TestSubscriber<>(); vm.outputs.formSubmitting().subscribe(formSubmitting); vm.inputs.code("88888"); vm.inputs.loginClick(); formSubmitting.assertValues(true, false); tfaSuccess.assertValueCount(1); koalaTest.assertValues("Two-factor Authentication Confirm View", "Login"); } @Test public void testTwoFactorViewModel_ResendCode() { final Intent intent = new Intent(); intent.putExtra(IntentKey.EMAIL, "gina@kickstarter.com"); intent.putExtra(IntentKey.PASSWORD, "hello"); intent.putExtra(IntentKey.FACEBOOK_LOGIN, false); intent.putExtra(IntentKey.FACEBOOK_TOKEN, ""); final TwoFactorViewModel vm = new TwoFactorViewModel(environment()); vm.intent(intent); final TestSubscriber<Void> showResendCodeConfirmation = new TestSubscriber<>(); vm.outputs.showResendCodeConfirmation().subscribe(showResendCodeConfirmation); vm.inputs.resendClick(); showResendCodeConfirmation.assertValueCount(1); koalaTest.assertValues("Two-factor Authentication Confirm View", "Two-factor Authentication Resend Code"); } @Test public void testTwoFactorViewModel_ResendCodeFacebook() { final Intent intent = new Intent(); intent.putExtra(IntentKey.EMAIL, "gina@kickstarter.com"); intent.putExtra(IntentKey.PASSWORD, "hello"); intent.putExtra(IntentKey.FACEBOOK_LOGIN, true); intent.putExtra(IntentKey.FACEBOOK_TOKEN, "pajamas1234"); final TwoFactorViewModel vm = new TwoFactorViewModel(environment()); vm.intent(intent); final TestSubscriber<Void> showResendCodeConfirmation = new TestSubscriber<>(); vm.outputs.showResendCodeConfirmation().subscribe(showResendCodeConfirmation); vm.inputs.resendClick(); showResendCodeConfirmation.assertValueCount(1); koalaTest.assertValues("Two-factor Authentication Confirm View", "Two-factor Authentication Resend Code"); } @Test public void testTwoFactorViewModel_GenericError() { final ApiClientType apiClient = new MockApiClient() { @Override public @NonNull Observable<AccessTokenEnvelope> login(final @NonNull String email, final @NonNull String password, final @NonNull String code) { return Observable.error(ApiExceptionFactory.apiError( ErrorEnvelope.builder().httpCode(400).build() )); } }; final Environment environment = environment().toBuilder().apiClient(apiClient).build(); final Intent intent = new Intent(); intent.putExtra(IntentKey.EMAIL, "gina@kickstarter.com"); intent.putExtra(IntentKey.PASSWORD, "hello"); intent.putExtra(IntentKey.FACEBOOK_LOGIN, false); intent.putExtra(IntentKey.FACEBOOK_TOKEN, ""); final TwoFactorViewModel vm = new TwoFactorViewModel(environment); vm.intent(intent); final TestSubscriber<Void> tfaSuccess = new TestSubscriber<>(); vm.outputs.tfaSuccess().subscribe(tfaSuccess); final TestSubscriber<Boolean> formSubmitting = new TestSubscriber<>(); vm.outputs.formSubmitting().subscribe(formSubmitting); final TestSubscriber<Void> genericTfaError = new TestSubscriber<>(); vm.errors.genericTfaError().subscribe(genericTfaError); vm.inputs.code("88888"); vm.inputs.loginClick(); formSubmitting.assertValues(true, false); tfaSuccess.assertNoValues(); genericTfaError.assertValueCount(1); koalaTest.assertValues("Two-factor Authentication Confirm View", "Errored User Login"); } @Test public void testTwoFactorViewModel_CodeMismatchError() { final ApiClientType apiClient = new MockApiClient() { @Override public @NonNull Observable<AccessTokenEnvelope> login(final @NonNull String email, final @NonNull String password, final @NonNull String code) { return Observable.error(ApiExceptionFactory.tfaFailed()); } }; final Environment environment = environment().toBuilder().apiClient(apiClient).build(); final Intent intent = new Intent(); intent.putExtra(IntentKey.EMAIL, "gina@kickstarter.com"); intent.putExtra(IntentKey.PASSWORD, "hello"); intent.putExtra(IntentKey.FACEBOOK_LOGIN, false); intent.putExtra(IntentKey.FACEBOOK_TOKEN, ""); final TwoFactorViewModel vm = new TwoFactorViewModel(environment); vm.intent(intent); final TestSubscriber<Void> tfaSuccess = new TestSubscriber<>(); vm.outputs.tfaSuccess().subscribe(tfaSuccess); final TestSubscriber<Boolean> formSubmitting = new TestSubscriber<>(); vm.outputs.formSubmitting().subscribe(formSubmitting); final TestSubscriber<Void> tfaCodeMismatchError = new TestSubscriber<>(); vm.errors.tfaCodeMismatchError().subscribe(tfaCodeMismatchError); vm.inputs.code("88888"); vm.inputs.loginClick(); formSubmitting.assertValues(true, false); tfaSuccess.assertNoValues(); tfaCodeMismatchError.assertValueCount(1); koalaTest.assertValues("Two-factor Authentication Confirm View", "Errored User Login"); } }