+ [misc] Add unit tests for executionZen::filterGroupTasks() method

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
liugang
2025-11-12 08:25:45 +08:00
co-authored by Claude
parent 7afe5b7407
commit 3ba4e49ba0
3 changed files with 485 additions and 1 deletions
@@ -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()) {
+115
View File
@@ -0,0 +1,115 @@
#!/usr/bin/env php
<?php
/**
title=测试 executionZen::filterGroupTasks();
timeout=0
cid=0
- allCount保持不变属性allCount @3
- 返回2个分组属性groupCount @2
- allCount减少2属性allCount @1
- 只剩1个分组属性groupCount @1
- 只保留1个分组属性groupCount @1
- allCount减少2属性allCount @1
- allCount减少2属性allCount @2
- 保留2个分组属性groupCount @2
- 多人任务只计数一次,减少1属性allCount @3
- 保留2个分组属性groupCount @2
- allCount减少2属性allCount @1
- 保留1个分组属性groupCount @1
- allCount减少3属性allCount @1
- 保留1个分组属性groupCount @1
- allCount减少2属性allCount @2
- 保留1个分组属性groupCount @1
*/
include dirname(__FILE__, 5) . '/test/lib/init.php';
include dirname(__FILE__, 2) . '/lib/executionzen.unittest.class.php';
zenData('task')->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个分组
@@ -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: ""