/*
* 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 java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.assertj.core.api.Assertions;
import org.jbpm.test.JbpmTestCase;
import org.jbpm.workflow.instance.node.HumanTaskNodeInstance;
import org.junit.Test;
import org.kie.api.event.process.DefaultProcessEventListener;
import org.kie.api.event.process.ProcessNodeTriggeredEvent;
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 HumanTaskSwimlaneTest extends JbpmTestCase {
private static final String SWIMLANE_SAME_GROUPS =
"org/jbpm/test/regression/task/HumanTaskSwimlane-sameGroups.bpmn2";
private static final String SWIMLANE_SAME_GROUPS_ID =
"org.jbpm.test.regression.task.HumanTaskSwimlane-sameGroups";
private static final String SWIMLANE_DIFFERENT_GROUPS =
"org/jbpm/test/regression/task/HumanTaskSwimlane-differentGroups.bpmn2";
private static final String SWIMLANE_DIFFERENT_GROUPS_ID =
"org.jbpm.test.regression.task.HumanTaskSwimlane-differentGroups";
private static final String SWIMLANE_MULTIPLE_ACTORS =
"org/jbpm/test/regression/task/HumanTaskSwimlane-multipleActors.bpmn2";
private static final String SWIMLANE_MULTIPLE_ACTORS_ID =
"org.jbpm.test.regression.task.HumanTaskSwimlane-multipleActors";
private TaskService taskService;
@Test
@BZ("997139")
public void testSameGroups() {
createRuntimeManager(SWIMLANE_SAME_GROUPS);
KieSession ksession = getRuntimeEngine().getKieSession();
taskService = getRuntimeEngine().getTaskService();
ProcessInstance pi = ksession.startProcess(SWIMLANE_SAME_GROUPS_ID);
long task1 = getActiveTask(pi).getId();
taskService.claim(task1, "john");
taskService.start(task1, "john");
taskService.complete(task1, "john", null);
Task task2 = getActiveTask(pi);
Assertions.assertThat(task2.getTaskData().getStatus()).isEqualTo(Status.Reserved);
Assertions.assertThat(task2.getTaskData().getActualOwner().getId()).isEqualTo("john");
Assertions.assertThat(task2.getPeopleAssignments().getPotentialOwners().get(0).getId()).isEqualTo("users");
}
@Test
@BZ("997139")
public void testDifferentGroups() {
createRuntimeManager(SWIMLANE_DIFFERENT_GROUPS);
KieSession ksession = getRuntimeEngine().getKieSession();
taskService = getRuntimeEngine().getTaskService();
ProcessInstance pi = ksession.startProcess(SWIMLANE_DIFFERENT_GROUPS_ID);
long task1 = getActiveTask(pi).getId();
taskService.claim(task1, "john");
taskService.start(task1, "john");
taskService.complete(task1, "john", null);
Task task2 = getActiveTask(pi);
Assertions.assertThat(task2.getTaskData().getStatus()).isEqualTo(Status.Ready);
Assertions.assertThat(task2.getTaskData().getActualOwner()).isNull();
Assertions.assertThat(task2.getPeopleAssignments().getPotentialOwners().get(0).getId()).isEqualTo("sales");
}
private Task getActiveTask(ProcessInstance pi) {
List<Long> taskIds = taskService.getTasksByProcessInstanceId(pi.getId());
for (Long taskId : taskIds) {
Task task = taskService.getTaskById(taskId);
if (!task.getTaskData().getStatus().equals(Status.Completed)) {
return task;
}
}
return null;
}
@Test
public void testSwimlaneWithMultipleActorsAssigned() {
createRuntimeManager(SWIMLANE_MULTIPLE_ACTORS);
String user = "john";
RuntimeEngine runtime = getRuntimeEngine();
KieSession kSession = runtime.getKieSession();
TaskService taskservice = runtime.getTaskService();
kSession.addEventListener(new DefaultProcessEventListener(){
@Override
public void afterNodeTriggered(ProcessNodeTriggeredEvent event) {
if (event.getNodeInstance().getNodeName().equals("TASK")) {
Object swimlaneActorId = ((HumanTaskNodeInstance) event.getNodeInstance()).getWorkItem().getParameter("SwimlaneActorId");
assertNull(swimlaneActorId);
}
}
});
Map<String, Object> map = new HashMap<String, Object>();
ProcessInstance instance = kSession.startProcess(SWIMLANE_MULTIPLE_ACTORS_ID, map);
List<Status> statuses = new ArrayList<Status>();
statuses.add(Status.Ready);
statuses.add(Status.Reserved);
statuses.add(Status.InProgress);
List<TaskSummary> tasks = taskservice.getTasksByStatusByProcessInstanceId(instance.getId(), statuses, "en_US");
assertNotNull(tasks);
assertEquals(1, tasks.size());
TaskSummary task = tasks.get(0);
assertEquals(Status.Ready, task.getStatus());
taskservice.claim(task.getId(), user);
taskservice.start(task.getId(), user);
tasks = taskservice.getTasksByStatusByProcessInstanceId(instance.getId(), statuses, "en_US");
assertNotNull(tasks);
assertEquals(1, tasks.size());
task = tasks.get(0);
assertEquals(Status.InProgress, task.getStatus());
taskservice.complete(task.getId(), user, map);
assertProcessInstanceCompleted(instance.getId());
}
}