package co.smartreceipts.android.aws.s3;
import com.amazonaws.auth.CognitoCachingCredentialsProvider;
import com.amazonaws.services.s3.AmazonS3Client;
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.aws.cognito.CognitoManager;
import io.reactivex.Observable;
import io.reactivex.observers.TestObserver;
import io.reactivex.subjects.BehaviorSubject;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.mockito.Mockito.when;
@RunWith(RobolectricTestRunner.class)
public class S3ClientFactoryTest {
// Class under test
S3ClientFactory s3ClientFactory;
@Mock
CognitoManager cognitoManager;
@Mock
CognitoCachingCredentialsProvider cognitoCachingCredentialsProvider;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(cognitoManager.getCognitoCachingCredentialsProvider()).thenReturn(Observable.just(Optional.of(cognitoCachingCredentialsProvider)));
s3ClientFactory = new S3ClientFactory(RuntimeEnvironment.application, cognitoManager);
}
@Test
public void getAmazonS3() {
s3ClientFactory.getAmazonS3().test()
.assertComplete()
.assertNoErrors();
final Optional<AmazonS3Client> s3Client = s3ClientFactory.getAmazonS3().blockingFirst();
assertTrue(s3Client.isPresent());
}
@Test
public void getAmazonS3WhenInitiallyAbsent() {
final BehaviorSubject<Optional<CognitoCachingCredentialsProvider>> subject = BehaviorSubject.create();
when(cognitoManager.getCognitoCachingCredentialsProvider()).thenReturn(subject);
subject.onNext(Optional.<CognitoCachingCredentialsProvider>absent());
TestObserver<Optional<AmazonS3Client>> testObserver = s3ClientFactory.getAmazonS3().test();
testObserver
.assertValueCount(1)
.assertNotComplete()
.assertNoErrors();
final Optional<AmazonS3Client> s3Client1 = s3ClientFactory.getAmazonS3().blockingFirst();
assertFalse(s3Client1.isPresent());
// Now re-drive with an actual value:
subject.onNext(Optional.of(cognitoCachingCredentialsProvider));
testObserver.assertComplete();
testObserver.assertNoErrors();
final Optional<AmazonS3Client> s3Client2 = s3ClientFactory.getAmazonS3().blockingFirst();
assertTrue(s3Client2.isPresent());
}
}