package co.smartreceipts.android.aws.cognito;
import android.content.Context;
import com.amazonaws.auth.CognitoCachingCredentialsProvider;
import com.hadisatrio.optional.Optional;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import co.smartreceipts.android.identity.IdentityManager;
import co.smartreceipts.android.identity.apis.me.Cognito;
import io.reactivex.Observable;
import io.reactivex.Single;
import io.reactivex.observers.TestObserver;
import io.reactivex.schedulers.Schedulers;
import io.reactivex.subjects.BehaviorSubject;
import static junit.framework.Assert.assertTrue;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(RobolectricTestRunner.class)
public class CognitoManagerTest {
// Class under test
CognitoManager cognitoManager;
Context context = RuntimeEnvironment.application;
@Mock
IdentityManager identityManager;
@Mock
CognitoIdentityProvider cognitoIdentityProvider;
@Mock
Cognito cognito;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(cognitoIdentityProvider.prefetchCognitoTokenIfNeeded()).thenReturn(Single.just(Optional.of(cognito)));
when(cognitoIdentityProvider.getCachedCognitoToken()).thenReturn(Optional.of(cognito));
when(identityManager.isLoggedInStream()).thenReturn(Observable.just(true));
cognitoManager = new CognitoManager(context, identityManager, cognitoIdentityProvider, Schedulers.trampoline());
}
@Test
public void initializeAndGetCognitoCachingCredentialsProviderWhenNotLoggedIn() {
final BehaviorSubject<Boolean> isLoggedInStream = BehaviorSubject.createDefault(false);
when(identityManager.isLoggedInStream()).thenReturn(isLoggedInStream);
cognitoManager.initialize();
cognitoManager.getCognitoCachingCredentialsProvider().test()
.assertValue(Optional.<CognitoCachingCredentialsProvider>absent())
.assertNotComplete()
.assertNoErrors();
}
@Test
public void initializeAndGetCognitoCachingCredentialsProviderWhenLoggedIn() {
final BehaviorSubject<Boolean> isLoggedInStream = BehaviorSubject.createDefault(true);
when(identityManager.isLoggedInStream()).thenReturn(isLoggedInStream);
cognitoManager.initialize();
cognitoManager.getCognitoCachingCredentialsProvider().test()
.assertValueCount(1)
.assertComplete()
.assertNoErrors();
assertTrue(cognitoManager.getCognitoCachingCredentialsProvider().blockingFirst().isPresent());
}
@Test
public void initializeAndGetCognitoCachingCredentialsProviderWhenLoggedInAfter() {
final BehaviorSubject<Boolean> isLoggedInStream = BehaviorSubject.createDefault(false);
when(identityManager.isLoggedInStream()).thenReturn(isLoggedInStream);
cognitoManager.initialize();
TestObserver<Optional<CognitoCachingCredentialsProvider>> testObserver = cognitoManager.getCognitoCachingCredentialsProvider().test();
testObserver.assertValue(Optional.<CognitoCachingCredentialsProvider>absent());
testObserver.assertNotComplete();
testObserver.assertNoErrors();
isLoggedInStream.onNext(true);
testObserver.assertValueCount(2);
testObserver.assertComplete();
testObserver.assertNoErrors();
assertTrue(cognitoManager.getCognitoCachingCredentialsProvider().blockingFirst().isPresent());
}
@Test
public void initializeCallsPrefetchCognitoTokenIfNeeded() {
cognitoManager.initialize();
verify(cognitoIdentityProvider).prefetchCognitoTokenIfNeeded();
}
@Test
public void getCognitoCachingCredentialsProviderReDrivesCallsPrefetchCognitoTokenOnFailure() {
cognitoManager.initialize();
when(cognitoIdentityProvider.prefetchCognitoTokenIfNeeded()).thenReturn(Single.error(new Exception("Test")));
verify(cognitoIdentityProvider).prefetchCognitoTokenIfNeeded();
when(cognitoIdentityProvider.prefetchCognitoTokenIfNeeded()).thenReturn(Single.just(Optional.of(cognito)));
cognitoManager.getCognitoCachingCredentialsProvider().test();
verify(cognitoIdentityProvider).prefetchCognitoTokenIfNeeded();
}
}