package org.joget.workflow.model; import org.joget.commons.util.LogUtil; import org.joget.workflow.model.service.WorkflowManager; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.Collection; import java.util.Map; import org.junit.Test; import org.junit.Assert; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:wfengineApplicationContext.xml"}) public class TestWorkflowManager { public TestWorkflowManager() { } @Autowired WorkflowManager workflowManager; String packageId = "workflow_patterns"; String processId = "WfBCP1_Sequence"; String xpdl = "/workflow_patterns.xpdl"; @Test @Transactional @Rollback(false) public void suite() throws FileNotFoundException, IOException, Exception{ try { testCloseAndRemovePackage(); testUploadProcess(); testStartProcess(); testPendingA(); testAssignment(); testAcceptedA(); testStartActivityC(); testStartProcessWithLinking(); testCopyProcess(); } finally { testCloseAndRemovePackage(); } } public void testUploadProcess() throws FileNotFoundException, IOException, Exception { LogUtil.info(getClass().getName(), ">>> testUploadProcess"); BufferedReader reader = null; String fileContents = ""; String line; try { reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(xpdl))); while ((line = reader.readLine()) != null) { fileContents += line + "\n"; } } finally { if (reader != null) { reader.close(); } } byte[] processDefinitionData = fileContents.getBytes(); workflowManager.processUpload(null, processDefinitionData); } public void testStartProcess(){ LogUtil.info(getClass().getName(), ">>> testStartProcess"); String packageVersion = workflowManager.getCurrentPackageVersion(packageId); workflowManager.processStart(packageId+"#"+packageVersion+"#"+processId); } public void testPendingA(){ LogUtil.info(getClass().getName(), ">>> testPendingA"); Map activityInstance = workflowManager.getActivityInstanceByProcessIdAndStatus(processId, false); workflowManager.assignmentAccept(String.valueOf(activityInstance.get("A"))); } public void testAssignment(){ LogUtil.info(getClass().getName(), ">>> testAssignment"); Map activityInstance = workflowManager.getActivityInstanceByProcessIdAndStatus(processId, true); String activityId = String.valueOf(activityInstance.get("A")); WorkflowActivity wa = workflowManager.getActivityById(activityId); String processInstanceId = wa.getProcessId(); WorkflowAssignment ass = workflowManager.getAssignmentByProcess(processInstanceId); WorkflowAssignment ass2 = workflowManager.getAssignment(activityId); Assert.assertTrue(ass != null && ass2 != null && ass.getActivityId().equals(ass2.getActivityId())); } public void testAcceptedA(){ LogUtil.info(getClass().getName(), ">>> testAcceptedA"); Map activityInstance = workflowManager.getActivityInstanceByProcessIdAndStatus(processId, true); workflowManager.assignmentComplete(String.valueOf(activityInstance.get("A"))); } public void testStartActivityC() { LogUtil.info(getClass().getName(), ">>> testStartActivityC"); String currentActivityDef = "B"; String desiredActivityDef = "C"; // get process instance Map runningActivities = workflowManager.getActivityInstanceByProcessIdAndStatus(processId, null); String activityId = String.valueOf(runningActivities.get(currentActivityDef)); WorkflowActivity wa = workflowManager.getActivityById(activityId); String processInstanceId = wa.getProcessId(); // abort running activities and start activity C boolean started = workflowManager.activityStart(processInstanceId, desiredActivityDef, true); // check running activities runningActivities = workflowManager.getActivityInstanceByProcessIdAndStatus(processId, null); String abortedActivity = (String)runningActivities.get(currentActivityDef); String runningActivity = (String)runningActivities.get(desiredActivityDef); LogUtil.info(getClass().getName(), "Running activities: " + runningActivities + "; Result: " + started); Assert.assertTrue(abortedActivity == null && runningActivity != null); } public void testStartProcessWithLinking(){ LogUtil.info(getClass().getName(), ">>> testStartProcessWithLinking"); //start and get instant id of 1st process String packageVersion = workflowManager.getCurrentPackageVersion(packageId); WorkflowProcessResult result = workflowManager.processStart(packageId+"#"+packageVersion+"#"+processId); String process1Id = result.getProcess().getInstanceId(); LogUtil.info(getClass().getName(), "------------- process one id : " + process1Id + " -------------"); //start 2nd process with 1st process instant id and get 2nd process instant id WorkflowProcessResult nextResult = workflowManager.processStartWithLinking(packageId+"#"+packageVersion+"#"+processId, null, null, process1Id); String process2Id = nextResult.getProcess().getInstanceId(); LogUtil.info(getClass().getName(), "------------- process two id : " + process2Id + " -------------"); //check process linking data is correct or not WorkflowProcessLink link = workflowManager.getWorkflowProcessLink(process2Id); LogUtil.info(getClass().getName(), "------------- origin process id : " + link.getOriginProcessId() + " -------------"); workflowManager.internalDeleteWorkflowProcessLink(link); Assert.assertNotNull(link); Assert.assertTrue(process1Id.equals(link.getOriginProcessId()) && process1Id.equals(link.getParentProcessId())); } public void testCopyProcess() { LogUtil.info(getClass().getName(), ">>> testCopyProcess"); boolean valid = false; // start and get instance id of the 1st process String packageVersion = workflowManager.getCurrentPackageVersion(packageId); WorkflowProcessResult result = workflowManager.processStart(packageId+"#"+packageVersion+"#"+processId); String processInstanceId = result.getProcess().getInstanceId(); LogUtil.info(getClass().getName(), "------------- process one id : " + processInstanceId + " -------------"); // abort running activities and start activity B String firstActivityDef = "A"; String desiredActivityDef = "B"; boolean started = workflowManager.activityStart(processInstanceId, desiredActivityDef, true); if (started) { // start 2nd process from the 1st process instance id WorkflowProcessResult nextResult = workflowManager.processCopyFromInstanceId(processInstanceId, packageId+"#"+packageVersion+"#"+processId, true); WorkflowProcess processStarted = nextResult.getProcess(); if (processStarted != null) { // check for the aborted and running activities String newProcessId = processStarted.getInstanceId(); Collection<WorkflowActivity> activityList = workflowManager.getActivityList(newProcessId, 0, 1000, null, null); for (WorkflowActivity act: activityList) { if (act.getState().startsWith("open")) { if (firstActivityDef.equals(act.getActivityDefId())) { valid = false; break; } if (desiredActivityDef.equals(act.getActivityDefId())) { valid = true; } } } LogUtil.info(getClass().getName(), "------------- new process id : " + newProcessId + " ------------- " + valid); // cleanup WorkflowProcessLink link = workflowManager.getWorkflowProcessLink(newProcessId); workflowManager.internalDeleteWorkflowProcessLink(link); } } Assert.assertTrue(valid); } public void testCloseAndRemovePackage(){ LogUtil.info(getClass().getName(), ">>> testCloseAndRemovePackage"); Collection<WorkflowProcess> processList = workflowManager.getRunningProcessList(packageId, null, null, null, null, null, 0, 100); for(WorkflowProcess process : processList) workflowManager.removeProcessInstance(process.getInstanceId()); workflowManager.processDeleteAndUnload(packageId); } }