package co.smartreceipts.android.aws.cognito; 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 java.io.IOException; import co.smartreceipts.android.identity.IdentityManager; import co.smartreceipts.android.identity.apis.me.Cognito; import co.smartreceipts.android.identity.apis.me.MeResponse; import co.smartreceipts.android.identity.apis.me.User; import io.reactivex.Observable; import io.reactivex.observers.TestObserver; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) public class CognitoIdentityProviderTest { private static final String TOKEN = "token"; private static final String IDENTITY_ID = "identityId"; private static final long EXPIRES_AT = 5; // Class under test CognitoIdentityProvider cognitoIdentityProvider; @Mock IdentityManager identityManager; @Mock LocalCognitoTokenStore localCognitoTokenStore; @Mock MeResponse meResponse; @Mock User user; @Before public void setUp() { MockitoAnnotations.initMocks(this); when(meResponse.getUser()).thenReturn(user); when(localCognitoTokenStore.getCognitoToken()).thenReturn(new Cognito(TOKEN, IDENTITY_ID, EXPIRES_AT)); cognitoIdentityProvider = new CognitoIdentityProvider(identityManager, localCognitoTokenStore); } @Test public void refreshCognitoTokenThrowsException() { when(identityManager.getMe()).thenReturn(Observable.<MeResponse>error(new IOException())); TestObserver<Optional<Cognito>> testObserver = cognitoIdentityProvider.refreshCognitoToken().test(); verify(localCognitoTokenStore).persist(null); testObserver.assertNoValues() .assertNotComplete() .assertError(IOException.class); } @Test public void refreshCognitoTokenReturnsNullUserResponse() { when(meResponse.getUser()).thenReturn(null); when(identityManager.getMe()).thenReturn(Observable.just(meResponse)); TestObserver<Optional<Cognito>> testObserver = cognitoIdentityProvider.refreshCognitoToken().test(); verify(localCognitoTokenStore, times(2)).persist(null); testObserver.assertValue(Optional.absent()) .assertComplete() .assertNoErrors(); } @Test public void refreshCognitoTokenIsValid() { when(identityManager.getMe()).thenReturn(Observable.just(meResponse)); when(user.getCognitoToken()).thenReturn(TOKEN); when(user.getIdentityId()).thenReturn(IDENTITY_ID); when(user.getCognitoTokenExpiresAt()).thenReturn(EXPIRES_AT); final TestObserver<Optional<Cognito>> testObserver = cognitoIdentityProvider.refreshCognitoToken().test(); final Cognito cognito = new Cognito(TOKEN, IDENTITY_ID, EXPIRES_AT); verify(localCognitoTokenStore).persist(null); verify(localCognitoTokenStore).persist(cognito); testObserver.assertValue(Optional.of(cognito)) .assertComplete() .assertNoErrors(); } @Test public void prefetchNullToken() { final Cognito preCognito = null; when(localCognitoTokenStore.getCognitoToken()).thenReturn(preCognito); when(identityManager.getMe()).thenReturn(Observable.just(meResponse)); when(user.getCognitoToken()).thenReturn(TOKEN); when(user.getIdentityId()).thenReturn(IDENTITY_ID); when(user.getCognitoTokenExpiresAt()).thenReturn(EXPIRES_AT); TestObserver<Optional<Cognito>> testObserver = cognitoIdentityProvider.prefetchCognitoTokenIfNeeded().test(); final Cognito cognito = new Cognito(TOKEN, IDENTITY_ID, EXPIRES_AT); verify(localCognitoTokenStore).persist(null); verify(localCognitoTokenStore).persist(cognito); testObserver.assertValue(Optional.of(cognito)) .assertComplete() .assertNoErrors(); } @Test public void prefetchInvalidTokenWillNullToken() { final Cognito preCognito = new Cognito(null, IDENTITY_ID, EXPIRES_AT);; when(localCognitoTokenStore.getCognitoToken()).thenReturn(preCognito); when(identityManager.getMe()).thenReturn(Observable.just(meResponse)); when(user.getCognitoToken()).thenReturn(TOKEN); when(user.getIdentityId()).thenReturn(IDENTITY_ID); when(user.getCognitoTokenExpiresAt()).thenReturn(EXPIRES_AT); final TestObserver<Optional<Cognito>> testObserver = cognitoIdentityProvider.prefetchCognitoTokenIfNeeded().test(); final Cognito cognito = new Cognito(TOKEN, IDENTITY_ID, EXPIRES_AT); verify(localCognitoTokenStore).persist(null); verify(localCognitoTokenStore).persist(cognito); testObserver.assertValue(Optional.of(cognito)) .assertComplete() .assertNoErrors(); } @Test public void prefetchInvalidTokenWillNullIdentityId() { final Cognito preCognito = new Cognito(TOKEN, null, EXPIRES_AT);; when(localCognitoTokenStore.getCognitoToken()).thenReturn(preCognito); when(identityManager.getMe()).thenReturn(Observable.just(meResponse)); when(user.getCognitoToken()).thenReturn(TOKEN); when(user.getIdentityId()).thenReturn(IDENTITY_ID); when(user.getCognitoTokenExpiresAt()).thenReturn(EXPIRES_AT); final TestObserver<Optional<Cognito>> testObserver = cognitoIdentityProvider.prefetchCognitoTokenIfNeeded().test(); final Cognito cognito = new Cognito(TOKEN, IDENTITY_ID, EXPIRES_AT); verify(localCognitoTokenStore).persist(null); verify(localCognitoTokenStore).persist(cognito); testObserver.assertValue(Optional.of(cognito)) .assertComplete() .assertNoErrors(); } @Test public void prefetchValidToken() { final Cognito preCognito = new Cognito(TOKEN, IDENTITY_ID, EXPIRES_AT);; when(localCognitoTokenStore.getCognitoToken()).thenReturn(preCognito); final TestObserver<Optional<Cognito>> testObserver = cognitoIdentityProvider.prefetchCognitoTokenIfNeeded().test(); verify(localCognitoTokenStore, never()).persist(any(Cognito.class)); testObserver.assertValue(Optional.of(preCognito)) .assertComplete() .assertNoErrors(); } @Test public void synchronouslyRefreshCognitoTokenThrowsException() { when(identityManager.getMe()).thenReturn(Observable.<MeResponse>error(new IOException())); assertEquals(null, cognitoIdentityProvider.synchronouslyRefreshCognitoToken()); } @Test public void synchronouslyRefreshCognitoTokenReturnsNullUserResponse() { when(meResponse.getUser()).thenReturn(null); when(identityManager.getMe()).thenReturn(Observable.just(meResponse)); assertEquals(null, cognitoIdentityProvider.synchronouslyRefreshCognitoToken()); } @Test public void synchronouslyRefreshCognitoTokenIsValid() { when(identityManager.getMe()).thenReturn(Observable.just(meResponse)); when(user.getCognitoToken()).thenReturn(TOKEN); when(user.getIdentityId()).thenReturn(IDENTITY_ID); when(user.getCognitoTokenExpiresAt()).thenReturn(EXPIRES_AT); final Cognito cognito = new Cognito(TOKEN, IDENTITY_ID, EXPIRES_AT); assertEquals(cognito, cognitoIdentityProvider.synchronouslyRefreshCognitoToken()); } @Test public void getCachedCognitoToken() { assertEquals(new Cognito(TOKEN, IDENTITY_ID, EXPIRES_AT), cognitoIdentityProvider.getCachedCognitoToken().get()); verify(localCognitoTokenStore).getCognitoToken(); } }