/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jbpm.test.regression.task;
import static org.jbpm.test.tools.TrackingListenerAssert.assertTriggered;
import static org.jbpm.test.tools.TrackingListenerAssert.assertTriggeredAndLeft;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManagerFactory;
import org.assertj.core.api.Assertions;
import org.jbpm.test.JbpmTestCase;
import org.jbpm.test.listener.TrackingProcessEventListener;
import org.junit.Test;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.manager.RuntimeEngine;
import org.kie.api.runtime.process.ProcessInstance;
import org.kie.api.task.TaskService;
import org.kie.api.task.model.Status;
import org.kie.api.task.model.Task;
import org.kie.api.task.model.TaskSummary;
import qa.tools.ikeeper.annotation.BZ;
public class HumanTaskTest extends JbpmTestCase {
private static final String BOUNDARY_TIMER = "org/jbpm/test/regression/task/HumanTask-boundaryTimer.bpmn2";
private static final String BOUNDARY_TIMER_ID = "org.jbpm.test.regression.task.HumanTask-boundaryTimer";
private static final String COMPLETION_ROLLBACK = "org/jbpm/test/regression/task/HumanTask-completionRollback.bpmn2";
private static final String COMPLETION_ROLLBACK_ID = "org.jbpm.test.regression.task.HumanTask-completionRollback";
private static final String ON_ENTRY_SCRIPT_EXCEPTION = "org/jbpm/test/regression/task/HumanTask-onEntryScriptException.bpmn2";
private static final String ON_ENTRY_SCRIPT_EXCEPTION_ID = "org.jbpm.test.regression.task.HumanTask-onEntryScriptException";
private static final String ON_EXIT_SCRIPT_EXCEPTION = "org/jbpm/test/regression/task/HumanTask-onExitScriptException.bpmn2";
private static final String ON_EXIT_SCRIPT_EXCEPTION_ID = "org.jbpm.test.regression.task.HumanTask-onExitScriptException";
private static final String ABORT_WORKITEM_TASK_STATUS = "org/jbpm/test/regression/task/HumanTask-abortWorkItemTaskStatus.bpmn2";
private static final String ABORT_WORKITEM_TASK_STATUS_ID = "org.jbpm.test.regression.task.HumanTask-abortWorkItemTaskStatus";
private static final String LOCALE = "org/jbpm/test/regression/task/HumanTask-locale.bpmn2";
private static final String LOCALE_ID = "org.jbpm.test.regression.task.HumanTask-locale";
private static final String INPUT_TRANSFORMATION = "org/jbpm/test/regression/task/HumanTask-inputTransformation.bpmn2";
private static final String INPUT_TRANSFORMATION_ID = "org.jbpm.test.regression.task.HumanTask-inputTransformation";
@Test
@BZ("958397")
public void testBoundaryTimer() throws Exception {
createRuntimeManager(BOUNDARY_TIMER);
KieSession ksession = getRuntimeEngine().getKieSession();
TaskService taskService = getRuntimeEngine().getTaskService();
TrackingProcessEventListener tpel = new TrackingProcessEventListener();
ksession.addEventListener(tpel);
ProcessInstance pi = ksession.startProcess(BOUNDARY_TIMER_ID);
// wait for timer
String endNodeName = "End1";
assertTrue( "Node '" + endNodeName + "' was not triggered on time!", tpel.waitForNodeTobeTriggered(endNodeName, 2000));
assertTriggeredAndLeft(tpel, "Script1");
assertTriggered(tpel, endNodeName);
long taskId = taskService.getTasksByProcessInstanceId(pi.getId()).get(0);
taskService.start(taskId, "john");
taskService.complete(taskId, "john", null);
assertTriggeredAndLeft(tpel, "Script2");
assertTriggered(tpel, "End2");
assertProcessInstanceCompleted(pi.getId());
}
@Test
@BZ("1004681")
public void testCompletionRollback() {
createRuntimeManager(COMPLETION_ROLLBACK);
TaskService taskService = getRuntimeEngine().getTaskService();
KieSession ksession = getRuntimeEngine().getKieSession();
ProcessInstance pi = ksession.startProcess(COMPLETION_ROLLBACK_ID);
logger.debug("Process with id = " + pi.getId() + " has just been started.");
List<TaskSummary> taskList = taskService.getTasksAssignedAsPotentialOwner("john", "en-UK");
long taskId = taskList.get(0).getId();
taskService.start(taskId, "john");
Task task = taskService.getTaskById(taskId);
logger.debug("Actual task status: " + task.getTaskData().getStatus());
try {
taskService.complete(taskId, "john", null);
Assertions.fail("Exception should have been thrown from the process script task.");
} catch (Exception ex) {
// exception thrown in process script task is intentional
}
disposeRuntimeManager();
createRuntimeManager(COMPLETION_ROLLBACK);
taskService = getRuntimeEngine().getTaskService();
Status status = taskService.getTaskById(taskId).getTaskData().getStatus();
Assertions.assertThat(status).as("Task completion has not been rolled back!").isEqualTo(Status.InProgress);
}
@Test
@BZ("1120122")
public void testOnEntryScriptException() {
createRuntimeManager(ON_ENTRY_SCRIPT_EXCEPTION);
KieSession ksession = getRuntimeEngine().getKieSession();
TaskService taskService = getRuntimeEngine().getTaskService();
long pid = ksession.startProcess(ON_ENTRY_SCRIPT_EXCEPTION_ID).getId();
List<Long> tasks = taskService.getTasksByProcessInstanceId(pid);
Assertions.assertThat(tasks).hasSize(1);
Task task = taskService.getTaskById(tasks.get(0));
Assertions.assertThat(task.getNames().get(0).getText()).isEqualTo("Human task 2");
}
@Test
@BZ("1120122")
public void testOnExitScriptException() {
createRuntimeManager(ON_EXIT_SCRIPT_EXCEPTION);
KieSession ksession = getRuntimeEngine().getKieSession();
TaskService taskService = getRuntimeEngine().getTaskService();
long pid = ksession.startProcess(ON_EXIT_SCRIPT_EXCEPTION_ID).getId();
List<Long> tasks = taskService.getTasksByProcessInstanceId(pid);
Assertions.assertThat(tasks).hasSize(1);
long taskId = tasks.get(0);
taskService.start(taskId, "john");
taskService.complete(taskId, "john", null);
tasks = taskService.getTasksByProcessInstanceId(pid);
Assertions.assertThat(tasks).hasSize(2);
Task task1 = taskService.getTaskById(Math.min(tasks.get(0), tasks.get(1)));
Assertions.assertThat(task1.getNames().get(0).getText()).isEqualTo("Human task 1");
Assertions.assertThat(task1.getTaskData().getStatus()).isEqualTo(Status.Completed);
Task task2 = taskService.getTaskById(Math.max(tasks.get(0), tasks.get(1)));
Assertions.assertThat(task2.getNames().get(0).getText()).isEqualTo("Human task 2");
Assertions.assertThat(task2.getTaskData().getStatus()).isEqualTo(Status.Reserved);
}
@Test
@BZ("1145046")
public void testAbortWorkItemTaskStatus() {
for (int i = 0; i < 5; i++) {
createRuntimeManager(Strategy.PROCESS_INSTANCE, "abortWorkItemTaskStatus" + i, ABORT_WORKITEM_TASK_STATUS);
RuntimeEngine runtime = getRuntimeEngine();
KieSession ksession = runtime.getKieSession();
Map<String, Object> params = new HashMap<String, Object>();
ProcessInstance pi = ksession.startProcess(ABORT_WORKITEM_TASK_STATUS_ID, params);
TaskService taskService = runtime.getTaskService();
List<Long> list = taskService.getTasksByProcessInstanceId(pi.getId());
for (long taskId : list) {
Task task = taskService.getTaskById(taskId);
Assertions.assertThat(task.getTaskData().getStatus()).isEqualTo(Status.Exited);
}
disposeRuntimeManager();
}
}
@Test
@BZ("1139496")
public void testLocale() {
KieSession ksession = createKSession(LOCALE);
ProcessInstance pi = ksession.startProcess(LOCALE_ID);
RuntimeEngine engine = getRuntimeEngine();
TaskService taskService = engine.getTaskService();
List<TaskSummary> taskList = taskService.getTasksAssignedAsPotentialOwner("john", "ja_JP");
TaskSummary task = taskList.get(0);
taskService.start(task.getId(), "john");
taskService.complete(task.getId(), "john", null);
EntityManagerFactory emf = getEmf();
assertProcessInstanceCompleted(pi.getId());
String language = emf.createEntityManager()
.createNativeQuery("SELECT language from I18NTEXT WHERE shorttext='空手'")
.getSingleResult().toString();
Assertions.assertThat(language).isEqualTo("ja_JP");
}
@Test
@BZ("1081508")
public void testInputTransformation() {
KieSession ksession = createKSession(INPUT_TRANSFORMATION);
ProcessInstance pi = ksession.startProcess(INPUT_TRANSFORMATION_ID);
RuntimeEngine engine = getRuntimeEngine();
TaskService taskService = engine.getTaskService();
List<TaskSummary> taskList = taskService.getTasksAssignedAsPotentialOwner("john", "en-UK");
Long taskId = taskList.get(0).getId();
taskService.start(taskId, "john");
Map<String, Object> taskById = taskService.getTaskContent(taskId);
Assertions.assertThat(taskById).containsEntry("Input", "Transformed String");
taskService.complete(taskId, "john", null);
assertProcessInstanceCompleted(pi.getId());
}
}