package com.constellio.app.modules.tasks.services;
import static com.constellio.app.modules.rm.wrappers.RMTask.LINKED_FOLDERS;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static com.constellio.sdk.tests.TestUtils.assertThatRecord;
import static java.util.Arrays.asList;
import static junit.framework.Assert.fail;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.groups.Tuple.tuple;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.assertj.core.api.ListAssert;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.wrappers.RMTask;
import com.constellio.app.modules.tasks.model.wrappers.Task;
import com.constellio.app.modules.tasks.model.wrappers.TaskStatusType;
import com.constellio.app.modules.tasks.model.wrappers.Workflow;
import com.constellio.app.modules.tasks.model.wrappers.WorkflowInstance;
import com.constellio.app.modules.tasks.model.wrappers.WorkflowInstanceStatus;
import com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus;
import com.constellio.app.modules.tasks.services.WorkflowServicesRuntimeException.WorkflowServicesRuntimeException_UnsupportedAddAtPosition;
import com.constellio.app.modules.tasks.ui.entities.WorkflowTaskProgressionVO;
import com.constellio.app.modules.tasks.ui.entities.WorkflowTaskVO;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException.ValidationException;
import com.constellio.model.services.search.SearchServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.FakeSessionContext;
import com.constellio.sdk.tests.setups.Users;
public class WorkflowServicesAcceptanceTest extends ConstellioTest {
TasksSchemasRecordsServices tasks;
RMTestRecords records = new RMTestRecords(zeCollection);
Users users = new Users();
WorkflowServices services;
SearchServices searchServices;
RecordServices recordServices;
Map<String, List<String>> noExtraFields = Collections.emptyMap();
@Before
public void setUp()
throws Exception {
prepareSystem(withZeCollection().withTasksModule().withAllTest(users).withConstellioRMModule().withRMTest(records)
.withFoldersAndContainersOfEveryStatus());
services = new WorkflowServices(zeCollection, getAppLayerFactory());
searchServices = getModelLayerFactory().newSearchServices();
tasks = new TasksSchemasRecordsServices(zeCollection, getAppLayerFactory());
this.recordServices = getModelLayerFactory().newRecordServices();
givenApprovalWorkflow();
givenSimpleWorkflow();
}
@Test
public void whenSearchingWorkflowModelTaskThenOnlyReturnGivenWorkflowModelTask()
throws Exception {
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
Workflow simpleWorkflow = tasks.getWorkflowWithCode("simple");
services.start(approvalWorkflow, users.adminIn(zeCollection), noExtraFields);
assertThat(services.getWorkflows()).extracting("code").isEqualTo(asList(
"simple", "approval"));
assertThat(services.getWorkflowModelTasks(approvalWorkflow.getId())).extracting("id").isEqualTo(asList(
"details", "approval", "refusalFirstTask", "approvedFirstTask", "approvedSecondTask"));
assertThat(services.getWorkflowModelTasks(simpleWorkflow.getId())).extracting("id").isEqualTo(asList(
"task1", "task2", "task3", "task4", "taskZ"));
}
@Test
public void whenStartingAWorkflowThenCreateFirstTasks()
throws Exception {
long initialTasksCount = getAllTasksCount();
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
Workflow simpleWorkflow = tasks.getWorkflowWithCode("simple");
WorkflowInstance approvalWorkflowInstance = services
.start(approvalWorkflow, users.edouardIn(zeCollection), noExtraFields);
assertThat(services.getCurrentWorkflowInstances()).containsOnly(approvalWorkflowInstance);
assertThatRecord(approvalWorkflowInstance)
.hasMetadata(tasks.workflowInstance.title(), "Un workflow d'approbation")
.hasMetadata(tasks.workflowInstance.startedBy(), users.edouardIn(zeCollection).getId())
.hasMetadata(tasks.workflowInstance.status(), WorkflowInstanceStatus.IN_PROGRESS);
assertThat(getAllTasksCount() - initialTasksCount).isEqualTo(1);
assertThat(services.getWorkflowInstanceTasks(approvalWorkflowInstance)).extracting("title").isEqualTo(asList(
"Détails"));
WorkflowInstance simpleWorkflowInstance = services
.start(simpleWorkflow, users.dakotaLIndienIn(zeCollection), noExtraFields);
assertThat(services.getWorkflowInstanceTasks(simpleWorkflowInstance)).extracting("title").containsOnly(
"Task 1"
);
assertThat(getAllTasksCount() - initialTasksCount).isEqualTo(2);
}
@Test
public void whenGetAvailableWorkflowTaskVOForNewTaskThenReturnEligibleTasks()
throws Exception {
SessionContext sessionContext = FakeSessionContext.adminInCollection(zeCollection);
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
assertThat(services.getAvailableWorkflowTaskVOForNewTask(approvalWorkflow.getId(), sessionContext))
.extracting("id", "decision").containsOnly(
tuple("details", null),
tuple("approval", "true"),
tuple("approval", "false"),
tuple("approvedFirstTask", null),
tuple("approvedSecondTask", null),
tuple("refusalFirstTask", null)
);
List<WorkflowTaskVO> approvalWorkflowRoots = services.getRootModelTaskVOs(approvalWorkflow, sessionContext);
List<WorkflowTaskVO> approvalNodes = services.getChildModelTasks(approvalWorkflowRoots.get(1), sessionContext);
List<WorkflowTaskVO> approvedNodes = services.getChildModelTasks(approvalNodes.get(1), sessionContext);
List<WorkflowTaskVO> refusedNodes = services.getChildModelTasks(approvalNodes.get(0), sessionContext);
assertThat(services.canAddTaskIn(approvalWorkflowRoots.get(0), sessionContext)).isTrue();
assertThat(services.canAddDecisionTaskIn(approvalWorkflowRoots.get(0), sessionContext)).isFalse();
assertThat(services.canAddTaskIn(approvalWorkflowRoots.get(1), sessionContext)).isFalse();
assertThat(services.canAddDecisionTaskIn(approvalWorkflowRoots.get(1), sessionContext)).isFalse();
assertThat(services.canAddTaskIn(approvalNodes.get(0), sessionContext)).isTrue();
assertThat(services.canAddDecisionTaskIn(approvalNodes.get(0), sessionContext)).isFalse();
assertThat(services.canAddTaskIn(approvalNodes.get(1), sessionContext)).isTrue();
assertThat(services.canAddDecisionTaskIn(approvalNodes.get(1), sessionContext)).isFalse();
assertThat(services.canAddTaskIn(approvedNodes.get(0), sessionContext)).isTrue();
assertThat(services.canAddDecisionTaskIn(approvedNodes.get(0), sessionContext)).isFalse();
assertThat(services.canAddTaskIn(approvedNodes.get(1), sessionContext)).isTrue();
assertThat(services.canAddDecisionTaskIn(approvedNodes.get(1), sessionContext)).isTrue();
assertThat(services.canAddTaskIn(refusedNodes.get(0), sessionContext)).isTrue();
assertThat(services.canAddDecisionTaskIn(refusedNodes.get(0), sessionContext)).isTrue();
}
@Test
public void whenCreateATaskAtTheEndThenCorrectlyAdded()
throws Exception {
SessionContext sessionContext = FakeSessionContext.forRealUserIncollection(users.gandalfLeblancIn(zeCollection));
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
WorkflowTaskVO approvalSecondTask = services.newWorkflowTaskVO(tasks.getTask("approvedSecondTask"), sessionContext);
Task task = services.createModelTaskAfter(approvalWorkflow, approvalSecondTask, null, "ze new task", sessionContext);
assertThat(task.getTitle()).isEqualTo("ze new task");
assertThat(task.getNextTasks()).isEmpty();
Task previousTask = tasks.getTask(approvalSecondTask.getId());
assertThat(previousTask.getNextTasks()).containsOnly(task.getId());
assertThat(services.getRootModelTaskVOs(approvalWorkflow, sessionContext)).extracting("id").containsOnly(
"details", "approval"
);
}
@Test
public void whenCreateATaskWithDecisionAtTheEndThenCorrectlyAdded()
throws Exception {
SessionContext sessionContext = FakeSessionContext.forRealUserIncollection(users.gandalfLeblancIn(zeCollection));
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
WorkflowTaskVO approvalSecondTask = services.newWorkflowTaskVO(tasks.getTask("approvedSecondTask"), sessionContext);
Task task = services.createDecisionModelTaskAfter(approvalWorkflow, approvalSecondTask, null,
"ze new task", asList("decision1", "decision2"), sessionContext);
assertThat(task.getTitle()).isEqualTo("ze new task");
assertThat(task.getNextTasksDecisionsCodes()).containsOnly("decision1", "decision2");
assertThat(task.getNextTasks()).isEmpty();
Task previousTask = tasks.getTask(approvalSecondTask.getId());
assertThat(previousTask.getNextTasks()).containsOnly(task.getId());
assertThat(services.getRootModelTaskVOs(approvalWorkflow, sessionContext)).extracting("id").containsOnly(
"details", "approval"
);
WorkflowTaskVO zeNewTaskDecision1 = services.newWorkflowTaskVO(previousTask, "decision1", sessionContext);
Task zeNewTaskInDecision1 = services.createDecisionModelTaskAfter(approvalWorkflow, zeNewTaskDecision1,
null, "ze new task decision 1 sub decisions", asList("decision3", "decision4"), sessionContext);
assertThat(zeNewTaskInDecision1.getTitle()).isEqualTo("ze new task decision 1 sub decisions");
assertThat(zeNewTaskInDecision1.getNextTasksDecisionsCodes()).containsOnly("decision3", "decision4");
assertThat(zeNewTaskInDecision1.getNextTasks()).isEmpty();
WorkflowTaskVO zeNewTaskDecision2 = services.newWorkflowTaskVO(previousTask, "decision2", sessionContext);
Task zeNewTaskInDecision2 = services.createModelTaskAfter(approvalWorkflow, zeNewTaskDecision2,
null, "ze new task decision 2 sub decisions", sessionContext);
assertThat(zeNewTaskInDecision2.getTitle()).isEqualTo("ze new task decision 2 sub decisions");
assertThat(zeNewTaskInDecision2.getNextTasks()).isEmpty();
assertThat(services.getChildModelTasks(zeNewTaskDecision1, sessionContext)).extracting("id", "decision").containsOnly(
tuple(zeNewTaskInDecision1.getId(), null)
);
WorkflowTaskVO zeNewTaskInDecision1VO = services.newWorkflowTaskVO(zeNewTaskInDecision1, sessionContext);
assertThat(services.getChildModelTasks(zeNewTaskInDecision1VO, sessionContext)).extracting("id", "decision").containsOnly(
tuple(zeNewTaskInDecision1.getId(), "decision3"),
tuple(zeNewTaskInDecision1.getId(), "decision4")
);
assertThat(services.getChildModelTasks(zeNewTaskDecision2, sessionContext)).extracting("id", "decision").containsOnly(
tuple(zeNewTaskInDecision2.getId(), null)
);
}
@Test
public void whenCreateATaskInAtAnInvalidLocationThenExceptionAndNoCreatedTask()
throws Exception {
SessionContext sessionContext = FakeSessionContext.forRealUserIncollection(users.gandalfLeblancIn(zeCollection));
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
assertThat(services.getWorkflowModelTasks(approvalWorkflow.getId())).extracting("id").containsOnly(
"details", "approval", "approval", "approvedFirstTask", "approvedSecondTask", "refusalFirstTask"
);
WorkflowTaskVO approvalTask = services.getRootModelTaskVOs(approvalWorkflow, sessionContext).get(1);
try {
services.createModelTaskAfter(approvalWorkflow, approvalTask, null, "ze new task", sessionContext);
fail("exception expected");
} catch (WorkflowServicesRuntimeException_UnsupportedAddAtPosition e) {
//OK
}
assertThat(services.getWorkflowModelTasks(approvalWorkflow.getId())).extracting("id").containsOnly(
"details", "approval", "approval", "approvedFirstTask", "approvedSecondTask", "refusalFirstTask"
);
}
@Test
public void whenCompleteATaskWithoutSpecifyingADecisionThenValidationError()
throws Exception {
String finishedStatus = searchServices.searchSingleResult(
from(tasks.ddvTaskStatus.schemaType()).where(tasks.ddvTaskStatus.statusType()).isEqualTo(
TaskStatusType.FINISHED)).getId();
String closedStatus = tasks.getTaskStatusWithCode(TaskStatus.CLOSED_CODE).getId();
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
WorkflowInstance approvalWorkflowInstance = services
.start(approvalWorkflow, users.edouardIn(zeCollection), noExtraFields);
recordServices.update(services.getCurrentWorkflowInstanceTask(approvalWorkflowInstance).setStatus(closedStatus));
Task currentTask = services.getCurrentWorkflowInstanceTask(approvalWorkflowInstance);
try {
recordServices.update(currentTask.setStatus(finishedStatus));
fail("validation exception expected");
} catch (ValidationException e) {
//OK
}
}
@Test
public void givenAWorkflowIsCreatedWithAttachedRecordsThenAttachedToAllCreatedTasks()
throws Exception {
String closedStatus = tasks.getTaskStatusWithCode(TaskStatus.CLOSED_CODE).getId();
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
Map<String, List<String>> extraFields = new HashMap<>();
extraFields.put(LINKED_FOLDERS, asList(records.folder_A04, records.folder_A08));
WorkflowInstance approvalWorkflowInstance = services
.start(approvalWorkflow, users.edouardIn(zeCollection), extraFields);
assertThat(services.getCurrentWorkflowInstances()).containsOnly(approvalWorkflowInstance);
assertThatRecord(approvalWorkflowInstance)
.hasMetadata(tasks.workflowInstance.status(), WorkflowInstanceStatus.IN_PROGRESS);
List<Task> tasks = services.getWorkflowInstanceTasks(approvalWorkflowInstance);
assertThat(tasks).hasSize(1);
assertThat(tasks.get(0).get(RMTask.LINKED_FOLDERS)).isEqualTo(asList(records.folder_A04, records.folder_A08));
recordServices.update(services.getCurrentWorkflowInstanceTask(approvalWorkflowInstance).setStatus(closedStatus));
tasks = services.getWorkflowInstanceTasks(approvalWorkflowInstance);
assertThat(tasks).hasSize(2);
assertThat(tasks.get(0).get(RMTask.LINKED_FOLDERS)).isEqualTo(asList(records.folder_A04, records.folder_A08));
assertThat(tasks.get(1).get(RMTask.LINKED_FOLDERS)).isEqualTo(asList(records.folder_A04, records.folder_A08));
}
@Test
public void whenCompleteATaskThenNextOneIsCreatedOrWorkflowFinished()
throws Exception {
String standbyStatus = tasks.getTaskStatusWithCode(TaskStatus.STANDBY_CODE).getId();
String finishedStatus = searchServices.searchSingleResult(
from(tasks.ddvTaskStatus.schemaType()).where(tasks.ddvTaskStatus.statusType()).isEqualTo(
TaskStatusType.FINISHED)).getId();
String closedStatus = tasks.getTaskStatusWithCode(TaskStatus.CLOSED_CODE).getId();
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
WorkflowInstance approvalWorkflowInstance = services
.start(approvalWorkflow, users.edouardIn(zeCollection), noExtraFields);
assertThat(services.getCurrentWorkflowInstances()).containsOnly(approvalWorkflowInstance);
assertThatRecord(approvalWorkflowInstance)
.hasMetadata(tasks.workflowInstance.status(), WorkflowInstanceStatus.IN_PROGRESS);
assertThat(services.getWorkflowInstanceTasks(approvalWorkflowInstance)).extracting("title", "status").containsOnly(
tuple("Détails", standbyStatus));
assertThatWorkflowProgression(approvalWorkflowInstance).extracting("title", "decision", "status", "dueDate").containsOnly(
tuple("Détails", null, TaskStatusType.STANDBY, null),
tuple("Demande d'approbation", null, null, null),
tuple("Demande d'approbation - true", "true", null, null),
tuple("Demande d'approbation - false", "false", null, null),
tuple("Approuvée - Première tâche", null, null, null),
tuple("Approuvée - Deuxième tâche", null, null, null),
tuple("Refusées - Première tâche", null, null, null)
);
recordServices.update(services.getCurrentWorkflowInstanceTask(approvalWorkflowInstance).setStatus(closedStatus));
assertThat(services.getWorkflowInstanceTasks(approvalWorkflowInstance)).extracting("title", "status").containsOnly(
tuple("Demande d'approbation", standbyStatus),
tuple("Détails", closedStatus));
assertThatWorkflowProgression(approvalWorkflowInstance).extracting("title", "decision", "status", "dueDate").containsOnly(
tuple("Détails", null, TaskStatusType.CLOSED, null),
tuple("Demande d'approbation", null, TaskStatusType.STANDBY, null),
tuple("Demande d'approbation - true", "true", null, null),
tuple("Demande d'approbation - false", "false", null, null),
tuple("Approuvée - Première tâche", null, null, null),
tuple("Approuvée - Deuxième tâche", null, null, null),
tuple("Refusées - Première tâche", null, null, null)
);
Task currentTask = services.getCurrentWorkflowInstanceTask(approvalWorkflowInstance);
recordServices.update(currentTask.setStatus(finishedStatus).setDecision("true"));
assertThat(services.getWorkflowInstanceTasks(approvalWorkflowInstance)).extracting("title", "status").containsOnly(
tuple("Demande d'approbation", finishedStatus),
tuple("Détails", closedStatus),
tuple("Approuvée - Première tâche", standbyStatus));
recordServices.update(currentTask.setStatus(standbyStatus).setDecision("true"));
recordServices.update(currentTask.setStatus(closedStatus).setDecision("true"));
recordServices.update(services.getCurrentWorkflowInstanceTask(approvalWorkflowInstance)
.setStatus(closedStatus));
assertThat(services.getWorkflowInstanceTasks(approvalWorkflowInstance)).extracting("title", "status").containsOnly(
tuple("Demande d'approbation", closedStatus),
tuple("Détails", closedStatus),
tuple("Approuvée - Première tâche", closedStatus),
tuple("Approuvée - Deuxième tâche", standbyStatus));
assertThatRecord(tasks.getWorkflowInstance(approvalWorkflowInstance.getId()))
.hasMetadata(tasks.workflowInstance.status(), WorkflowInstanceStatus.IN_PROGRESS);
recordServices.update(services.getCurrentWorkflowInstanceTask(approvalWorkflowInstance)
.setStatus(closedStatus));
assertThat(services.getWorkflowInstanceTasks(approvalWorkflowInstance)).extracting("title", "status").containsOnly(
tuple("Demande d'approbation", closedStatus),
tuple("Détails", closedStatus),
tuple("Approuvée - Première tâche", closedStatus),
tuple("Approuvée - Deuxième tâche", closedStatus));
assertThatRecord(tasks.getWorkflowInstance(approvalWorkflowInstance.getId()))
.hasMetadata(tasks.workflowInstance.status(), WorkflowInstanceStatus.FINISHED);
}
private ListAssert<WorkflowTaskProgressionVO> assertThatWorkflowProgression(
WorkflowInstance workflowInstance) {
SessionContext sessionContext = FakeSessionContext.forRealUserIncollection(users.adminIn(zeCollection));
return assertThat(services.getFlattenModelTaskProgressionVOs(workflowInstance, sessionContext));
}
@Test
public void whenCancellingAWorkflowThen()
throws Exception {
String standbyStatus = tasks.getTaskStatusWithCode(TaskStatus.STANDBY_CODE).getId();
String finishedStatus = searchServices.searchSingleResult(
from(tasks.ddvTaskStatus.schemaType()).where(tasks.ddvTaskStatus.statusType()).isEqualTo(
TaskStatusType.FINISHED)).getId();
String closedStatus = tasks.getTaskStatusWithCode(TaskStatus.CLOSED_CODE).getId();
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
WorkflowInstance approvalWorkflowInstance = services
.start(approvalWorkflow, users.edouardIn(zeCollection), noExtraFields);
assertThat(services.getCurrentWorkflowInstances()).containsOnly(approvalWorkflowInstance);
assertThatRecord(approvalWorkflowInstance)
.hasMetadata(tasks.workflowInstance.status(), WorkflowInstanceStatus.IN_PROGRESS);
assertThat(services.getWorkflowInstanceTasks(approvalWorkflowInstance)).extracting("title", "status").containsOnly(
tuple("Détails", standbyStatus));
recordServices.update(services.getCurrentWorkflowInstanceTask(approvalWorkflowInstance).setStatus(closedStatus));
assertThat(services.getWorkflowInstanceTasks(approvalWorkflowInstance)).extracting("title", "status").containsOnly(
tuple("Demande d'approbation", standbyStatus),
tuple("Détails", closedStatus));
Task currentTask = services.getCurrentWorkflowInstanceTask(approvalWorkflowInstance);
recordServices.update(currentTask.setStatus(finishedStatus).setDecision("true"));
assertThatRecord(tasks.getWorkflowInstance(approvalWorkflowInstance.getId()))
.hasMetadata(tasks.workflowInstance.status(), WorkflowInstanceStatus.IN_PROGRESS);
assertThat(services.getWorkflowInstanceTasks(approvalWorkflowInstance)).extracting("title", "status").containsOnly(
tuple("Demande d'approbation", finishedStatus),
tuple("Détails", closedStatus),
tuple("Approuvée - Première tâche", standbyStatus));
services.cancel(approvalWorkflowInstance);
assertThatRecord(tasks.getWorkflowInstance(approvalWorkflowInstance.getId()))
.hasMetadata(tasks.workflowInstance.status(), WorkflowInstanceStatus.CANCELLED);
assertThat(services.getWorkflowInstanceTasks(approvalWorkflowInstance)).extracting("title", "status").containsOnly(
tuple("Demande d'approbation", finishedStatus),
tuple("Détails", closedStatus));
}
@Test
public void whenDisplayingModelTaskHasATreeThenValidTasks()
throws Exception {
SessionContext sessionContext = FakeSessionContext.adminInCollection(zeCollection);
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
Workflow simpleWorkflow = tasks.getWorkflowWithCode("simple");
services.start(approvalWorkflow, users.edouardIn(zeCollection), noExtraFields);
services.start(simpleWorkflow, users.edouardIn(zeCollection), noExtraFields);
//--
// Approval workflow
//--
List<WorkflowTaskVO> approvalWorkflowRoots = services.getRootModelTaskVOs(approvalWorkflow, sessionContext);
assertThat(approvalWorkflowRoots).extracting("id", "decision").isEqualTo(asList(
tuple("details", null),
tuple("approval", null)));
//details
assertThat(services.getChildModelTasks(approvalWorkflowRoots.get(0), sessionContext)).isEmpty();
//approval
List<WorkflowTaskVO> approvalNodes = services.getChildModelTasks(approvalWorkflowRoots.get(1), sessionContext);
assertThat(approvalNodes).extracting("id", "decision").isEqualTo(asList(
tuple("approval", "false"),
tuple("approval", "true")));
//approved nodes
List<WorkflowTaskVO> approvedNodes = services.getChildModelTasks(approvalNodes.get(1), sessionContext);
assertThat(approvedNodes).extracting("id", "decision").isEqualTo(asList(
tuple("approvedFirstTask", null),
tuple("approvedSecondTask", null)));
//refused nodes
List<WorkflowTaskVO> refusedNodes = services.getChildModelTasks(approvalNodes.get(0), sessionContext);
assertThat(refusedNodes).extracting("id", "decision").isEqualTo(asList(
tuple("refusalFirstTask", null)));
//--
// Simple workflow
//--
List<WorkflowTaskVO> simpleWorkflowRoots = services.getRootModelTaskVOs(simpleWorkflow, sessionContext);
assertThat(simpleWorkflowRoots).extracting("id", "decision").isEqualTo(asList(
tuple("task1", null),
tuple("task2", null),
tuple("task3", null),
tuple("task4", null),
tuple("taskZ", null)));
//--
// Move tasks
//--
}
@Test
public void whenDeletingTaskWithDecisionThenAllHierarchyIsDeleted()
throws Exception {
SessionContext sessionContext = FakeSessionContext.adminInCollection(zeCollection);
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
Workflow simpleWorkflow = tasks.getWorkflowWithCode("simple");
services.start(approvalWorkflow, users.edouardIn(zeCollection), noExtraFields);
services.start(simpleWorkflow, users.edouardIn(zeCollection), noExtraFields);
//--
// Approval workflow
//--
List<WorkflowTaskVO> approvalWorkflowRoots = services.getRootModelTaskVOs(approvalWorkflow, sessionContext);
assertThat(approvalWorkflowRoots).extracting("id", "decision").isEqualTo(asList(
tuple("details", null),
tuple("approval", null)));
services.delete(approvalWorkflowRoots.get(1), sessionContext);
//details
assertThat(services.getChildModelTasks(approvalWorkflowRoots.get(0), sessionContext)).isEmpty();
approvalWorkflowRoots = services.getRootModelTaskVOs(approvalWorkflow, sessionContext);
assertThat(approvalWorkflowRoots).extracting("id", "decision").isEqualTo(asList(
tuple("details", null)));
}
@Test
public void whenDeletingTaskDecisionNodeThenAllHierarchyIsDeleted()
throws Exception {
SessionContext sessionContext = FakeSessionContext.adminInCollection(zeCollection);
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
Workflow simpleWorkflow = tasks.getWorkflowWithCode("simple");
services.start(approvalWorkflow, users.edouardIn(zeCollection), noExtraFields);
services.start(simpleWorkflow, users.edouardIn(zeCollection), noExtraFields);
//--
// Approval workflow
//--
List<WorkflowTaskVO> approvalWorkflowRoots = services.getRootModelTaskVOs(approvalWorkflow, sessionContext);
assertThat(approvalWorkflowRoots).extracting("id", "decision").isEqualTo(asList(
tuple("details", null),
tuple("approval", null)));
List<WorkflowTaskVO> approvalNodes = services.getChildModelTasks(approvalWorkflowRoots.get(1), sessionContext);
assertThat(approvalNodes).extracting("id", "decision").isEqualTo(asList(
tuple("approval", "false"),
tuple("approval", "true")));
//approved nodes
List<WorkflowTaskVO> approvedNodes = services.getChildModelTasks(approvalNodes.get(1), sessionContext);
assertThat(approvedNodes).extracting("id", "decision").isEqualTo(asList(
tuple("approvedFirstTask", null),
tuple("approvedSecondTask", null)));
services.delete(approvedNodes.get(0), sessionContext);
approvalWorkflowRoots = services.getRootModelTaskVOs(approvalWorkflow, sessionContext);
assertThat(approvalWorkflowRoots).extracting("id", "decision").isEqualTo(asList(
tuple("details", null),
tuple("approval", null)));
approvalNodes = services.getChildModelTasks(approvalWorkflowRoots.get(1), sessionContext);
assertThat(approvalNodes).extracting("id", "decision").isEqualTo(asList(
tuple("approval", "false"),
tuple("approval", "true")));
//approved nodes
approvedNodes = services.getChildModelTasks(approvalNodes.get(1), sessionContext);
assertThat(approvedNodes).extracting("id", "decision").isEqualTo(asList(
tuple("approvedSecondTask", null)));
List<WorkflowTaskVO> simpleWorkflowRoots = services.getRootModelTaskVOs(simpleWorkflow, sessionContext);
assertThat(simpleWorkflowRoots).extracting("id", "decision").isEqualTo(asList(
tuple("task1", null),
tuple("task2", null),
tuple("task3", null),
tuple("task4", null),
tuple("taskZ", null)));
services.delete(simpleWorkflowRoots.get(2), sessionContext);
simpleWorkflowRoots = services.getRootModelTaskVOs(simpleWorkflow, sessionContext);
assertThat(simpleWorkflowRoots).extracting("id", "decision").isEqualTo(asList(
tuple("task1", null),
tuple("task2", null),
tuple("task4", null),
tuple("taskZ", null)));
services.delete(simpleWorkflowRoots.get(3), sessionContext);
simpleWorkflowRoots = services.getRootModelTaskVOs(simpleWorkflow, sessionContext);
assertThat(simpleWorkflowRoots).extracting("id", "decision").isEqualTo(asList(
tuple("task1", null),
tuple("task2", null),
tuple("task4", null)));
services.delete(simpleWorkflowRoots.get(0), sessionContext);
simpleWorkflowRoots = services.getRootModelTaskVOs(simpleWorkflow, sessionContext);
assertThat(simpleWorkflowRoots).extracting("id", "decision").isEqualTo(asList(
tuple("task2", null),
tuple("task4", null)));
}
@Test
public void whenCreateTaskAfterAnotherOneThenCorrect()
throws Exception {
SessionContext sessionContext = FakeSessionContext.forRealUserIncollection(users.dakotaLIndienIn(zeCollection));
Workflow simpleWorkflow = tasks.getWorkflowWithCode("simple");
List<WorkflowTaskVO> simpleWorkflowRoots = services.getRootModelTaskVOs(simpleWorkflow, sessionContext);
assertThat(simpleWorkflowRoots).extracting("title", "decision").isEqualTo(asList(
tuple("Task 1", null),
tuple("Task 2", null),
tuple("Task 3", null),
tuple("Task 4", null),
tuple("Task Z", null)));
services.createModelTaskAfter(simpleWorkflow, simpleWorkflowRoots.get(1), null, "New task", sessionContext);
simpleWorkflowRoots = services.getRootModelTaskVOs(simpleWorkflow, sessionContext);
assertThat(simpleWorkflowRoots).extracting("title", "decision").isEqualTo(asList(
tuple("Task 1", null),
tuple("Task 2", null),
tuple("New task", null),
tuple("Task 3", null),
tuple("Task 4", null),
tuple("Task Z", null)));
services.createDecisionModelTaskAfter(simpleWorkflow, simpleWorkflowRoots.get(5), null,
"New decision task", asList("decision1", "decision2"), sessionContext);
simpleWorkflowRoots = services.getRootModelTaskVOs(simpleWorkflow, sessionContext);
assertThat(simpleWorkflowRoots).extracting("title", "decision").isEqualTo(asList(
tuple("Task 1", null),
tuple("Task 2", null),
tuple("New task", null),
tuple("Task 3", null),
tuple("Task 4", null),
tuple("Task Z", null),
tuple("New decision task", null)));
assertThat(services.getChildModelTasks(simpleWorkflowRoots.get(2), sessionContext)).isEmpty();
assertThat(services.getChildModelTasks(simpleWorkflowRoots.get(6), sessionContext)).extracting("title")
.containsOnly("New decision task - decision1", "New decision task - decision2");
}
@Test
public void whenMovingAfterThenCorrectlyMoved()
throws Exception {
SessionContext sessionContext = FakeSessionContext.adminInCollection(zeCollection);
Workflow approvalWorkflow = tasks.getWorkflowWithCode("approval");
Workflow simpleWorkflow = tasks.getWorkflowWithCode("simple");
List<WorkflowTaskVO> simpleWorkflowRoots;
List<WorkflowTaskVO> approvalWorkflowRoots = services.getRootModelTaskVOs(approvalWorkflow, sessionContext);
//approval
List<WorkflowTaskVO> approvalNodes = services.getChildModelTasks(approvalWorkflowRoots.get(1), sessionContext);
//approved nodes
List<WorkflowTaskVO> approvedNodes;
//refused nodes
List<WorkflowTaskVO> refusedNodes = services.getChildModelTasks(approvalNodes.get(0), sessionContext);
//--
// Simple workflow
//--
simpleWorkflowRoots = services.getRootModelTaskVOs(simpleWorkflow, sessionContext);
services.moveAfter(refusedNodes.get(0), approvalNodes.get(0), sessionContext);
//Change nothing
//approval
approvalNodes = services.getChildModelTasks(approvalWorkflowRoots.get(1), sessionContext);
assertThat(approvalNodes).extracting("id", "decision").isEqualTo(asList(
tuple("approval", "false"),
tuple("approval", "true")));
//approved nodes
approvedNodes = services.getChildModelTasks(approvalNodes.get(1), sessionContext);
assertThat(approvedNodes).extracting("id", "decision").isEqualTo(asList(
tuple("approvedFirstTask", null),
tuple("approvedSecondTask", null)));
//refused nodes
refusedNodes = services.getChildModelTasks(approvalNodes.get(0), sessionContext);
assertThat(refusedNodes).extracting("id", "decision").isEqualTo(asList(
tuple("refusalFirstTask", null)));
services.moveAfter(refusedNodes.get(0), approvalNodes.get(1), sessionContext);
refusedNodes = services.getChildModelTasks(approvalNodes.get(0), sessionContext);
assertThat(refusedNodes).extracting("id", "decision").isEmpty();
//approved nodes
approvedNodes = services.getChildModelTasks(approvalNodes.get(1), sessionContext);
assertThat(approvedNodes).extracting("id", "decision").isEqualTo(asList(
tuple("refusalFirstTask", null),
tuple("approvedFirstTask", null),
tuple("approvedSecondTask", null)));
services.moveAfter(simpleWorkflowRoots.get(4), simpleWorkflowRoots.get(1), sessionContext);
simpleWorkflowRoots = services.getRootModelTaskVOs(simpleWorkflow, sessionContext);
assertThat(simpleWorkflowRoots).extracting("id", "decision").isEqualTo(asList(
tuple("task1", null),
tuple("task2", null),
tuple("taskZ", null),
tuple("task3", null),
tuple("task4", null)
));
}
private long getAllTasksCount() {
return getModelLayerFactory().newSearchServices().getResultsCount(from(tasks.userTask.schemaType()).returnAll());
}
private void givenApprovalWorkflow()
throws Exception {
TasksSchemasRecordsServices tasks = new TasksSchemasRecordsServices(zeCollection, getAppLayerFactory());
String legends = users.legendsIn(zeCollection).getId();
String heroes = users.heroesIn(zeCollection).getId();
Transaction transaction = new Transaction();
Workflow workflow = transaction.add(tasks.newWorkflow());
workflow.setCode("approval");
workflow.setTitle("Un workflow d'approbation");
Task details = transaction.add(tasks.newWorkflowModelTaskWithId("details", workflow));
Task approval = transaction.add(tasks.newWorkflowModelTaskWithId("approval", workflow));
Task approvedSecondTask = transaction.add(tasks.newWorkflowModelTaskWithId("approvedSecondTask", workflow));
Task refusalFirstTask = transaction.add(tasks.newWorkflowModelTaskWithId("refusalFirstTask", workflow));
Task approvedFirstTask = transaction.add(tasks.newWorkflowModelTaskWithId("approvedFirstTask", workflow));
details.setTitle("Détails").setAssigneeGroupsCandidates(asList(legends));
approval.setTitle("Demande d'approbation").setAssigneeGroupsCandidates(asList(legends));
approvedFirstTask.setTitle("Approuvée - Première tâche").setAssigneeGroupsCandidates(asList(heroes));
approvedSecondTask.setTitle("Approuvée - Deuxième tâche").setAssigneeGroupsCandidates(asList(heroes));
refusalFirstTask.setTitle("Refusées - Première tâche").setAssigneeGroupsCandidates(asList(heroes));
getModelLayerFactory().newRecordServices().execute(transaction);
recordServices.update(approval.addNextTaskDecision("true", approvedFirstTask.getId())
.addNextTaskDecision("false", refusalFirstTask.getId()));
recordServices.update(approvedFirstTask.setNextTask(approvedSecondTask.getId()));
//recordServices.update(refusalFirstTask.setNextTask(approval.getId()));
recordServices.update(details.setNextTask(approval.getId()));
}
private void givenSimpleWorkflow()
throws Exception {
TasksSchemasRecordsServices tasks = new TasksSchemasRecordsServices(zeCollection, getAppLayerFactory());
String legends = users.legendsIn(zeCollection).getId();
String heroes = users.heroesIn(zeCollection).getId();
String dakota = users.dakotaLIndienIn(zeCollection).getId();
String gandalf = users.gandalfLeblancIn(zeCollection).getId();
String edouard = users.edouardLechatIn(zeCollection).getId();
String chuckNorris = users.chuckNorrisIn(zeCollection).getId();
Transaction transaction = new Transaction();
Workflow workflow = tasks.newWorkflow();
workflow.setCode("simple");
workflow.setTitle("Un simple workflow");
recordServices.add(workflow);
Task taskZ = transaction.add(tasks.newWorkflowModelTaskWithId("taskZ", workflow));
Task task4 = transaction.add(tasks.newWorkflowModelTaskWithId("task4", workflow));
Task task1 = transaction.add(tasks.newWorkflowModelTaskWithId("task1", workflow));
Task task3 = transaction.add(tasks.newWorkflowModelTaskWithId("task3", workflow));
Task task2 = transaction.add(tasks.newWorkflowModelTaskWithId("task2", workflow));
task1.setTitle("Task 1").setAssigneeGroupsCandidates(asList(legends));
task2.setTitle("Task 2").setAssigneeUsersCandidates(asList(dakota, gandalf));
task3.setTitle("Task 3").setAssigneeUsersCandidates(asList(dakota, edouard));
task4.setTitle("Task 4").setAssignee(chuckNorris).setAssignationDate(new LocalDate()).setAssignedOn(new LocalDate())
.setAssigner(chuckNorris);
taskZ.setTitle("Task Z").setAssigneeGroupsCandidates(asList(heroes));
recordServices.execute(transaction);
recordServices.update(task1.setNextTask(task2.getId()));
recordServices.update(task2.setNextTask(task3.getId()));
recordServices.update(task3.setNextTask(task4.getId()));
recordServices.update(task4.setNextTask(taskZ.getId()));
}
private void givenSimpleWorkflow2()
throws Exception {
TasksSchemasRecordsServices tasks = new TasksSchemasRecordsServices(zeCollection, getAppLayerFactory());
String legends = users.legendsIn(zeCollection).getId();
String dakota = users.dakotaLIndienIn(zeCollection).getId();
String gandalf = users.gandalfLeblancIn(zeCollection).getId();
String edouard = users.edouardLechatIn(zeCollection).getId();
Transaction transaction = new Transaction();
Workflow workflow = tasks.newWorkflow();
workflow.setCode("simple2");
workflow.setTitle("Un simple workflow2");
recordServices.add(workflow);
Task task1 = transaction.add(tasks.newWorkflowModelTaskWithId("task1", workflow));
Task task2 = transaction.add(tasks.newWorkflowModelTaskWithId("task2", workflow));
Task task3 = transaction.add(tasks.newWorkflowModelTaskWithId("task3", workflow));
Task task4 = transaction.add(tasks.newWorkflowModelTaskWithId("task4", workflow));
Task task5 = transaction.add(tasks.newWorkflowModelTaskWithId("task5", workflow));
Task task6 = transaction.add(tasks.newWorkflowModelTaskWithId("task6", workflow));
Task task7 = transaction.add(tasks.newWorkflowModelTaskWithId("task7", workflow));
task1.setTitle("Task 1").setAssigneeGroupsCandidates(asList(legends));
task2.setTitle("Task 2").setAssigneeUsersCandidates(asList(dakota, gandalf));
task3.setTitle("Task 3").setAssigneeUsersCandidates(asList(dakota, edouard));
task4.setTitle("Task 4").setAssigneeUsersCandidates(asList(dakota, gandalf));
task5.setTitle("Task 5").setAssigneeUsersCandidates(asList(dakota, gandalf));
task6.setTitle("Task 6").setAssigneeUsersCandidates(asList(dakota, edouard));
task7.setTitle("Task 7").setAssigneeUsersCandidates(asList(dakota, edouard));
recordServices.execute(transaction);
recordServices.update(task1.setNextTask(task2.getId()));
recordServices.update(task2.addNextTaskDecision("T3", task3.getId()).addNextTaskDecision("T5", task5.getId()));
recordServices.update(task3.setNextTask(task4.getId()));
recordServices.update(task4.addNextTaskDecision("T2", task2.getId()).addNextTaskDecision("T6", task6.getId()));
recordServices.update(task5.setNextTask(task6.getId()));
recordServices.update(task6.setNextTask(task7.getId()));
}
}