package com.example.services;
import com.example.config.Config;
import com.example.services.impl.S3FileManager;
import com.example.utils.TestingUtils;
import com.amazonaws.services.s3.model.*;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.Stack;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
public class TestS3FileManager {
private Stack<PutObjectRequest> putObjectRequests = new Stack<PutObjectRequest>();
private Stack<GetObjectRequest> getObjectRequests = new Stack<GetObjectRequest>();
private Stack<DeleteObjectRequest> deleteObjectRequests = new Stack<DeleteObjectRequest>();
private Config config = TestingUtils.getMockConfig();
S3FileManager fileManager = new S3FileManager(config) {
protected boolean isFirstTime() {
return false;
}
protected boolean uploadToS3(PutObjectRequest putObjectRequest) {
putObjectRequests.add(putObjectRequest);
return true;
}
protected boolean downloadFromS3(GetObjectRequest getObjectRequest, File file) {
getObjectRequests.add(getObjectRequest);
return true;
}
protected boolean deleteInS3(DeleteObjectRequest deleteObjectRequest) {
deleteObjectRequests.add(deleteObjectRequest);
return true;
}
};
@Test
public void testUploadFile() {
File f = new File("/foo/bar/dir/filename");
fileManager.upload(f);
assertEquals("file was not uploaded", 1, putObjectRequests.size());
PutObjectRequest request = putObjectRequests.pop();
assertEquals("incorrect bucket name", "foo", request.getBucketName());
assertEquals("incorrect filepath", "dir/filename", request.getKey());
assertEquals("incorrect file", f, request.getFile());
}
@Test
public void testUploadDirectory() throws IOException {
File dir = TestingUtils.createTempDirectory("tmp").toFile();
fileManager.upload(dir);
assertEquals("folder was not uploaded", 1, putObjectRequests.size());
PutObjectRequest request = putObjectRequests.pop();
assertEquals("incorrect bucket name", "foo", request.getBucketName());
assertTrue("incorrect filepath", request.getKey().startsWith("../../"));
assertTrue("incorrect filepath", request.getKey().endsWith("/"));
assertEquals("dir content isnt 0", 0, request.getMetadata().getContentLength());
}
@Test
public void testDownloadFile() {
File f = new File("/foo/bar/dir/filename");
fileManager.download(f);
assertEquals("file was not downloaded", 1, getObjectRequests.size());
GetObjectRequest request = getObjectRequests.pop();
assertEquals("incorrect bucket name", "foo", request.getBucketName());
assertEquals("incorrect filepath", "dir/filename", request.getKey());
}
@Test
public void testDownloadFolder() throws IOException {
File dir = TestingUtils.createTempDirectory("tmp").toFile();
fileManager.download(dir);
assertEquals("folder should not be downloaded", 0, getObjectRequests.size());
}
@Test
public void testDeleteFile() {
File f = new File("/foo/bar/dir/filename");
fileManager.delete(f);
assertEquals("file was not deleted", 1, deleteObjectRequests.size());
DeleteObjectRequest request = deleteObjectRequests.pop();
assertEquals("incorrect bucket name", "foo", request.getBucketName());
assertEquals("incorrect filepath", "dir/filename", request.getKey());
}
@Test
public void testDeleteDirectory() throws IOException {
File dir = TestingUtils.createTempDirectory("tmp").toFile();
fileManager.delete(dir);
assertEquals("file was not deleted", 1, deleteObjectRequests.size());
DeleteObjectRequest request = deleteObjectRequests.pop();
assertEquals("incorrect bucket name", "foo", request.getBucketName());
assertTrue("incorrect filepath", request.getKey().startsWith("../../"));
assertTrue("incorrect filepath", request.getKey().endsWith("/"));
}
@Test
public void testNotUploadDownloadedFile() {
File f = new File("/foo/bar/dir/filename");
fileManager.download(f);
assertFalse("should not upload as it was just downloaded", fileManager.shouldDownload(f));
fileManager.upload(f);
assertTrue("should not upload as it was just downloaded", fileManager.shouldDownload(f));
}
}