/*
* Copyright (c) 2010-2017 Evolveum
*
* 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 com.evolveum.midpoint.wf.impl.policy.other;
import com.evolveum.midpoint.model.api.WorkflowService;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.WfContextUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.wf.impl.activiti.ActivitiEngine;
import com.evolveum.midpoint.wf.impl.policy.AbstractWfTestPolicy;
import com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemDelegationEventType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;
import static com.evolveum.midpoint.test.IntegrationTestTools.display;
import static com.evolveum.midpoint.test.util.TestUtil.assertSuccess;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemDelegationMethodType.ADD_ASSIGNEES;
import static com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemDelegationMethodType.REPLACE_ASSIGNEES;
import static org.testng.AssertJUnit.*;
/**
* @author mederly
*/
@ContextConfiguration(locations = {"classpath:ctx-workflow-test-main.xml"})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class TestDelegation extends AbstractWfTestPolicy {
@Override
protected PrismObject<UserType> getDefaultActor() {
return userAdministrator;
}
@Autowired
private ActivitiEngine activitiEngine;
@Autowired
private WorkflowService workflowService;
private PrismObject<UserType> userLead1, userLead3;
private String workItemId;
private String taskOid;
@Override
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
super.initSystem(initTask, initResult);
DebugUtil.setPrettyPrintBeansAs(PrismContext.LANG_YAML);
}
@Test
public void test100CreateTask() throws Exception {
final String TEST_NAME = "test100CreateTask";
TestUtil.displayTestTile(this, TEST_NAME);
login(userAdministrator);
userLead1 = getUser(userLead1Oid);
userLead3 = getUser(userLead3Oid);
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
assignRole(userJackOid, roleRole1aOid, task, result); // should start approval process
assertNotAssignedRole(userJackOid, roleRole1aOid, task, result);
WorkItemType workItem = getWorkItem(task, result);
workItemId = workItem.getExternalId();
taskOid = WfContextUtil.getTask(workItem).getOid();
display("work item", workItem);
display("task", getObjectViaRepo(TaskType.class, taskOid));
PrismAsserts.assertReferenceValues(ref(workItem.getAssigneeRef()), userLead1Oid);
}
@Test
public void test110DelegateToUser2Unauthorized() throws Exception {
final String TEST_NAME = "test110DelegateToUser2Unauthorized";
TestUtil.displayTestTile(this, TEST_NAME);
login(userLead3);
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
try {
workflowService.delegateWorkItem(workItemId, Collections.singletonList(ort(userLead2Oid)), ADD_ASSIGNEES, result);
fail("delegate succeeded even if it shouldn't");
} catch (SecurityViolationException e) {
// ok
}
WorkItemType workItem = getWorkItem(task, result);
PrismAsserts.assertReferenceValues(ref(workItem.getAssigneeRef()), userLead1Oid);
}
@Test
public void test120DelegateToUser2() throws Exception {
final String TEST_NAME = "test120DelegateToUser2";
TestUtil.displayTestTile(this, TEST_NAME);
login(userLead1);
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
workflowService.delegateWorkItem(workItemId, Collections.singletonList(ort(userLead2Oid)), ADD_ASSIGNEES, result);
result.computeStatus();
assertSuccess(result);
WorkItemType workItem = getWorkItem(task, result);
display("work item", workItem);
PrismObject<TaskType> wfTask = getObjectViaRepo(TaskType.class, taskOid);
display("task", wfTask);
PrismAsserts.assertReferenceValues(ref(workItem.getAssigneeRef()), userLead1Oid, userLead2Oid);
assertRefEquals("Wrong originalAssigneeRef", ort(userLead1Oid), workItem.getOriginalAssigneeRef());
org.activiti.engine.task.Task activitiTask = activitiEngine.getTaskService().createTaskQuery()
.taskId(workItem.getExternalId())
.singleResult();
System.out.println("Activiti task: " + activitiTask);
assertEquals("Wrong activiti assignee", "UserType:"+userLead1Oid, activitiTask.getAssignee());
List<String> assignees = getAssignees(activitiTask);
assertEquals("Wrong midpoint-assignee values", new HashSet<>(Arrays.asList("UserType:" + userLead1Oid, "UserType:" + userLead2Oid)),
new HashSet<>(assignees));
List<WorkItemDelegationEventType> events = WfContextUtil.getWorkItemEvents(wfTask.asObjectable().getWorkflowContext(), workItemId, WorkItemDelegationEventType.class);
assertEquals("Wrong # of delegation events", 1, events.size());
// TODO check content
}
private List<String> getAssignees(org.activiti.engine.task.Task activitiTask) {
return activitiEngine.getTaskService().getIdentityLinksForTask(activitiTask.getId()).stream()
.filter(i -> CommonProcessVariableNames.MIDPOINT_ASSIGNEE.equals(i.getType()))
.map(i -> i.getUserId()).collect(Collectors.toList());
}
@Test
public void test130DelegateToUser3ByReplace() throws Exception {
final String TEST_NAME = "test130DelegateToUser3ByReplace";
TestUtil.displayTestTile(this, TEST_NAME);
login(userLead1);
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
workflowService.delegateWorkItem(workItemId, Collections.singletonList(ort(userLead3Oid)), REPLACE_ASSIGNEES, result);
result.computeStatus();
assertSuccess(result);
WorkItemType workItem = getWorkItem(task, result);
display("work item", workItem);
PrismObject<TaskType> wfTask = getObjectViaRepo(TaskType.class, taskOid);
display("task", wfTask);
PrismAsserts.assertReferenceValues(ref(workItem.getAssigneeRef()), userLead3Oid);
assertRefEquals("Wrong originalAssigneeRef", ort(userLead1Oid), workItem.getOriginalAssigneeRef());
org.activiti.engine.task.Task activitiTask = activitiEngine.getTaskService().createTaskQuery()
.taskId(workItem.getExternalId())
.singleResult();
System.out.println("Activiti task: " + activitiTask);
assertEquals("Wrong activiti assignee", "UserType:"+userLead3Oid, activitiTask.getAssignee());
List<String> assignees = getAssignees(activitiTask);
assertEquals("Wrong midpoint-assignee values", Collections.singleton("UserType:" + userLead3Oid),
new HashSet<>(assignees));
List<WorkItemDelegationEventType> events = WfContextUtil.getWorkItemEvents(wfTask.asObjectable().getWorkflowContext(), workItemId, WorkItemDelegationEventType.class);
assertEquals("Wrong # of delegation events", 2, events.size());
// TODO check content
}
@Test
public void test140DelegateToNoneByReplace() throws Exception {
final String TEST_NAME = "test140DelegateToNoneByReplace";
TestUtil.displayTestTile(this, TEST_NAME);
login(userLead3);
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
workflowService.delegateWorkItem(workItemId, Collections.emptyList(), REPLACE_ASSIGNEES, result);
result.computeStatus();
assertSuccess(result);
WorkItemType workItem = getWorkItem(task, result);
display("work item", workItem);
PrismObject<TaskType> wfTask = getObjectViaRepo(TaskType.class, taskOid);
display("task", wfTask);
assertEquals("Wrong assigneeRef count", 0, workItem.getAssigneeRef().size());
assertRefEquals("Wrong originalAssigneeRef", ort(userLead1Oid), workItem.getOriginalAssigneeRef());
org.activiti.engine.task.Task activitiTask = activitiEngine.getTaskService().createTaskQuery()
.taskId(workItem.getExternalId())
.singleResult();
System.out.println("Activiti task: " + activitiTask);
assertEquals("Wrong activiti assignee", null, activitiTask.getAssignee());
assertEquals("Wrong # of assignees", 0, getAssignees(activitiTask).size());
List<WorkItemDelegationEventType> events = WfContextUtil.getWorkItemEvents(wfTask.asObjectable().getWorkflowContext(), workItemId, WorkItemDelegationEventType.class);
assertEquals("Wrong # of delegation events", 3, events.size());
// TODO check content
}
}