/* 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.task; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import org.activiti.engine.impl.test.PluggableActivitiTestCase; import org.activiti.engine.impl.util.ClockUtil; import org.activiti.engine.task.Task; import org.activiti.engine.task.TaskQuery; /** * Tests for cub-tasks querying * @author Ionut Paduraru * @see TaskQueryTest */ public class SubTaskQueryTest extends PluggableActivitiTestCase { private List<String> taskIds; public void setUp() throws Exception { identityService.saveUser(identityService.newUser("kermit")); identityService.saveUser(identityService.newUser("gonzo")); identityService.saveGroup(identityService.newGroup("management")); identityService.saveGroup(identityService.newGroup("accountancy")); identityService.createMembership("kermit", "management"); identityService.createMembership("kermit", "accountancy"); taskIds = generateTestSubTasks(); } public void tearDown() throws Exception { identityService.deleteGroup("accountancy"); identityService.deleteGroup("management"); identityService.deleteUser("gonzo"); identityService.deleteUser("kermit"); taskService.deleteTasks(taskIds, true); } /** * test for task inclusion/exclusion (no other filters, no sort) */ public void testQueryExcludeSubtasks() throws Exception { // query all tasks, including subtasks TaskQuery query = taskService.createTaskQuery(); assertEquals(10, query.count()); assertEquals(10, query.list().size()); // query only parent tasks (exclude subtasks) query = taskService.createTaskQuery().excludeSubtasks(); assertEquals(3, query.count()); assertEquals(3, query.list().size()); } /** * test for task inclusion/exclusion (no other filters, no sort) */ public void testQueryWithPagination() throws Exception { // query all tasks, including subtasks TaskQuery query = taskService.createTaskQuery(); assertEquals(10, query.count()); assertEquals(2, query.listPage(0, 2).size()); // query only parent tasks (exclude subtasks) query = taskService.createTaskQuery().excludeSubtasks(); assertEquals(3, query.count()); assertEquals(1, query.listPage(0, 1).size()); } /** * test for task inclusion/exclusion (no other filters, order by task assignee ) */ public void testQueryExcludeSubtasksSorted() throws Exception { // query all tasks, including subtasks TaskQuery query = taskService.createTaskQuery().orderByTaskAssignee().asc(); assertEquals(10, query.count()); assertEquals(10, query.list().size()); // query only parent tasks (exclude subtasks) query = taskService.createTaskQuery().excludeSubtasks().orderByTaskAssignee().desc(); assertEquals(3, query.count()); assertEquals(3, query.list().size()); } /** * test for task inclusion/exclusion when additional filter is specified (like assignee), no order. */ public void testQueryByAssigneeExcludeSubtasks() throws Exception { // gonzo has 2 root tasks and 3+2 subtasks assigned // include subtasks TaskQuery query = taskService.createTaskQuery().taskAssignee("gonzo"); assertEquals(7, query.count()); assertEquals(7, query.list().size()); // exclude subtasks query = taskService.createTaskQuery().taskAssignee("gonzo").excludeSubtasks(); assertEquals(2, query.count()); assertEquals(2, query.list().size()); // kermit has no root tasks and no subtasks assigned // include subtasks query = taskService.createTaskQuery().taskAssignee("kermit"); assertEquals(0, query.count()); assertEquals(0, query.list().size()); assertNull(query.singleResult()); // exclude subtasks query = taskService.createTaskQuery().taskAssignee("kermit").excludeSubtasks(); assertEquals(0, query.count()); assertEquals(0, query.list().size()); assertNull(query.singleResult()); } /** * test for task inclusion/exclusion when additional filter is specified (like assignee), no order. */ public void testQueryByAssigneeExcludeSubtasksPaginated() throws Exception { // gonzo has 2 root tasks and 3+2 subtasks assigned // include subtasks TaskQuery query = taskService.createTaskQuery().taskAssignee("gonzo"); assertEquals(7, query.count()); assertEquals(2, query.listPage(0, 2).size()); // exclude subtasks query = taskService.createTaskQuery().taskAssignee("gonzo").excludeSubtasks(); assertEquals(2, query.count()); assertEquals(1, query.listPage(0, 1).size()); // kermit has no root tasks and no subtasks assigned // include subtasks query = taskService.createTaskQuery().taskAssignee("kermit"); assertEquals(0, query.count()); assertEquals(0, query.listPage(0, 2).size()); assertNull(query.singleResult()); // exclude subtasks query = taskService.createTaskQuery().taskAssignee("kermit").excludeSubtasks(); assertEquals(0, query.count()); assertEquals(0, query.listPage(0, 2).size()); assertNull(query.singleResult()); } /** * test for task inclusion/exclusion when additional filter is specified (like assignee), ordered. */ public void testQueryByAssigneeExcludeSubtasksOrdered() throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS"); // gonzo has 2 root tasks and 3+2 subtasks assigned // include subtasks TaskQuery query = taskService.createTaskQuery().taskAssignee("gonzo").orderByTaskCreateTime().desc(); assertEquals(7, query.count()); assertEquals(7, query.list().size()); assertEquals(sdf.parse("02/01/2009 01:01:01.000"), query.list().get(0).getCreateTime()); // exclude subtasks query = taskService.createTaskQuery().taskAssignee("gonzo").excludeSubtasks().orderByTaskCreateTime().asc(); assertEquals(2, query.count()); assertEquals(2, query.list().size()); assertEquals(sdf.parse("01/02/2008 02:02:02.000"), query.list().get(0).getCreateTime()); assertEquals(sdf.parse("05/02/2008 02:02:02.000"), query.list().get(1).getCreateTime()); // kermit has no root tasks and no subtasks assigned // include subtasks query = taskService.createTaskQuery().taskAssignee("kermit").orderByTaskCreateTime().asc(); assertEquals(0, query.count()); assertEquals(0, query.list().size()); assertNull(query.singleResult()); // exclude subtasks query = taskService.createTaskQuery().taskAssignee("kermit").excludeSubtasks().orderByTaskCreateTime().desc(); assertEquals(0, query.count()); assertEquals(0, query.list().size()); assertNull(query.singleResult()); } /** * test for task inclusion/exclusion when additional filter is specified (like assignee), ordered. */ public void testQueryByAssigneeExcludeSubtasksOrderedAndPaginated() throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS"); // gonzo has 2 root tasks and 3+2 subtasks assigned // include subtasks TaskQuery query = taskService.createTaskQuery().taskAssignee("gonzo").orderByTaskCreateTime().asc(); assertEquals(7, query.count()); assertEquals(1, query.listPage(0, 1).size()); assertEquals(sdf.parse("01/02/2008 02:02:02.000"), query.listPage(0, 1).get(0).getCreateTime()); assertEquals(1, query.listPage(1, 1).size()); assertEquals(sdf.parse("05/02/2008 02:02:02.000"), query.listPage(1, 1).get(0).getCreateTime()); assertEquals(2, query.listPage(0, 2).size()); assertEquals(sdf.parse("01/02/2008 02:02:02.000"), query.listPage(0, 2).get(0).getCreateTime()); assertEquals(sdf.parse("05/02/2008 02:02:02.000"), query.listPage(0, 2).get(1).getCreateTime()); // exclude subtasks query = taskService.createTaskQuery().taskAssignee("gonzo").excludeSubtasks().orderByTaskCreateTime().desc(); assertEquals(2, query.count()); assertEquals(1, query.listPage(1, 1).size()); assertEquals(sdf.parse("01/02/2008 02:02:02.000"), query.listPage(1, 1).get(0).getCreateTime()); assertEquals(1, query.listPage(0, 1).size()); assertEquals(sdf.parse("05/02/2008 02:02:02.000"), query.listPage(0, 1).get(0).getCreateTime()); // kermit has no root tasks and no subtasks assigned // include subtasks query = taskService.createTaskQuery().taskAssignee("kermit").orderByTaskCreateTime().asc(); assertEquals(0, query.count()); assertEquals(0, query.listPage(0, 2).size()); assertNull(query.singleResult()); // exclude subtasks query = taskService.createTaskQuery().taskAssignee("kermit").excludeSubtasks().orderByTaskCreateTime().desc(); assertEquals(0, query.count()); assertEquals(0, query.listPage(0, 2).size()); assertNull(query.singleResult()); } /** * Generates some test sub-tasks to the tasks generated by {@link #generateTestTasks()}.<br/> * - 1 root task where kermit is a candidate with 2 subtasks (both with kermit as candidate) <br/> * - 2 root task where gonzo is assignee with 3 + 2 subtasks assigned to gonzo */ private List<String> generateTestSubTasks() throws Exception { List<String> ids = new ArrayList<String>(); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS"); // 1 parent task for kermit ClockUtil.setCurrentTime(sdf.parse("01/01/2008 01:01:01.000")); Task rootTask1 = taskService.newTask(); rootTask1.setName("rootTestTask"); rootTask1.setDescription("rootTestTask description"); taskService.saveTask(rootTask1); ids.add(rootTask1.getId()); taskService.addCandidateUser(rootTask1.getId(), "kermit"); // 2 sub-tasks for the task above ClockUtil.setCurrentTime(sdf.parse("01/01/2009 01:01:01.000")); for (int i = 1; i <= 2; i++) { Task subtask = taskService.newTask(); subtask.setName("kermitSubTask" + i); subtask.setParentTaskId(rootTask1.getId()); subtask.setDescription("description for kermit sub-task" + i); taskService.saveTask(subtask); taskService.addCandidateUser(subtask.getId(), "kermit"); ids.add(subtask.getId()); } // 2 parent tasks for gonzo // first parent task for gonzo ClockUtil.setCurrentTime(sdf.parse("01/02/2008 02:02:02.000")); Task rootTask2 = taskService.newTask(); rootTask2.setName("gonzoRootTask1"); rootTask2.setDescription("gonzo Root task1 description"); taskService.saveTask(rootTask2); taskService.setAssignee(rootTask2.getId(), "gonzo"); ids.add(rootTask2.getId()); // second parent task for gonzo ClockUtil.setCurrentTime(sdf.parse("05/02/2008 02:02:02.000")); Task rootTask3 = taskService.newTask(); rootTask3.setName("gonzoRootTask2"); rootTask3.setDescription("gonzo Root task2 description"); taskService.saveTask(rootTask3); taskService.setAssignee(rootTask3.getId(), "gonzo"); ids.add(rootTask3.getId()); // 3 sub-tasks for the first parent task ClockUtil.setCurrentTime(sdf.parse("01/01/2009 01:01:01.000")); for (int i = 1; i <= 3; i++) { Task subtask = taskService.newTask(); subtask.setName("gonzoSubTask1_" + i); subtask.setParentTaskId(rootTask2.getId()); subtask.setDescription("description for gonzo sub-task1_" + i); taskService.saveTask(subtask); taskService.setAssignee(subtask.getId(), "gonzo"); ids.add(subtask.getId()); } // 2 sub-tasks for the second parent task ClockUtil.setCurrentTime(sdf.parse("02/01/2009 01:01:01.000")); for (int i = 1; i <= 2; i++) { Task subtask = taskService.newTask(); subtask.setName("gonzoSubTask2_" + i); subtask.setParentTaskId(rootTask3.getId()); subtask.setDescription("description for gonzo sub-task2_" + i); taskService.saveTask(subtask); taskService.setAssignee(subtask.getId(), "gonzo"); ids.add(subtask.getId()); } return ids; } }