package co.smartreceipts.android.aws.s3;
import com.amazonaws.AmazonClientException;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.PutObjectResult;
import com.hadisatrio.optional.Optional;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import java.io.File;
import io.reactivex.Observable;
import io.reactivex.observers.TestObserver;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(RobolectricTestRunner.class)
public class S3ManagerTest {
private static final String PATH = "path/";
private static final String RANDOM_KEY = "key";
private static final String FILE_NAME = "img.jpg";
private static final String FULL_KEY_PATH = PATH + RANDOM_KEY + FILE_NAME;
private static final String URL = "https://www.smartreceipts.co/download";
// Class under test
S3Manager s3Manager;
@Mock
S3ClientFactory s3ClientFactory;
@Mock
AmazonS3Client amazonS3Client;
@Mock
S3KeyGeneratorFactory keyGeneratorFactory;
@Mock
S3KeyGenerator keyGenerator;
@Captor
ArgumentCaptor<String> keyCaptor;
File file = new File(FILE_NAME);
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(s3ClientFactory.getAmazonS3()).thenReturn(Observable.just(Optional.of(amazonS3Client)));
when(keyGeneratorFactory.get()).thenReturn(Observable.just(keyGenerator));
when(keyGenerator.getS3Key()).thenReturn(RANDOM_KEY);
when(amazonS3Client.putObject("smartreceipts", FULL_KEY_PATH, file)).thenReturn(mock(PutObjectResult.class));
when(amazonS3Client.getResourceUrl("smartreceipts", FULL_KEY_PATH)).thenReturn(URL);
s3Manager = new S3Manager(s3ClientFactory, keyGeneratorFactory);
}
@Test
public void uploadWithoutS3InstanceFails() {
when(s3ClientFactory.getAmazonS3()).thenReturn(Observable.just(Optional.<AmazonS3Client>absent()));
TestObserver<String> testObserver = s3Manager.upload(file, PATH).test();
verify(amazonS3Client, never()).putObject("smartreceipts", FULL_KEY_PATH, file);
testObserver.assertNoValues();
testObserver.assertNotComplete();
testObserver.assertError(Exception.class);
}
@Test
public void uploadFails() {
final AmazonClientException exception = new AmazonClientException("test");
when(amazonS3Client.putObject("smartreceipts", FULL_KEY_PATH, file)).thenThrow(exception);
TestObserver<String> testObserver = s3Manager.upload(file, PATH).test();
verify(amazonS3Client).putObject("smartreceipts", FULL_KEY_PATH, file);
testObserver.assertNoValues();
testObserver.assertNotComplete();
testObserver.assertError(exception);
}
@Test
public void uploadSuccess() {
TestObserver<String> testObserver = s3Manager.upload(file, PATH).test();
verify(amazonS3Client).putObject("smartreceipts", FULL_KEY_PATH, file);
testObserver.assertValue(URL);
testObserver.assertComplete();
testObserver.assertNoErrors();
}
}