package dk.kb.yggdrasil.preservation;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.Arrays;
import org.apache.commons.io.FileUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import dk.kb.yggdrasil.HttpCommunication;
import dk.kb.yggdrasil.HttpPayload;
import dk.kb.yggdrasil.bitmag.Bitrepository;
import dk.kb.yggdrasil.config.Models;
import dk.kb.yggdrasil.config.RequestHandlerContext;
import dk.kb.yggdrasil.config.YggdrasilConfig;
import dk.kb.yggdrasil.db.StateDatabase;
import dk.kb.yggdrasil.json.preservation.PreservationRequest;
import dk.kb.yggdrasil.json.preservation.PreservationResponse;
import dk.kb.yggdrasil.messaging.MQ;
import dk.kb.yggdrasil.messaging.RemotePreservationStateUpdater;
import dk.kb.yggdrasil.testutils.MetadataContentUtils;
// Only mocks external communication (HTTP, MQ and bitrepository)
@RunWith(JUnit4.class)
public class PreservationIntegrationTest {
protected static final String NON_RANDOM_UUID = "random-uuid";
protected static final String NON_RANDOM_FILE_UUID = "random-file-uuid";
protected static final String DEFAULT_COLLECTION = "collection";
protected static File generalConfigFile = new File("src/test/resources/config/yggdrasil.yml");
protected static File modelsFile = new File("src/test/resources/config/models.yml");
protected static File testStateDir = new File("temporarydir/statedir");
protected static File testFileDir = new File("temporarydir");
protected static YggdrasilConfig config;
protected static Models models;
@BeforeClass
public static void beforeClass() throws Exception {
System.setProperty("dk.kb.yggdrasil.runningmode", "test");
config = new YggdrasilConfig(generalConfigFile);
models = new Models(modelsFile);
testStateDir.mkdirs();
testFileDir.mkdirs();
FileUtils.cleanDirectory(testStateDir);
}
@AfterClass
public static void afterClass() throws Exception {
FileUtils.deleteDirectory(testStateDir);
FileUtils.deleteDirectory(testFileDir);
}
@Test
public void testSuccessCaseWithoutFile() throws Exception {
Bitrepository bitrepository = mock(Bitrepository.class);
MQ mq = mock(MQ.class);
HttpCommunication httpCommunication = mock(HttpCommunication.class);
when(bitrepository.getKnownCollections()).thenReturn(Arrays.asList(DEFAULT_COLLECTION));
when(bitrepository.uploadFile(any(File.class), anyString())).thenReturn(true);
StateDatabase states = new StateDatabase(testStateDir);
RemotePreservationStateUpdater updater = new RemotePreservationStateUpdater(mq);
PreservationRequest request = makeRequest();
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, states, updater, httpCommunication);
PreservationRequestHandler prh = new PreservationRequestHandler(context, models);
prh.handleRequest(request);
verify(mq, times(5)).publishPreservationResponse(any(PreservationResponse.class));
verifyNoMoreInteractions(mq);
verify(bitrepository).getKnownCollections();
verify(bitrepository).uploadFile(any(File.class), eq(DEFAULT_COLLECTION));
verifyNoMoreInteractions(bitrepository);
verifyZeroInteractions(httpCommunication);
}
@Test
public void testSuccessCaseWithFile() throws Exception {
Bitrepository bitrepository = mock(Bitrepository.class);
MQ mq = mock(MQ.class);
HttpCommunication httpCommunication = mock(HttpCommunication.class);
String payloadText = "Content file content";
HttpPayload payload = new HttpPayload(new ByteArrayInputStream(payloadText.getBytes()), null, "application/octetstream", (long) payloadText.length(), testFileDir);
when(httpCommunication.get(anyString())).thenReturn(payload);
StateDatabase states = new StateDatabase(testStateDir);
RemotePreservationStateUpdater updater = new RemotePreservationStateUpdater(mq);
when(bitrepository.getKnownCollections()).thenReturn(Arrays.asList(DEFAULT_COLLECTION));
when(bitrepository.uploadFile(any(File.class), anyString())).thenReturn(true);
PreservationRequest request = makeRequest();
request.Model = "contentfile";
request.File_UUID = NON_RANDOM_FILE_UUID;
request.Content_URI = "http://localhost/test.txt";
request.metadata = MetadataContentUtils.getExampleContentFileMetadata();
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, states, updater, httpCommunication);
PreservationRequestHandler prh = new PreservationRequestHandler(context, models);
prh.handleRequest(request);
verify(mq, times(7)).publishPreservationResponse(any(PreservationResponse.class));
verifyNoMoreInteractions(mq);
verify(bitrepository).getKnownCollections();
verify(bitrepository).uploadFile(any(File.class), eq(DEFAULT_COLLECTION));
verifyNoMoreInteractions(bitrepository);
verify(httpCommunication).get(anyString());
verifyNoMoreInteractions(httpCommunication);
}
public static PreservationRequest makeRequest() {
PreservationRequest request = new PreservationRequest();
request.Content_URI = null;
request.File_UUID = null;
request.metadata = MetadataContentUtils.getExampleInstanceMetadata();
request.Model = "instance";
request.Preservation_profile = DEFAULT_COLLECTION;
request.UUID = NON_RANDOM_UUID;
request.Valhal_ID = "ID";
return request;
}
}