package edu.stanford.sulair.dlss.dor.service;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import edu.stanford.sulair.dlss.dor.AbstractProcessDatabaseTest;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import edu.stanford.sulair.dlss.dor.admin.Workflow;
import edu.stanford.sulair.dlss.dor.admin.Process;
import edu.stanford.sulair.dlss.dor.service.mock.MesssagingServiceMock;
import edu.stanford.sulair.dlss.dor.service.mock.RepositoryServiceMock;
@ContextConfiguration
public class WorkflowServiceTests extends AbstractProcessDatabaseTest {
@Autowired
WorkflowService workflowService;
@Autowired
MesssagingServiceMock msgService;
@Autowired
RepositoryServiceMock repoService;
@Before
public void createTables() {
super.createTables();
msgService.setUp();
repoService.setUp();
}
@Test
public void testUpdateExistingWorkflow(){
Process p = new Process();
p.setDruid("dr:1234");
p.setDatastream("GoogleWorkflow");
p.setName("download");
p.setStatus("pending");
p.setAttempts(1);
p.setLifecycle("downloading");
p.setRepository("dor");
dao.persistProcess(p);
p = dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "download" );
assertEquals(1, this.countRowsInTable("WORKFLOW"));
assertEquals(1, p.getAttempts());
Process p2 = new Process();
p2.setDruid("dr:1234");
p2.setDatastream("GoogleWorkflow");
p2.setName("download");
p2.setStatus("done");
p2.setRepository("dor");
workflowService.persist(p2, "dor");
Process p3 = dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "download");
assertEquals("done", p3.getStatus());
assertEquals(2, p3.getAttempts());
assertEquals("downloading", p3.getLifecycle());
assertEquals(1, this.countRowsInTable("WORKFLOW"));
}
@Test
public void testUpdateExistingWorkflowWithNullLifecycle(){
Process p = new Process();
p.setDruid("dr:1234");
p.setDatastream("GoogleWorkflow");
p.setName("download");
p.setStatus("pending");
p.setAttempts(1);
p.setRepository("dor");
dao.persistProcess(p);
p = dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "download" );
assertEquals(1, this.countRowsInTable("WORKFLOW"));
assertEquals(1, p.getAttempts());
Process p2 = new Process();
p2.setDruid("dr:1234");
p2.setDatastream("GoogleWorkflow");
p2.setName("download");
p2.setStatus("done");
p2.setRepository("dor");
workflowService.persist(p2, "dor");
Process p3 = dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "download");
assertEquals("done", p3.getStatus());
assertEquals(2, p3.getAttempts());
assertNull(p3.getLifecycle());
assertEquals(1, this.countRowsInTable("WORKFLOW"));
}
@Test
public void putGoogleWorkflow() {
//Insert 1 process row
Process p = new Process();
p.setDruid("dr:1234");
p.setDatastream("GoogleWorkflow");
p.setName("download");
p.setStatus("pending");
p.setRepository("dor");
dao.persistProcess(p);
p = dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "download" );
assertEquals(1, this.countRowsInTable("WORKFLOW"));
persistGoogleWorkflowWith2Processes();
//Assert googleworkflow rows added
assertNotNull(dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "download"));
assertNotNull(dao.findProcess("dor", "dr:1234", "GoogleWorkflow", "conversion"));
//Assert existing workflow updated
assertEquals(2, this.countRowsInTable("WORKFLOW"));
assertTrue(msgService.wasServiceUsed());
assertFalse(repoService.wasCreateWorkflowDatastreamUsed());
}
private void persistGoogleWorkflowWith2Processes() {
//Create googleworkflow
Process p2 = new Process();
p2.setDruid("dr:1234");
p2.setDatastream("GoogleWorkflow");
p2.setName("download");
p2.setStatus("done");
p2.setRepository("dor");
Process p3 = new Process();
p3.setDruid("dr:1234");
p3.setDatastream("GoogleWorkflow");
p3.setName("conversion");
p3.setStatus("pending");
p3.setRepository("dor");
ArrayList<Process>procs = new ArrayList<Process>();
procs.add(p2);
procs.add(p3);
Workflow gwf = new Workflow();
gwf.setProcesses(procs);
//Persist googleworkflow
workflowService.persist(gwf, "dor");
}
@Test
public void findGoogleWorkflowByDruid() {
persistGoogleWorkflowWith2Processes();
Workflow gwf = workflowService.findWorkflow("dor", "dr:1234", "GoogleWorkflow");
assertEquals(2, gwf.getProcesses().size());
assertEquals("GoogleWorkflow", gwf.getId());
assertEquals("dr:1234", gwf.getProcesses().get(0).getDruid());
assertEquals("dr:1234", gwf.getObjectId());
assertFalse(msgService.wasServiceUsed());
assertTrue(repoService.wasCreateWorkflowDatastreamUsed());
}
// Two different workflows exist and create workflow gets called for one of the existing workflows.
// It should not delete all the workflow rows
@Test
public void doNotClobberExistingProcessRowsFromADifferentWorkflow() {
// Existing workflow rows
createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "ingest", "completed", "archived");
createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "shelve", "completed", "released");
createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "index", "waiting");
createAndPersistProcess("dor", "dr:1234", "googleScannedBookWF", "cleanup","waiting", "accessioned");
createAndPersistProcess("dor", "dr:1234", "etdAccessionWF", "pre-register","waiting", "accessioned");
//Incoming workflow
Process p2 = createProcess("dor", "dr:1234", "etdAccessionWF", "register", "waiting");
Process p3 = createProcess("dor", "dr:1234", "etdAccessionWF", "shelve", "waiting");
ArrayList<Process>procs = new ArrayList<Process>();
procs.add(p2);
procs.add(p3);
Workflow gwf = new Workflow();
gwf.setProcesses(procs);
workflowService.persist(gwf, "dor");
gwf = workflowService.findWorkflow("dor", "dr:1234", "googleScannedBookWF");
assertEquals(4, gwf.getProcesses().size());
Workflow etd = workflowService.findWorkflow("dor", "dr:1234", "etdAccessionWF");
assertEquals(2, etd.getProcesses().size());
java.util.HashSet<String> steps = new java.util.HashSet<String>();
for(Process p: etd.getProcesses()){
steps.add(p.getName());
}
assertTrue(steps.contains("register"));
assertTrue(steps.contains("shelve"));
}
}