package dk.statsbiblioteket.medieplatform.autonomous;
import org.testng.Assert;
import org.testng.annotations.Test;
import dk.statsbiblioteket.doms.central.connectors.fedora.pidGenerator.PIDGeneratorException;
import javax.xml.bind.JAXBException;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.Set;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
public class SBOIEventIT {
@Test(groups = {"externalTest"}, enabled = true)
public void testOutdatedOldItemsFromSumma() throws Exception {
Properties props = getProperties();
SBOIEventIndex<Item> summa = getSboiClient(props);
// Search for items
EventTrigger.Query<Item> query = new EventTrigger.Query<>();
query.getPastSuccessfulEvents().add("Data_Received");
query.getTypes().add("doms:ContentModel_Roundtrip");
Iterator<Item> items = summa.search(false, query);
// Find an item with at least one current event, and at least one outdated event
Event upToDateEvent = null;
Event oldEvent = null;
Item item = null;
while (items.hasNext()) {
Item it = items.next();
HashMap<String, Event> eventMap = new HashMap<>();
upToDateEvent = null;
oldEvent = null;
for (Event event : it.getEventList()) {
Event existing = eventMap.get(event.getEventID());
if (existing == null || existing.getDate().before(event.getDate())) {
eventMap.put(event.getEventID(), event);
}
}
for (Event event : eventMap.values()) {
if (event.isSuccess() && event.getDate().after(it.getLastModified())) {
upToDateEvent = event;
}
if (event.isSuccess() && event.getDate().before(it.getLastModified())) {
oldEvent = event;
}
}
if (upToDateEvent != null && oldEvent != null ) {
item = it;
break;
}
}
assertNotNull(item, "No item found with both old and current events");
// Test1: Old event found
EventTrigger.Query<Item> query2 = new EventTrigger.Query<>();
query2.getOldEvents().add(oldEvent.getEventID());
query2.getItems().add(item);
query2.getTypes().add("doms:ContentModel_Roundtrip");
Iterator<Item> items2 = summa.search(false, query2);
Assert.assertTrue(items2.hasNext(), "No items Found");
// Test2: Current event not found
EventTrigger.Query<Item> query3 = new EventTrigger.Query<>();
query3.getOldEvents().add(upToDateEvent.getEventID());
query3.getItems().add(item);
query3.getTypes().add("doms:ContentModel_Roundtrip");
Iterator<Item> items3 = summa.search(false, query3);
Assert.assertFalse(items3.hasNext(), "Unexpected item found");
}
@Test(groups = {"externalTest"}, enabled = true)
public void testGetItemsFromSumma() throws Exception {
Properties props = getProperties();
SBOIEventIndex<Item> summa = getSboiClient(props);
EventTrigger.Query<Item> query = new EventTrigger.Query<>();
query.getOldEvents().add("Test_Event");
query.getTypes().add("doms:ContentModel_Item");
Iterator<Item> items = summa.search(false, query);
Assert.assertTrue(items.hasNext(), "No items Found");
}
@Test(groups = {"externalTest"}, enabled = true)
public void testGetItemsFromDoms() throws Exception {
Properties props = getProperties();
SBOIEventIndex<Item> summa = getSboiClient(props);
EventTrigger.Query<Item> query = new EventTrigger.Query<>();
query.getOldEvents().add("Test_Event");
query.getTypes().add("doms:ContentModel_Item");
Iterator<Item> items = summa.search(true, query);
Assert.assertTrue(items.hasNext(), "No items Found");
}
@Test(groups = {"externalTest"}, enabled = true)
public void testGetBatches() throws Exception {
Properties props = getProperties();
SBOIEventIndex<Item> summa = getSboiClient(props);
EventTrigger.Query<Item> query = new EventTrigger.Query<>();
query.getPastSuccessfulEvents().add("Data_Received");
query.getFutureEvents().add("Roundtrip_Approved");
Iterator<Item> batches = summa.getTriggeredItems(query);
int count = 0;
while (batches.hasNext()) {
Item next = batches.next();
count++;
}
Assert.assertTrue(count > 0, "No batches Found");
}
@Test(groups = {"externalTest"}, enabled = true)
public void testGetBatchFromList() throws Exception {
Properties props = getProperties();
SBOIEventIndex<Item> summa = getSboiClient(props);
EventTrigger.Query<Item> query = new EventTrigger.Query<>();
query.getPastSuccessfulEvents().add("Data_Received");
query.getFutureEvents().add("Roundtrip_Approved");
Iterator<Item> batches = summa.getTriggeredItems(query);
Item first = batches.next();
query.getItems().add(first);
Iterator<Item> batches2 = summa.getTriggeredItems(query);
Assert.assertEquals(batches2.next(), first);
}
@Test(groups = {"externalTest"}, enabled = true)
public void testGetBatchesFromList() throws Exception {
Properties props = getProperties();
SBOIEventIndex<Item> summa = getSboiClient(props);
EventTrigger.Query<Item> query = new EventTrigger.Query<>();
query.getPastSuccessfulEvents().add("Data_Received");
query.getFutureEvents().add("Roundtrip_Approved");
Iterator<Item> batches = summa.getTriggeredItems(query);
Item first = batches.next();
Item second = batches.next();
query.getItems().add(first);
query.getItems().add(second);
Iterator<Item> batches2 = summa.getTriggeredItems(query);
HashSet<Item> results = new HashSet<>();
results.add(first);
results.add(second);
assertTrue(results.contains(batches2.next()));
assertTrue(results.contains(batches2.next()));
try {
batches2.next();
fail();
} catch (NoSuchElementException e){
}
}
@Test(groups = {"externalTest"}, enabled = true)
public void testNoDuplicates() throws Exception {
Properties props = getProperties();
SBOIEventIndex<Item> summa = getSboiClient(props);
EventTrigger.Query<Item> query = new EventTrigger.Query<>();
query.getPastSuccessfulEvents().add("Data_Received");
query.getFutureEvents().add("Roundtrip_Approved");
Iterator<Item> batches = summa.getTriggeredItems(query);
List<Item> list = new ArrayList<>();
Set<Item> set = new HashSet<>();
while (batches.hasNext()) {
Item next = batches.next();
list.add(next);
set.add(next);
}
Assert.assertEquals(list.size(),set.size());
}
private SBOIEventIndex<Item> getSboiClient(Properties props) throws
MalformedURLException,
JAXBException,
PIDGeneratorException {
DomsEventStorageFactory<Item> factory = new DomsEventStorageFactory<>();
factory.setFedoraLocation(props.getProperty(ConfigConstants.DOMS_URL));
factory.setUsername(props.getProperty(ConfigConstants.DOMS_USERNAME));
factory.setPassword(props.getProperty(ConfigConstants.DOMS_PASSWORD));
factory.setItemFactory(new DomsItemFactory());
DomsEventStorage<Item> domsEventStorage = factory.createDomsEventStorage();
return new SBOIEventIndex<>(props.getProperty(ConfigConstants.AUTONOMOUS_SBOI_URL),
new PremisManipulatorFactory<>(PremisManipulatorFactory.TYPE,
new DomsItemFactory()),
domsEventStorage,
Integer.parseInt(props.getProperty(ConfigConstants.SBOI_PAGESIZE, "100")));
}
private Properties getProperties() throws IOException {
String pathToProperties = System.getProperty("integration.test.newspaper.properties");
Properties props = new Properties();
props.load(new FileInputStream(pathToProperties));
return props;
}
}