Skip to content

Commit

Permalink
Update tests for MainViewModel
Browse files Browse the repository at this point in the history
  • Loading branch information
shobhitagarwal1612 committed Oct 21, 2021
1 parent 2a427ad commit 7fe2502
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ private boolean shouldInterceptException(Throwable throwable) {
case UNAVAILABLE:
firebaseExceptionProcessor.onNext(exception.getCode());
return true;
default:
return false;
}
}
return false;
Expand Down
36 changes: 19 additions & 17 deletions gnd/src/test/java/com/google/android/gnd/MainViewModelTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.google.android.gnd.model.Project;
import com.google.android.gnd.model.TermsOfService;
import com.google.android.gnd.model.User;
import com.google.android.gnd.persistence.remote.RemoteDataStore;
import com.google.android.gnd.repository.FeatureRepository;
import com.google.android.gnd.repository.ProjectRepository;
import com.google.android.gnd.repository.TermsOfServiceRepository;
Expand All @@ -40,14 +41,14 @@
import com.google.android.gnd.ui.common.Navigator;
import com.google.android.gnd.ui.home.HomeScreenFragmentDirections;
import com.google.android.gnd.ui.signin.SignInFragmentDirections;
import com.google.firebase.firestore.FirebaseFirestoreException.Code;
import dagger.hilt.android.testing.HiltAndroidRule;
import dagger.hilt.android.testing.HiltAndroidTest;
import dagger.hilt.android.testing.HiltTestApplication;
import io.reactivex.Completable;
import io.reactivex.Flowable;
import io.reactivex.Maybe;
import io.reactivex.Observable;
import io.reactivex.observers.TestObserver;
import io.reactivex.subjects.BehaviorSubject;
import io.reactivex.subjects.Subject;
import java8.util.Optional;
Expand Down Expand Up @@ -76,6 +77,7 @@ public class MainViewModelTest {
@Rule public HiltAndroidRule hiltRule = new HiltAndroidRule(this);
@Rule public InstantTaskExecutorRule instantTaskExecutorRule = new InstantTaskExecutorRule();

@Mock RemoteDataStore mockRemoteDataStore;
@Mock ProjectRepository mockProjectRepository;
@Mock FeatureRepository mockFeatureRepository;
@Mock UserRepository mockUserRepository;
Expand All @@ -99,6 +101,7 @@ public void setup() {
authenticationManager = new FakeAuthenticationManager();
viewModel =
new MainViewModel(
mockRemoteDataStore,
mockProjectRepository,
mockFeatureRepository,
mockUserRepository,
Expand Down Expand Up @@ -167,22 +170,6 @@ public void testSignInStateChanged_onSignedIn_whenTosNotAccepted() {
Mockito.verify(mockTosRepository, times(0)).setTermsOfServiceAccepted(anyBoolean());
}

@Test
public void testSignInStateChanged_onSignedIn_whenTosNotAcceptedAndFailedToGetRemoteTos() {
when(mockTosRepository.isTermsOfServiceAccepted()).thenReturn(false);
when(mockUserRepository.saveUser(any(User.class))).thenReturn(Completable.complete());
when(mockTosRepository.getTermsOfService()).thenReturn(Maybe.error(new Exception("foo_error")));
TestObserver<Integer> testErrorObserver = viewModel.getUnrecoverableErrors().test();

authenticationManager.signIn();

assertProgressDialogVisible(false);
Mockito.verify(mockNavigator, times(0)).navigate(any());
Mockito.verify(mockUserRepository, times(1)).saveUser(TEST_USER);
testErrorObserver.assertValue(R.string.config_load_error);
Mockito.verify(mockTosRepository, times(0)).setTermsOfServiceAccepted(anyBoolean());
}

@Test
public void testSignInStateChanged_onSignInError() {
authenticationManager.error();
Expand All @@ -195,6 +182,21 @@ public void testSignInStateChanged_onSignInError() {
Mockito.verify(mockTosRepository, times(1)).setTermsOfServiceAccepted(false);
}

@Test
public void testUnrecoverableErrors_shouldBeConvertedToStringRes() {
when(mockRemoteDataStore.getExceptions())
.thenReturn(Flowable.just(Code.PERMISSION_DENIED, Code.UNAVAILABLE, Code.UNKNOWN));

viewModel
.getUnrecoverableErrors()
.test()
.assertValues(
R.string.permission_denied_error,
R.string.config_load_error,
R.string.unhandled_exception)
.assertNoErrors();
}

private static class FakeAuthenticationManager implements AuthenticationManager {

@Hot(replays = true)
Expand Down

0 comments on commit 7fe2502

Please sign in to comment.