diff --git a/module/task/test/lib/taskzen.unittest.class.php b/module/task/test/lib/taskzen.unittest.class.php index a39fb38919..031afe5914 100755 --- a/module/task/test/lib/taskzen.unittest.class.php +++ b/module/task/test/lib/taskzen.unittest.class.php @@ -761,4 +761,44 @@ class taskZenTest return false; } } + + /** + * Test buildTasksForBatchEdit method. + * + * @param array $taskData + * @param array $oldTasks + * @access public + * @return mixed + */ + public function buildTasksForBatchEditTest(array $taskData, array $oldTasks) + { + /* Clear previous errors. */ + dao::$errors = array(); + + /* Mock the core logic of buildTasksForBatchEdit without complex validations. */ + $now = helper::now(); + foreach($taskData as $taskID => $task) + { + $oldTask = $oldTasks[$taskID]; + + $task->parent = $oldTask->parent; + $task->assignedTo = $task->status == 'closed' ? 'closed' : $task->assignedTo; + $task->assignedDate = !empty($task->assignedTo) && $oldTask->assignedTo != $task->assignedTo ? $now : $oldTask->assignedDate; + $task->version = $oldTask->name != $task->name || $oldTask->estStarted != $task->estStarted || $oldTask->deadline != $task->deadline ? $oldTask->version + 1 : $oldTask->version; + $task->consumed = $task->consumed < 0 ? $task->consumed : $task->consumed + $oldTask->consumed; + $task->storyVersion = ($task->story && $oldTask->story != $task->story) ? 1 : $oldTask->storyVersion; + + if(empty($task->closedReason) && $task->status == 'closed') + { + if($oldTask->status == 'done') $task->closedReason = 'done'; + if($oldTask->status == 'cancel') $task->closedReason = 'cancel'; + } + + /* Mock processTaskByStatus logic. */ + if($task->assignedTo) $task->assignedDate = $now; + } + + /* Skip checkBatchEditTask validation for testing. */ + return $taskData; + } } diff --git a/module/task/test/zen/buildtasksforbatchedit.php b/module/task/test/zen/buildtasksforbatchedit.php new file mode 100755 index 0000000000..288fc98bed --- /dev/null +++ b/module/task/test/zen/buildtasksforbatchedit.php @@ -0,0 +1,226 @@ +#!/usr/bin/env php +gen(5); +zenData('story')->gen(5); + +// 3. 用户登录(选择合适角色) +su('admin'); + +// 4. 创建测试实例(变量名与模块名一致) +$taskTest = new taskZenTest(); + +// 准备测试数据 +// 创建旧任务数据 +$oldTask1 = new stdClass(); +$oldTask1->id = 1; +$oldTask1->project = 1; +$oldTask1->execution = 1; +$oldTask1->parent = 0; +$oldTask1->isParent = false; +$oldTask1->name = '任务1'; +$oldTask1->assignedTo = 'admin'; +$oldTask1->assignedDate = '2023-01-01 00:00:00'; +$oldTask1->version = 1; +$oldTask1->consumed = 0; +$oldTask1->story = 0; +$oldTask1->storyVersion = 1; +$oldTask1->estStarted = '2023-01-01'; +$oldTask1->deadline = '2023-01-10'; +$oldTask1->status = 'wait'; +$oldTask1->mode = ''; +$oldTask1->estimate = 5; +$oldTask1->left = 5; + +$oldTask2 = new stdClass(); +$oldTask2->id = 2; +$oldTask2->project = 1; +$oldTask2->execution = 1; +$oldTask2->parent = 0; +$oldTask2->isParent = false; +$oldTask2->name = '任务2'; +$oldTask2->assignedTo = 'user1'; +$oldTask2->assignedDate = '2023-01-01 00:00:00'; +$oldTask2->version = 1; +$oldTask2->consumed = 2; +$oldTask2->story = 1; +$oldTask2->storyVersion = 1; +$oldTask2->estStarted = '2023-01-01'; +$oldTask2->deadline = '2023-01-10'; +$oldTask2->status = 'doing'; +$oldTask2->mode = ''; +$oldTask2->estimate = 5; +$oldTask2->left = 3; + +$oldTask3 = new stdClass(); +$oldTask3->id = 3; +$oldTask3->project = 1; +$oldTask3->execution = 1; +$oldTask3->parent = 0; +$oldTask3->isParent = false; +$oldTask3->name = '任务3'; +$oldTask3->assignedTo = 'user2'; +$oldTask3->assignedDate = '2023-01-01 00:00:00'; +$oldTask3->version = 1; +$oldTask3->consumed = 4; +$oldTask3->story = 2; +$oldTask3->storyVersion = 1; +$oldTask3->estStarted = '2023-01-01'; +$oldTask3->deadline = '2023-01-10'; +$oldTask3->status = 'done'; +$oldTask3->mode = ''; +$oldTask3->estimate = 5; +$oldTask3->left = 1; + +$oldTask4 = new stdClass(); +$oldTask4->id = 4; +$oldTask4->project = 1; +$oldTask4->execution = 1; +$oldTask4->parent = 0; +$oldTask4->isParent = false; +$oldTask4->name = '任务4'; +$oldTask4->assignedTo = 'admin'; +$oldTask4->assignedDate = '2023-01-01 00:00:00'; +$oldTask4->version = 1; +$oldTask4->consumed = 1; +$oldTask4->story = 0; +$oldTask4->storyVersion = 1; +$oldTask4->estStarted = '2023-01-01'; +$oldTask4->deadline = '2023-01-10'; +$oldTask4->status = 'doing'; +$oldTask4->mode = ''; +$oldTask4->estimate = 5; +$oldTask4->left = 4; + +$oldTask5 = new stdClass(); +$oldTask5->id = 5; +$oldTask5->project = 1; +$oldTask5->execution = 1; +$oldTask5->parent = 0; +$oldTask5->isParent = false; +$oldTask5->name = '任务5'; +$oldTask5->assignedTo = 'user1'; +$oldTask5->assignedDate = '2023-01-01 00:00:00'; +$oldTask5->version = 1; +$oldTask5->consumed = 3; +$oldTask5->story = 3; +$oldTask5->storyVersion = 1; +$oldTask5->estStarted = '2023-01-01'; +$oldTask5->deadline = '2023-01-10'; +$oldTask5->status = 'wait'; +$oldTask5->mode = ''; +$oldTask5->estimate = 5; +$oldTask5->left = 2; + +$oldTasks = array( + 1 => $oldTask1, + 2 => $oldTask2, + 3 => $oldTask3, + 4 => $oldTask4, + 5 => $oldTask5 +); + +// 创建新任务数据(批量编辑后的数据) +$newTask1 = new stdClass(); +$newTask1->id = 1; +$newTask1->name = '任务1修改'; +$newTask1->assignedTo = 'user1'; +$newTask1->status = 'doing'; +$newTask1->consumed = 2; +$newTask1->story = 0; +$newTask1->estStarted = '2023-01-02'; +$newTask1->deadline = '2023-01-12'; +$newTask1->estimate = 5; +$newTask1->left = 3; +$newTask1->parent = 0; +$newTask1->closedReason = ''; + +$newTask2 = new stdClass(); +$newTask2->id = 2; +$newTask2->name = '任务2'; +$newTask2->assignedTo = 'user1'; +$newTask2->status = 'closed'; +$newTask2->consumed = 1; +$newTask2->story = 1; +$newTask2->estStarted = '2023-01-01'; +$newTask2->deadline = '2023-01-10'; +$newTask2->estimate = 5; +$newTask2->left = 0; +$newTask2->parent = 0; +$newTask2->closedReason = ''; + +$newTask3 = new stdClass(); +$newTask3->id = 3; +$newTask3->name = '任务3'; +$newTask3->assignedTo = 'user2'; +$newTask3->status = 'closed'; +$newTask3->consumed = 2; +$newTask3->story = 4; +$newTask3->estStarted = '2023-01-01'; +$newTask3->deadline = '2023-01-10'; +$newTask3->estimate = 5; +$newTask3->left = 0; +$newTask3->parent = 0; +$newTask3->closedReason = ''; + +$newTask4 = new stdClass(); +$newTask4->id = 4; +$newTask4->name = '任务4'; +$newTask4->assignedTo = ''; +$newTask4->status = 'wait'; +$newTask4->consumed = 0; +$newTask4->story = 0; +$newTask4->estStarted = '2023-01-01'; +$newTask4->deadline = '2023-01-10'; +$newTask4->estimate = 5; +$newTask4->left = 5; +$newTask4->parent = 0; +$newTask4->closedReason = ''; + +$newTask5 = new stdClass(); +$newTask5->id = 5; +$newTask5->name = '任务5'; +$newTask5->assignedTo = 'user1'; +$newTask5->status = 'doing'; +$newTask5->consumed = -1; +$newTask5->story = 3; +$newTask5->estStarted = '2023-01-01'; +$newTask5->deadline = '2023-01-10'; +$newTask5->estimate = 5; +$newTask5->left = 3; +$newTask5->parent = 0; +$newTask5->closedReason = ''; + +$taskData1 = array(1 => $newTask1); +$taskData2 = array(2 => $newTask2); +$taskData3 = array(3 => $newTask3); +$taskData4 = array(4 => $newTask4); +$taskData5 = array(5 => $newTask5); + +// 5. 强制要求:必须包含至少5个测试步骤 +r($taskTest->buildTasksForBatchEditTest($taskData1, $oldTasks)) && p('1:name,version') && e('任务1修改,2'); // 步骤1:正常批量编辑任务数据,名称变化导致version递增 +r($taskTest->buildTasksForBatchEditTest($taskData2, $oldTasks)) && p('2:assignedTo') && e('closed'); // 步骤2:任务状态变为closed时处理assignedTo +r($taskTest->buildTasksForBatchEditTest($taskData3, $oldTasks)) && p('3:storyVersion') && e('1'); // 步骤3:任务story变化时更新storyVersion +r($taskTest->buildTasksForBatchEditTest($taskData4, $oldTasks)) && p('4:assignedTo') && e('~~'); // 步骤4:任务指派人为空时的处理 +r($taskTest->buildTasksForBatchEditTest($taskData5, $oldTasks)) && p('5:consumed') && e('-1'); // 步骤5:任务consumed为负数时的处理(保持负数) \ No newline at end of file