/* 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.history;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
/**
* @author Tom Baeyens
* @author Frederik Heremans
*/
public class HistoricTaskInstanceTest extends PluggableActivitiTestCase {
@Deployment
public void testHistoricTaskInstance() throws Exception {
String processInstanceId = runtimeService.startProcessInstanceByKey("HistoricTaskInstanceTest").getId();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
// Set priority to non-default value
Task runtimeTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
runtimeTask.setPriority(1234);
// Set due-date
Date dueDate = sdf.parse("01/02/2003 04:05:06");
runtimeTask.setDueDate(dueDate);
taskService.saveTask(runtimeTask);
String taskId = runtimeTask.getId();
String taskDefinitionKey = runtimeTask.getTaskDefinitionKey();
HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().singleResult();
assertEquals(taskId, historicTaskInstance.getId());
assertEquals(1234, historicTaskInstance.getPriority());
assertEquals("Clean up", historicTaskInstance.getName());
assertEquals("Schedule an engineering meeting for next week with the new hire.", historicTaskInstance.getDescription());
assertEquals(dueDate, historicTaskInstance.getDueDate());
assertEquals("kermit", historicTaskInstance.getAssignee());
assertEquals(taskDefinitionKey, historicTaskInstance.getTaskDefinitionKey());
assertNull(historicTaskInstance.getEndTime());
assertNull(historicTaskInstance.getDurationInMillis());
runtimeService.setVariable(processInstanceId, "deadline", "yesterday");
taskService.complete(taskId);
assertEquals(1, historyService.createHistoricTaskInstanceQuery().count());
historicTaskInstance = historyService.createHistoricTaskInstanceQuery().singleResult();
assertEquals(taskId, historicTaskInstance.getId());
assertEquals(1234, historicTaskInstance.getPriority());
assertEquals("Clean up", historicTaskInstance.getName());
assertEquals("Schedule an engineering meeting for next week with the new hire.", historicTaskInstance.getDescription());
assertEquals(dueDate, historicTaskInstance.getDueDate());
assertEquals("kermit", historicTaskInstance.getAssignee());
assertEquals(TaskEntity.DELETE_REASON_COMPLETED, historicTaskInstance.getDeleteReason());
assertEquals(taskDefinitionKey, historicTaskInstance.getTaskDefinitionKey());
assertNotNull(historicTaskInstance.getEndTime());
assertNotNull(historicTaskInstance.getDurationInMillis());
historyService.deleteHistoricTaskInstance(taskId);
assertEquals(0, historyService.createHistoricTaskInstanceQuery().count());
}
public void testDeleteHistoricTaskInstance() throws Exception {
// deleting unexisting historic task instance should be silently ignored
historyService.deleteHistoricTaskInstance("unexistingId");
}
@Deployment
public void testHistoricTaskInstanceQuery() throws Exception {
// First instance is finished
ProcessInstance finishedInstance = runtimeService.startProcessInstanceByKey("HistoricTaskQueryTest");
// Set priority to non-default value
Task task = taskService.createTaskQuery().processInstanceId(finishedInstance.getId()).singleResult();
task.setPriority(1234);
Date dueDate = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").parse("01/02/2003 04:05:06");
task.setDueDate(dueDate);
taskService.saveTask(task);
// Complete the task
String taskId = task.getId();
taskService.complete(taskId);
// Task id
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskId(taskId).count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskId("unexistingtaskid").count());
// Name
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskName("Clean up").count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskName("unexistingname").count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskNameLike("Clean u%").count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskNameLike("%lean up").count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskNameLike("%lean u%").count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskNameLike("%unexistingname%").count());
// Description
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDescription("Historic task description").count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDescription("unexistingdescription").count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDescriptionLike("%task description").count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDescriptionLike("Historic task %").count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDescriptionLike("%task%").count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDescriptionLike("%unexistingdescripton%").count());
// Execution id
assertEquals(1, historyService.createHistoricTaskInstanceQuery().executionId(finishedInstance.getId()).count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().executionId("unexistingexecution").count());
// Process instance id
assertEquals(1, historyService.createHistoricTaskInstanceQuery().processInstanceId(finishedInstance.getId()).count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().processInstanceId("unexistingid").count());
// Process definition id
assertEquals(1, historyService.createHistoricTaskInstanceQuery().processDefinitionId(finishedInstance.getProcessDefinitionId()).count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().processDefinitionId("unexistingdefinitionid").count());
// Process definition name
assertEquals(1, historyService.createHistoricTaskInstanceQuery().processDefinitionName("Historic task query test process").count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().processDefinitionName("unexistingdefinitionname").count());
// Process definition key
assertEquals(1, historyService.createHistoricTaskInstanceQuery().processDefinitionKey("HistoricTaskQueryTest").count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().processDefinitionKey("unexistingdefinitionkey").count());
// Assignee
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskAssignee("kermit").count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskAssignee("johndoe").count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskAssigneeLike("%ermit").count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskAssigneeLike("kermi%").count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskAssigneeLike("%ermi%").count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskAssigneeLike("%johndoe%").count());
// Delete reason
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDeleteReason(TaskEntity.DELETE_REASON_COMPLETED).count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDeleteReason("deleted").count());
// Task definition ID
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDefinitionKey("task").count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDefinitionKey("unexistingkey").count());
// Task priority
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskPriority(1234).count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskPriority(5678).count());
// Due date
Calendar anHourAgo = Calendar.getInstance();
anHourAgo.setTime(dueDate);
anHourAgo.add(Calendar.HOUR, -1);
Calendar anHourLater = Calendar.getInstance();
anHourLater.setTime(dueDate);
anHourLater.add(Calendar.HOUR, 1);
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDueDate(dueDate).count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDueDate(anHourAgo.getTime()).count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDueDate(anHourLater.getTime()).count());
// Due date before
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDueBefore(anHourLater.getTime()).count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDueBefore(anHourAgo.getTime()).count());
// Due date after
assertEquals(1, historyService.createHistoricTaskInstanceQuery().taskDueAfter(anHourAgo.getTime()).count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().taskDueAfter(anHourLater.getTime()).count());
// Finished and Unfinished - Add anther other instance that has a running task (unfinished)
runtimeService.startProcessInstanceByKey("HistoricTaskQueryTest");
assertEquals(1, historyService.createHistoricTaskInstanceQuery().finished().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().unfinished().count());
}
@Deployment
public void testHistoricTaskInstanceQueryProcessFinished() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("TwoTaskHistoricTaskQueryTest");
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
// Running task on running process should be available
assertEquals(1, historyService.createHistoricTaskInstanceQuery().processUnfinished().count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().processFinished().count());
// Finished and running task on running process should be available
taskService.complete(task.getId());
assertEquals(2, historyService.createHistoricTaskInstanceQuery().processUnfinished().count());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().processFinished().count());
// 2 finished tasks are found for finished process after completing last task of process
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
taskService.complete(task.getId());
assertEquals(0, historyService.createHistoricTaskInstanceQuery().processUnfinished().count());
assertEquals(2, historyService.createHistoricTaskInstanceQuery().processFinished().count());
}
@Deployment
public void testHistoricTaskInstanceQuerySorting() {
ProcessInstance instance = runtimeService.startProcessInstanceByKey("HistoricTaskQueryTest");
String taskId = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult().getId();
taskService.complete(taskId);
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByDeleteReason().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByExecutionId().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByHistoricActivityInstanceId().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByHistoricActivityInstanceStartTime().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByProcessDefinitionId().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByProcessInstanceId().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskDescription().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskName().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskDefinitionKey().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskPriority().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskAssignee().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskId().asc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByDeleteReason().desc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByExecutionId().desc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByHistoricActivityInstanceId().desc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByHistoricActivityInstanceStartTime().desc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByProcessDefinitionId().desc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByProcessInstanceId().desc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskDescription().desc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskName().desc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskDefinitionKey().desc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskPriority().desc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskAssignee().desc().count());
assertEquals(1, historyService.createHistoricTaskInstanceQuery().orderByTaskId().desc().count());
}
public void testInvalidSorting() {
try {
historyService.createHistoricTaskInstanceQuery().asc();
fail();
} catch (ActivitiException e) {
}
try {
historyService.createHistoricTaskInstanceQuery().desc();
fail();
} catch (ActivitiException e) {
}
try {
historyService.createHistoricTaskInstanceQuery().orderByProcessInstanceId().list();
fail();
} catch (ActivitiException e) {
}
}
}