diff --git a/module/execution/test/lib/executionzen.unittest.class.php b/module/execution/test/lib/executionzen.unittest.class.php index d54933dd27..ac095b797f 100755 --- a/module/execution/test/lib/executionzen.unittest.class.php +++ b/module/execution/test/lib/executionzen.unittest.class.php @@ -1205,7 +1205,7 @@ class executionZenTest $method = $this->executionZenTest->getMethod('filterGroupTasks'); $method->setAccessible(true); - $executionZen = $this->executionZenTest->newInstance(); + $executionZen = $this->executionZenTest->newInstanceWithoutConstructor(); $result = $method->invokeArgs($executionZen, [$groupTasks, $groupBy, $filter, $allCount, $tasks]); if(dao::isError()) { diff --git a/module/execution/test/zen/filtergrouptasks.php b/module/execution/test/zen/filtergrouptasks.php new file mode 100755 index 0000000000..f03b0a83b1 --- /dev/null +++ b/module/execution/test/zen/filtergrouptasks.php @@ -0,0 +1,115 @@ +#!/usr/bin/env php +loadYaml('filtergrouptasks/task', false, 2)->gen(20); + +su('admin'); + +$executionTest = new executionZenTest(); + +// 准备测试数据 +$task1 = new stdClass(); +$task1->id = 1; +$task1->name = 'Task1'; +$task1->status = 'wait'; +$task1->mode = ''; + +$task2 = new stdClass(); +$task2->id = 2; +$task2->name = 'Task2'; +$task2->status = 'doing'; +$task2->mode = ''; + +$task3 = new stdClass(); +$task3->id = 3; +$task3->name = 'Task3'; +$task3->status = 'done'; +$task3->mode = ''; + +$task4 = new stdClass(); +$task4->id = 4; +$task4->name = 'Task4'; +$task4->status = 'closed'; +$task4->mode = ''; + +$task5 = new stdClass(); +$task5->id = 5; +$task5->name = 'Task5'; +$task5->status = 'wait'; +$task5->mode = 'multi'; + +$task6 = new stdClass(); +$task6->id = 6; +$task6->name = 'Task6'; +$task6->status = 'done'; +$task6->mode = 'multi'; + +// 测试步骤1: filter为all时不过滤 +$groupTasks1 = array(0 => array($task1, $task2), 1 => array($task3)); +r($executionTest->filterGroupTasksTest($groupTasks1, 'story', 'all', 3, array())) && p('allCount') && e('3'); // allCount保持不变 +r($executionTest->filterGroupTasksTest($groupTasks1, 'story', 'all', 3, array())) && p('groupCount') && e('2'); // 返回2个分组 + +// 测试步骤2: groupBy为story且filter为linked时,移除story为0的任务 +$groupTasks2 = array(0 => array($task1, $task2), 1 => array($task3)); +r($executionTest->filterGroupTasksTest($groupTasks2, 'story', 'linked', 3, array())) && p('allCount') && e('1'); // allCount减少2 +r($executionTest->filterGroupTasksTest($groupTasks2, 'story', 'linked', 3, array())) && p('groupCount') && e('1'); // 只剩1个分组 + +// 测试步骤3: groupBy为pri且filter为noset时,只保留pri为0的任务 +$groupTasks3 = array(0 => array($task1), 1 => array($task2), 2 => array($task3)); +r($executionTest->filterGroupTasksTest($groupTasks3, 'pri', 'noset', 3, array())) && p('groupCount') && e('1'); // 只保留1个分组 +r($executionTest->filterGroupTasksTest($groupTasks3, 'pri', 'noset', 3, array())) && p('allCount') && e('1'); // allCount减少2 + +// 测试步骤4: groupBy为assignedTo且filter为undone时,过滤已完成任务 +$groupTasks4 = array('user1' => array($task1, $task3), 'user2' => array($task2, $task4)); +r($executionTest->filterGroupTasksTest($groupTasks4, 'assignedTo', 'undone', 4, array())) && p('allCount') && e('2'); // allCount减少2 +r($executionTest->filterGroupTasksTest($groupTasks4, 'assignedTo', 'undone', 4, array())) && p('groupCount') && e('2'); // 保留2个分组 + +// 测试步骤5: groupBy为assignedTo且filter为undone时,多人任务去重处理 +$groupTasks5 = array('user1' => array($task5, $task6), 'user2' => array($task5, $task6)); +r($executionTest->filterGroupTasksTest($groupTasks5, 'assignedTo', 'undone', 4, array())) && p('allCount') && e('3'); // 多人任务只计数一次,减少1 +r($executionTest->filterGroupTasksTest($groupTasks5, 'assignedTo', 'undone', 4, array())) && p('groupCount') && e('2'); // 保留2个分组 + +// 测试步骤6: groupBy为finishedBy且tasks有空键时,移除空键数据 +$groupTasks6 = array('user1' => array($task1)); +$tasks6 = array('' => array($task2, $task3)); +r($executionTest->filterGroupTasksTest($groupTasks6, 'finishedBy', 'filtered', 3, $tasks6)) && p('allCount') && e('1'); // allCount减少2 +r($executionTest->filterGroupTasksTest($groupTasks6, 'finishedBy', 'filtered', 3, $tasks6)) && p('groupCount') && e('1'); // 保留1个分组 + +// 测试步骤7: groupBy为closedBy且tasks有空键时,移除空键数据 +$groupTasks7 = array('user1' => array($task1)); +$tasks7 = array('' => array($task2, $task3, $task4)); +r($executionTest->filterGroupTasksTest($groupTasks7, 'closedBy', 'filtered', 4, $tasks7)) && p('allCount') && e('1'); // allCount减少3 +r($executionTest->filterGroupTasksTest($groupTasks7, 'closedBy', 'filtered', 4, $tasks7)) && p('groupCount') && e('1'); // 保留1个分组 + +// 测试步骤8: groupBy为assignedTo且filter为undone时,验证非多人模式任务计数 +$groupTasks8 = array('user1' => array($task1, $task2, $task3, $task4)); +r($executionTest->filterGroupTasksTest($groupTasks8, 'assignedTo', 'undone', 4, array())) && p('allCount') && e('2'); // allCount减少2 +r($executionTest->filterGroupTasksTest($groupTasks8, 'assignedTo', 'undone', 4, array())) && p('groupCount') && e('1'); // 保留1个分组 \ No newline at end of file diff --git a/module/execution/test/zen/yaml/filtergrouptasks/task.yaml b/module/execution/test/zen/yaml/filtergrouptasks/task.yaml new file mode 100644 index 0000000000..5dac3dd2dc --- /dev/null +++ b/module/execution/test/zen/yaml/filtergrouptasks/task.yaml @@ -0,0 +1,369 @@ +--- +title: 任务测试数据 +desc: 用于测试filterGroupTasks方法的任务数据 + +fields: +- field: id + note: 任务ID + range: 1-20 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: project + note: 所属项目ID + range: 1 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: parent + note: 父任务ID + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: isParent + note: 是否父任务 + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: isTpl + note: 是否模板 + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: path + note: 路径 + range: '`,1,`, `,2,`, `,3,`, `,4,`, `,5,`, `,6,`, `,7,`, `,8,`, `,9,`, `,10,`, `,11,`, `,12,`, `,13,`, `,14,`, `,15,`, `,16,`, `,17,`, `,18,`, `,19,`, `,20,`' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: execution + note: 所属执行ID + range: 1 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: module + note: 所属模块ID + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: design + note: 关联设计ID + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: story + note: 关联需求ID + range: '[0]{5}, [1,2,3]{15}' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: storyVersion + note: 需求版本 + range: 1 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: designVersion + note: 设计版本 + range: 1 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: fromBug + note: 来源Bug + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: feedback + note: 关联反馈 + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: fromIssue + note: 来源问题 + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: docs + note: 关联文档 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: docVersions + note: 文档版本 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: name + note: 任务名称 + range: Task1,Task2,Task3,Task4,Task5,Task6,Task7,Task8,Task9,Task10,Task11,Task12,Task13,Task14,Task15,Task16,Task17,Task18,Task19,Task20 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: type + note: 任务类型 + range: design,devel,test,study,discuss,ui,affair,misc + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: mode + note: 任务模式 + range: '[]{15}, [multi]{5}' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: pri + note: 优先级 + range: '[0]{5}, 1{5}, 2{5}, 3{5}' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: estimate + note: 预计工时 + range: 1-10 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: consumed + note: 已消耗工时 + range: 0-5 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: left + note: 剩余工时 + range: 1-5 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: deadline + note: 截止日期 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: status + note: 任务状态 + range: '[wait]{5}, [doing]{5}, [done]{5}, [closed]{3}, [cancel]{2}' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: subStatus + note: 子状态 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: color + note: 颜色 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: mailto + note: 抄送给 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: keywords + note: 关键词 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: desc + note: 任务描述 + range: Test task description + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: version + note: 版本 + range: 1 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: openedBy + note: 由谁创建 + range: admin + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: openedDate + note: 创建日期 + range: '2024-01-01 00:00:00' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: assignedTo + note: 指派给 + range: '[]{3}, [user1]{5}, [user2]{5}, [user3]{4}, [admin]{3}' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: assignedDate + note: 指派日期 + range: '2024-01-02 00:00:00' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: estStarted + note: 预计开始 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: realStarted + note: 实际开始 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: finishedBy + note: 由谁完成 + range: '[]{10}, [user1]{5}, [user2]{5}' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: finishedDate + note: 完成日期 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: finishedList + note: 完成列表 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: canceledBy + note: 由谁取消 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: canceledDate + note: 取消日期 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: closedBy + note: 由谁关闭 + range: '[]{15}, [user1]{3}, [user2]{2}' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: closedDate + note: 关闭日期 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: planDuration + note: 计划工期 + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: realDuration + note: 实际工期 + range: 0 + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: closedReason + note: 关闭原因 + range: "" + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: lastEditedBy + note: 最后编辑者 + range: admin + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: lastEditedDate + note: 最后编辑日期 + range: '2024-01-03 00:00:00' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: deleted + note: 是否删除 + range: '0' + prefix: "" + postfix: "" + loop: 0 + format: "" +- field: vision + note: 视图 + range: rnd + prefix: "" + postfix: "" + loop: 0 + format: ""