package com.kickstarter.viewmodels; import android.support.annotation.NonNull; import com.kickstarter.KSRobolectricTestCase; import com.kickstarter.factories.ApiExceptionFactory; import com.kickstarter.factories.ConfigFactory; 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 org.junit.Test; import rx.Observable; import rx.observers.TestSubscriber; public class SignupViewModelTest extends KSRobolectricTestCase { @Test public void testSignupViewModel_FormValidation() { final Environment environment = environment(); environment.currentConfig().config(ConfigFactory.config()); final SignupViewModel vm = new SignupViewModel(environment); final TestSubscriber<Boolean> formIsValidTest = new TestSubscriber<>(); vm.outputs.formIsValid().subscribe(formIsValidTest); vm.inputs.fullName("brandon"); formIsValidTest.assertNoValues(); vm.inputs.email("incorrect@kickstarter"); formIsValidTest.assertNoValues(); vm.inputs.password("danisawesome"); formIsValidTest.assertValues(false); vm.inputs.email("hello@kickstarter.com"); formIsValidTest.assertValues(false, true); } @Test public void testSignupViewModel_SuccessfulSignup() { final SignupViewModel vm = new SignupViewModel(environment()); final TestSubscriber<Void> signupSuccessTest = new TestSubscriber<>(); vm.outputs.signupSuccess().subscribe(signupSuccessTest); final TestSubscriber<Boolean> formSubmittingTest = new TestSubscriber<>(); vm.outputs.formSubmitting().subscribe(formSubmittingTest); vm.inputs.fullName("brandon"); vm.inputs.email("hello@kickstarter.com"); vm.inputs.email("incorrect@kickstarter"); vm.inputs.password("danisawesome"); vm.inputs.sendNewslettersClick(true); vm.inputs.signupClick(); formSubmittingTest.assertValues(true, false); signupSuccessTest.assertValueCount(1); koalaTest.assertValues("User Signup", "Signup Newsletter Toggle", "Login", "New User"); } @Test public void testSignupViewModel_ApiValidationError() { final ApiClientType apiClient = new MockApiClient() { @Override public @NonNull Observable<AccessTokenEnvelope> signup(final @NonNull String name, final @NonNull String email, final @NonNull String password, final @NonNull String passwordConfirmation, final boolean sendNewsletters) { return Observable.error(ApiExceptionFactory.apiError( ErrorEnvelope.builder().httpCode(422).build() )); } }; final Environment environment = environment().toBuilder().apiClient(apiClient).build(); final SignupViewModel vm = new SignupViewModel(environment); final TestSubscriber<Void> signupSuccessTest = new TestSubscriber<>(); vm.outputs.signupSuccess().subscribe(signupSuccessTest); final TestSubscriber<String> signupErrorTest = new TestSubscriber<>(); vm.errors.signupError().subscribe(signupErrorTest); final TestSubscriber<Boolean> formSubmittingTest = new TestSubscriber<>(); vm.outputs.formSubmitting().subscribe(formSubmittingTest); vm.inputs.fullName("brandon"); vm.inputs.email("hello@kickstarter.com"); vm.inputs.email("incorrect@kickstarter"); vm.inputs.password("danisawesome"); vm.inputs.sendNewslettersClick(true); vm.inputs.signupClick(); formSubmittingTest.assertValues(true, false); signupSuccessTest.assertValueCount(0); signupErrorTest.assertValueCount(1); koalaTest.assertValues("User Signup", "Signup Newsletter Toggle", "Errored User Signup"); } @Test public void testSignupViewModel_ApiError() { final ApiClientType apiClient = new MockApiClient() { @Override public @NonNull Observable<AccessTokenEnvelope> signup(final @NonNull String name, final @NonNull String email, final @NonNull String password, final @NonNull String passwordConfirmation, final boolean sendNewsletters) { return Observable.error(ApiExceptionFactory.badRequestException()); } }; final Environment environment = environment().toBuilder().apiClient(apiClient).build(); final SignupViewModel vm = new SignupViewModel(environment); final TestSubscriber<Void> signupSuccessTest = new TestSubscriber<>(); vm.outputs.signupSuccess().subscribe(signupSuccessTest); final TestSubscriber<String> signupErrorTest = new TestSubscriber<>(); vm.errors.signupError().subscribe(signupErrorTest); final TestSubscriber<Boolean> formSubmittingTest = new TestSubscriber<>(); vm.outputs.formSubmitting().subscribe(formSubmittingTest); vm.inputs.fullName("brandon"); vm.inputs.email("hello@kickstarter.com"); vm.inputs.email("incorrect@kickstarter"); vm.inputs.password("danisawesome"); vm.inputs.sendNewslettersClick(true); vm.inputs.signupClick(); formSubmittingTest.assertValues(true, false); signupSuccessTest.assertValueCount(0); signupErrorTest.assertValueCount(1); koalaTest.assertValues("User Signup", "Signup Newsletter Toggle", "Errored User Signup"); } }