/* 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.activiti.engine.test.api.runtime;
import java.util.List;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
/**
* @author Marcus Klimstra
*/
public class InstanceInvolvementTest extends PluggableActivitiTestCase {
@Deployment(resources={
"org/activiti/engine/test/api/runtime/threeParallelTasks.bpmn20.xml"})
public void testInvolvements() {
// "user1", "user2", "user3" and "user4 should not be involved with any process instance
assertNoInvolvement("user1");
assertNoInvolvement("user2");
assertNoInvolvement("user3");
assertNoInvolvement("user4");
// start a new process instance as "user1"
String instanceId = startProcessAsUser("threeParallelTasks", "user1");
// there are supposed to be 3 tasks
List<Task> tasks = taskService.createTaskQuery().processInstanceId(instanceId).list();
assertEquals(3, tasks.size());
// "user1" should now be involved as the starter of the new process instance. "user2" is still not involved.
assertInvolvement("user1", instanceId);
assertNoInvolvement("user2");
// "user2" should be involved with the new process instance after claiming a task
taskService.claim(tasks.get(0).getId(), "user2");
assertInvolvement("user2", instanceId);
// "user2" should still be involved with the new process instance even after completing his task
taskService.complete(tasks.get(0).getId());
assertInvolvement("user2", instanceId);
// "user3" should be involved after completing a task even without claiming it
completeTaskAsUser(tasks.get(1).getId(), "user3");
assertInvolvement("user3", instanceId);
// "user4" should be involved after manually adding an identity link
runtimeService.addUserIdentityLink(instanceId, "user4", "custom");
assertInvolvement("user4", instanceId);
// verify all identity links for this instance
// note that since "user1" already is the starter, he is not involved as a participant as well
List<IdentityLink> identityLinks = runtimeService.getIdentityLinksForProcessInstance(instanceId);
assertTrue(containsIdentityLink(identityLinks, "user1", "starter"));
assertTrue(containsIdentityLink(identityLinks, "user2", "participant"));
assertTrue(containsIdentityLink(identityLinks, "user3", "participant"));
assertTrue(containsIdentityLink(identityLinks, "user4", "custom"));
assertEquals(4, identityLinks.size());
// "user1" completes the remaining task, ending the process
completeTaskAsUser(tasks.get(2).getId(), "user1");
// none of the users should now be involved with any process instance
assertNoInvolvement("user1");
assertNoInvolvement("user2");
assertNoInvolvement("user3");
assertNoInvolvement("user4");
}
@Deployment(resources={
"org/activiti/engine/test/api/runtime/threeParallelTasks.bpmn20.xml"})
public void testInstanceRemoval() {
String instanceId = startProcessAsUser("threeParallelTasks", "user1");
assertInvolvement("user1", instanceId);
runtimeService.deleteProcessInstance(instanceId, "Testing instance removal");
assertNoInvolvement("user1");
// this will fail with a "DB NOT CLEAN" if the identity links are not removed
}
/**
* Test for ACT-1686
*/
@Deployment(resources={
"org/activiti/engine/test/api/runtime/oneTaskProcess.bpmn20.xml"})
public void testUserMultipleTimesinvolvedWithProcessInstance() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
// Add 2 links of a different type for the same user
runtimeService.addUserIdentityLink(processInstance.getId(), "kermit", "type1");
runtimeService.addUserIdentityLink(processInstance.getId(), "kermit", "type2");
assertEquals(1L, runtimeService.createProcessInstanceQuery().involvedUser("kermit").count());
}
private void assertNoInvolvement(String userId) {
assertEquals(0L, runtimeService.createProcessInstanceQuery().involvedUser(userId).count());
}
private void assertInvolvement(String userId, String instanceId) {
ProcessInstance involvedInstance = runtimeService
.createProcessInstanceQuery()
.involvedUser(userId)
.singleResult();
assertEquals(instanceId, involvedInstance.getId());
}
private String startProcessAsUser(String processId, String userId) {
try {
identityService.setAuthenticatedUserId(userId);
return runtimeService.startProcessInstanceByKey(processId).getId();
}
finally {
identityService.setAuthenticatedUserId(null);
}
}
private void completeTaskAsUser(String taskId, String userId) {
try {
identityService.setAuthenticatedUserId(userId);
taskService.complete(taskId);
}
finally {
identityService.setAuthenticatedUserId(null);
}
}
private boolean containsIdentityLink(List<IdentityLink> identityLinks, String userId, String type) {
for (IdentityLink identityLink : identityLinks) {
if (userId.equals(identityLink.getUserId()) && type.equals(identityLink.getType())) {
return true;
}
}
return false;
}
}