package dk.kb.yggdrasil.integration.valhal;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.io.File;
import java.util.Arrays;
import java.util.Date;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import dk.kb.yggdrasil.HttpCommunication;
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.config.RabbitMqSettings;
import dk.kb.yggdrasil.db.StateDatabase;
import dk.kb.yggdrasil.json.preservationimport.PreservationImportRequest;
import dk.kb.yggdrasil.json.preservationimport.Security;
import dk.kb.yggdrasil.json.preservationimport.Warc;
import dk.kb.yggdrasil.messaging.MQ;
import dk.kb.yggdrasil.messaging.RemotePreservationStateUpdater;
import dk.kb.yggdrasil.preservationimport.PreservationImportRequestHandler;
@RunWith(JUnit4.class)
public class PreservationImportRequestHandlerIntegrationTest {
protected static final String NON_RANDOM_UUID = "f0/86/a8/7b/f086a87b-973a-4403-9326-1acc727864b3";
protected static final String NON_RANDOM_WARC_ID = "random-warc-id";
protected static final String NON_RANDOM_RECORD_UUID = "random-file-uuid";
protected static final String DEFAULT_COLLECTION = "collection";
protected static final String DEFAULT_TYPE = "FILE";
protected static final String DEFAULT_URL = "http://localhost:3000/view_file/import_from_preservation";
protected static final File WARC_FILE = new File("src/test/resources/warc/warcexample.warc");
protected static final File WARC_FILE_WITHOUT_THE_RECORD = new File("src/test/resources/warc/metadatawarcexample.warc");
protected static final File WARC_FILE_WITH_BAD_CHECKSUM_IN_HEADER = new File("src/test/resources/warc/warcexample_badchecksum.warc");
protected static final String SECURITY_CHECKSUM = "sha-1:5875f4d3fe7058ef89bcd28b6e11258e8ed2762b";
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 testFileDir = new File("temporarydir");
protected static YggdrasilConfig config;
protected static RabbitMqSettings mqSettings;
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);
mqSettings = new RabbitMqSettings("amqp://localhost:5672", "preservation-dev-queue",
"preservation-dev-response-queue");
}
@Test
@Ignore // Should only be run manually for integration with Valhal.
public void testSuccessCase() throws Exception {
StateDatabase states = mock(StateDatabase.class);
Bitrepository bitrepository = mock(Bitrepository.class);
MQ mq = new MQ(mqSettings);
RemotePreservationStateUpdater updater = new RemotePreservationStateUpdater(mq);
// HttpCommunication httpCommunication = Mockito.mock(HttpCommunication.class);
HttpCommunication httpCommunication = new HttpCommunication(testFileDir);
PreservationImportRequest request = makeRequestWithSecurity();
when(bitrepository.getKnownCollections()).thenReturn(Arrays.asList(DEFAULT_COLLECTION));
when(bitrepository.getFile(eq(NON_RANDOM_WARC_ID), eq(DEFAULT_COLLECTION), any())).thenReturn(WARC_FILE);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, states, updater, httpCommunication);
PreservationImportRequestHandler prh = new PreservationImportRequestHandler(context);
prh.handleRequest(request);
// verify(updater).sendPreservationImportResponse(any(PreservationImportRequestState.class), eq(PreservationImportState.PRESERVATION_IMPORT_REQUEST_RECEIVED_AND_VALIDATED), any());
// verify(updater).sendPreservationImportResponse(any(PreservationImportRequestState.class), eq(PreservationImportState.IMPORT_RETRIEVAL_FROM_BITREPOSITORY_INITIATED), any());
// verify(updater).sendPreservationImportResponse(any(PreservationImportRequestState.class), eq(PreservationImportState.IMPORT_DELIVERY_INITIATED), any());
// verify(updater).sendPreservationImportResponse(any(PreservationImportRequestState.class), eq(PreservationImportState.IMPORT_FINISHED), any());
// verifyNoMoreInteractions(updater);
verify(bitrepository).getKnownCollections();
verify(bitrepository).getFile(eq(NON_RANDOM_WARC_ID), eq(DEFAULT_COLLECTION), eq(null));
verifyNoMoreInteractions(bitrepository);
}
public static PreservationImportRequest makeRequest() {
PreservationImportRequest request = new PreservationImportRequest();
request.preservation_profile = DEFAULT_COLLECTION;
request.security = null;
request.type = DEFAULT_TYPE;
request.url = DEFAULT_URL;
request.uuid = NON_RANDOM_UUID;
request.warc = new Warc();
request.warc.warc_file_id = NON_RANDOM_WARC_ID;
request.warc.warc_record_id = NON_RANDOM_RECORD_UUID;
return request;
}
public static PreservationImportRequest makeRequestWithSecurity() {
PreservationImportRequest request = makeRequest();
request.security = new Security();
request.security.token = "trLcP8Ars7wqUE62BYuunHYDszXi8ab+KnZWhBYudxI=";
request.security.token_timeout = new Date(9999999999999L).toString(); // unreasonable long time into the future
return request;
}
}