@Override public Void call() throws Exception { runtimeService.createProcessInstanceModification(processInstance.getProcessInstanceId()).startTransition("flow2") .execute(); return null; }
public void testModifyNullProcessInstance() { try { runtimeService.createProcessInstanceModification(null).startBeforeActivity("someActivity").execute(); fail("should not succeed"); } catch (NotValidException e) { assertTextPresent("processInstanceId is null", e.getMessage()); } }
/** * should also skip io mappings that are defined on already instantiated * ancestor scopes and that may be executed due to the ancestor scope * completing within the modification command. */ @Deployment(resources = IO_MAPPING_ON_SUB_PROCESS_AND_NESTED_SUB_PROCESS) public void testSkipIoMappingsOnSubProcessNested() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process"); runtimeService.createProcessInstanceModification(processInstance.getId()).startBeforeActivity("boundaryEvent").execute(false, true); // then the output mapping should not have executed assertNull(runtimeService.getVariable(processInstance.getId(), "outputMappingExecuted")); }
@Deployment(resources = IO_MAPPING_ON_SUB_PROCESS) public void testSkipIoMappingsOnSubProcess() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process"); runtimeService.createProcessInstanceModification(processInstance.getId()).startBeforeActivity("boundaryEvent").execute(false, true); // then the output mapping should not have executed assertNull(runtimeService.getVariable(processInstance.getId(), "outputMappingExecuted")); }
@Deployment(resources = EXCLUSIVE_GATEWAY_PROCESS) public void testStartAfterActivityAmbiguousTransitions() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("exclusiveGateway"); String processInstanceId = processInstance.getId(); try { runtimeService.createProcessInstanceModification(processInstanceId).startAfterActivity("fork").execute(); fail("should not suceed since 'fork' has more than one outgoing sequence flow"); } catch (ProcessEngineException e) { // happy path assertTextPresent("activity has more than one outgoing sequence flow", e.getMessage()); } }
@Deployment(resources = EXCLUSIVE_GATEWAY_PROCESS) public void testStartAfterActivityNoOutgoingTransitions() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("exclusiveGateway"); String processInstanceId = processInstance.getId(); try { runtimeService.createProcessInstanceModification(processInstanceId).startAfterActivity("theEnd").execute(); fail("should not suceed since 'theEnd' has no outgoing sequence flow"); } catch (ProcessEngineException e) { // happy path assertTextPresent("activity has no outgoing sequence flow to take", e.getMessage()); } }
@Deployment(resources = EXCLUSIVE_GATEWAY_PROCESS) public void testStartBeforeNonExistingActivity() { // given ProcessInstance instance = runtimeService.startProcessInstanceByKey("exclusiveGateway"); try { // when runtimeService.createProcessInstanceModification(instance.getId()).startBeforeActivity("someNonExistingActivity").execute(); fail("should not succeed"); } catch (NotValidException e) { // then assertTextPresentIgnoreCase("element 'someNonExistingActivity' does not exist in process ", e.getMessage()); } }
@Deployment(resources = TERMINATE_END_EVENT_PROCESS) public void testStartBeforeTerminateEndEvent() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process"); String processInstanceId = processInstance.getId(); // when I start before the terminate end event runtimeService .createProcessInstanceModification(processInstanceId) .startBeforeActivity("terminateEnd") .execute(); // then the process instance is terminated ActivityInstance updatedTree = runtimeService.getActivityInstance(processInstanceId); assertNull(updatedTree); assertProcessEnded(processInstanceId); }
@Deployment(resources = LISTENERS_ON_SUB_PROCESS_AND_NESTED_SUB_PROCESS) public void testSkipListenersOnSubProcessNested() { RecorderExecutionListener.clear(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process", Variables.createVariables().putValue("listener", new RecorderExecutionListener())); runtimeService.createProcessInstanceModification(processInstance.getId()).startBeforeActivity("boundaryEvent").execute(true, false); assertProcessEnded(processInstance.getId()); // then the output mapping should not have executed assertTrue(RecorderExecutionListener.getRecordedEvents().isEmpty()); }
@Deployment(resources = EXCLUSIVE_GATEWAY_PROCESS) public void testStartTransitionInvalidTransitionId() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("exclusiveGateway"); String processInstanceId = processInstance.getId(); try { runtimeService.createProcessInstanceModification(processInstanceId).startTransition("invalidFlowId").execute(); fail("should not suceed"); } catch (ProcessEngineException e) { // happy path assertTextPresent("Cannot perform instruction: " + "Start transition 'invalidFlowId'; " + "Element 'invalidFlowId' does not exist in process '" + processInstance.getProcessDefinitionId() + "'", e.getMessage()); } }
@Deployment(resources = PARALLEL_MULTI_INSTANCE_TASK_COMPLETION_CONDITION_PROCESS) public void testStartInnerActivityParallelTasksWithCompletionCondition() { // given ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("miParallelUserTasksCompletionCondition"); // when runtimeService .createProcessInstanceModification(processInstance.getId()) .startBeforeActivity("miTasks") .startBeforeActivity("miTasks") .execute(); // then the process is able to complete successfully and respects the completion condition completeTasksInOrder("miTasks", "miTasks", "miTasks", "miTasks"); assertProcessEnded(processInstance.getId()); }
@Deployment(resources = PARALLEL_MULTI_INSTANCE_SUBPROCESS_COMPLETION_CONDITION_PROCESS) public void testStartInnerActivityParallelSubprocessWithCompletionCondition() { // given ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("miParallelSubprocessCompletionCondition"); // when runtimeService .createProcessInstanceModification(processInstance.getId()) .startBeforeActivity("miSubProcess") .startBeforeActivity("miSubProcess") .execute(); // then the process is able to complete successfully and respects the completion condition completeTasksInOrder("subProcessTask", "subProcessTask", "subProcessTask", "subProcessTask"); assertProcessEnded(processInstance.getId()); }
@Deployment(resources = TRANSACTION_WITH_COMPENSATION_PROCESS) public void testStartCompensatingTask() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testProcess"); runtimeService.createProcessInstanceModification(processInstance.getId()).startBeforeActivity("undoTask").execute(); completeTasksInOrder("undoTask"); Task task = taskService.createTaskQuery().singleResult(); assertEquals("userTask", task.getTaskDefinitionKey()); completeTasksInOrder("userTask", "undoTask", "afterCancel"); assertProcessEnded(processInstance.getId()); }
@Deployment(resources = TRANSACTION_WITH_COMPENSATION_PROCESS) public void testStartCancelEndEvent() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testProcess"); completeTasksInOrder("userTask"); runtimeService.createProcessInstanceModification(processInstance.getId()).startBeforeActivity("txEnd").execute(); Task task = taskService.createTaskQuery().singleResult(); assertEquals("afterCancel", task.getTaskDefinitionKey()); taskService.complete(task.getId()); assertProcessEnded(processInstance.getId()); }
@Deployment(resources = TRANSACTION_WITH_COMPENSATION_PROCESS) public void testStartCancelBoundaryEvent() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testProcess"); completeTasksInOrder("userTask"); runtimeService.createProcessInstanceModification(processInstance.getId()).startBeforeActivity("catchCancelTx").execute(); Task task = taskService.createTaskQuery().singleResult(); assertEquals("afterCancel", task.getTaskDefinitionKey()); taskService.complete(task.getId()); assertProcessEnded(processInstance.getId()); }
@Deployment(resources = TRANSACTION_WITH_COMPENSATION_PROCESS) public void testStartAfterActivityDuringCompensation() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testProcess"); completeTasksInOrder("userTask"); Task task = taskService.createTaskQuery().singleResult(); assertEquals("undoTask", task.getTaskDefinitionKey()); runtimeService.createProcessInstanceModification(processInstance.getId()).startAfterActivity("userTask").execute(); task = taskService.createTaskQuery().singleResult(); assertEquals("afterCancel", task.getTaskDefinitionKey()); completeTasksInOrder("afterCancel"); assertProcessEnded(processInstance.getId()); }
@Deployment(resources = IO_MAPPING_PROCESS) public void testSkipIoMappings() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("ioMappingProcess"); // when I start task2 runtimeService.createProcessInstanceModification(processInstance.getId()).startBeforeActivity("task2").execute(false, true); // then the input mapping should not have executed Execution task2Execution = runtimeService.createExecutionQuery().activityId("task2").singleResult(); assertNotNull(task2Execution); assertNull(runtimeService.getVariable(task2Execution.getId(), "inputMappingExecuted")); // when I cancel task2 runtimeService.createProcessInstanceModification(processInstance.getId()).cancelAllForActivity("task2").execute(false, true); // then the output mapping should not have executed assertNull(runtimeService.getVariable(processInstance.getId(), "outputMappingExecuted")); }
@Deployment(resources = TRANSACTION_WITH_COMPENSATION_PROCESS) public void testStartTaskAfterCancelBoundaryEvent() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testProcess"); completeTasksInOrder("userTask"); runtimeService.createProcessInstanceModification(processInstance.getId()).startBeforeActivity("afterCancel").execute(); ActivityInstance tree = runtimeService.getActivityInstance(processInstance.getId()); assertThat(tree).hasStructure(describeActivityInstanceTree(processInstance.getProcessDefinitionId()).beginScope("tx").activity("txEnd").activity("undoTask") .endScope().activity("afterCancel").done()); completeTasksInOrder("afterCancel", "undoTask", "afterCancel"); assertProcessEnded(processInstance.getId()); }
@Deployment(resources = TRANSACTION_WITH_COMPENSATION_PROCESS) public void testCancelCompensatingTaskAndStartActivity() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testProcess"); completeTasksInOrder("userTask"); ActivityInstance tree = runtimeService.getActivityInstance(processInstance.getId()); runtimeService.createProcessInstanceModification(processInstance.getId()).cancelActivityInstance(getInstanceIdForActivity(tree, "undoTask")) .startBeforeActivity("userTask").execute(); tree = runtimeService.getActivityInstance(processInstance.getId()); assertThat(tree).hasStructure(describeActivityInstanceTree(processInstance.getProcessDefinitionId()).beginScope("tx").activity("userTask").done()); completeTasksInOrder("userTask", "undoTask", "afterCancel"); assertProcessEnded(processInstance.getId()); }
@Deployment(resources = TRANSACTION_WITH_COMPENSATION_PROCESS) public void testCancelCompensatingTaskAndStartActivityWithAncestor() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testProcess"); completeTasksInOrder("userTask"); ActivityInstance tree = runtimeService.getActivityInstance(processInstance.getId()); runtimeService.createProcessInstanceModification(processInstance.getId()).cancelActivityInstance(getInstanceIdForActivity(tree, "undoTask")) .startBeforeActivity("userTask", processInstance.getId()).execute(); tree = runtimeService.getActivityInstance(processInstance.getId()); assertThat(tree).hasStructure(describeActivityInstanceTree(processInstance.getProcessDefinitionId()).beginScope("tx").activity("userTask").done()); completeTasksInOrder("userTask", "undoTask", "afterCancel"); assertProcessEnded(processInstance.getId()); }