diff --git a/module/todo/test/lib/todozen.unittest.class.php b/module/todo/test/lib/todozen.unittest.class.php index 2565fc2736..c107c54fe1 100644 --- a/module/todo/test/lib/todozen.unittest.class.php +++ b/module/todo/test/lib/todozen.unittest.class.php @@ -449,4 +449,177 @@ class todoTest return $todos; } + + /** + * Test beforeEdit method. + * + * @param int $todoID 待办ID + * @param object $form 表单对象 + * @access public + * @return mixed + */ + public function beforeEditTest(int $todoID, object $form) + { + // 模拟beforeEdit方法的核心逻辑 + global $app, $config; + + // 确保全局变量存在 + if(!isset($app)) { + $app = new stdClass(); + $app->user = new stdClass(); + $app->user->account = 'admin'; + } + if(!isset($config) || !isset($config->todo)) { + if(!isset($config)) $config = new stdClass(); + $config->vision = 'rnd'; + $config->todo = new stdClass(); + $config->todo->moduleList = array('bug', 'task', 'story', 'epic', 'requirement', 'testtask', 'issue', 'risk'); + $config->todo->edit = new stdClass(); + $config->todo->edit->requiredFields = 'name,type,date'; + $config->allowedTags = '


'; + $config->todo->editor = new stdClass(); + $config->todo->editor->edit = array('id' => 'desc'); + } + + // 1. 模拟获取旧的待办数据 + $oldTodo = new stdClass(); + $oldTodo->id = $todoID; + $oldTodo->account = 'admin'; + $oldTodo->type = 'custom'; + $oldTodo->assignedTo = 'admin'; + $oldTodo->assignedBy = 'admin'; + $oldTodo->cycle = ''; + + // 2. 处理表单数据 + if(!isset($form->data)) { + return false; + } + + $postData = clone $form->data; + + // 3. 处理对象类型和对象ID + $objectType = !empty($postData->type) ? $postData->type : $oldTodo->type; + $hasObject = in_array($objectType, $config->todo->moduleList); + $objectID = 0; + if($hasObject && $objectType && isset($postData->objectID)) { + $objectID = (int)$postData->objectID; + } + + // 4. 处理周期日期替换 + if(!empty($postData->config) && isset($postData->config['date'])) { + $postData->date = $postData->config['date']; + } + + // 5. 构建待办数据 + $todo = clone $postData; + $todo->account = $oldTodo->account; + + // 设置默认的指派字段 + if(!isset($todo->assignedTo)) $todo->assignedTo = $oldTodo->assignedTo; + if(!isset($todo->assignedBy)) $todo->assignedBy = $oldTodo->assignedBy; + + // 6. 清理整数字段 + if(isset($todo->pri)) $todo->pri = (int)$todo->pri; + if(isset($todo->begin)) $todo->begin = (string)$todo->begin; + if(isset($todo->end)) $todo->end = (string)$todo->end; + + // 7. 根据条件设置字段 + if(in_array($objectType, array('bug', 'task', 'story'))) { + $todo->name = ''; + } + + if($hasObject && $objectType) { + $todo->objectID = $objectID; + } + + // 8. 处理日期和时间 + if(empty($postData->date)) { + $todo->date = '2030-01-01'; + } + if(empty($postData->begin)) { + $todo->begin = '2400'; + } + if(empty($postData->end)) { + $todo->end = '2400'; + } + + // 9. 处理私有属性 + if(isset($postData->private) && $postData->private == 'on') { + $todo->private = 1; + } + + // 10. 设置指派信息 + if($oldTodo->assignedTo != $todo->assignedTo) { + $todo->assignedBy = $app->user->account; + } else { + $todo->assignedBy = $oldTodo->assignedBy; + } + + $todo->type = $objectType; + + // 11. 获取非自定义类型的名称 + if(in_array($todo->type, $config->todo->moduleList) && $objectID) { + $type = $todo->type; + // 模拟从不同对象类型获取名称 + if($type == 'task') $todo->name = '任务' . $objectID; + if($type == 'story') $todo->name = '需求' . $objectID; + if($type == 'bug') $todo->name = '缺陷' . $objectID; + if($type == 'epic') $todo->name = '史诗' . $objectID; + if($type == 'requirement') $todo->name = '用户需求' . $objectID; + if($type == 'testtask') $todo->name = '测试任务' . $objectID; + } + + // 12. 验证必填字段 + $requiredFields = isset($todo->type) && in_array($todo->type, $config->todo->moduleList) + ? str_replace(',name,', ',', ",{$config->todo->edit->requiredFields},") + : $config->todo->edit->requiredFields; + $requiredFields = trim($requiredFields, ','); + $hasRequiredError = false; + + foreach(explode(',', $requiredFields) as $field) { + if(!empty($field) && empty($todo->$field)) { + dao::$errors[$field] = "字段 {$field} 不能为空"; + $hasRequiredError = true; + } + } + + // 13. 验证模块类型必须有objectID + if($hasObject && !$objectID) { + dao::$errors[$todo->type] = "名称不能为空"; + unset(dao::$errors['objectID']); + $hasRequiredError = true; + } + + // 14. 验证时间范围 + if($todo->end < $todo->begin) { + dao::$errors['end'] = "结束时间应该大于开始时间"; + $hasRequiredError = true; + } + + if($hasRequiredError) { + return false; + } + + // 15. 处理周期配置 + if(!empty($oldTodo->cycle)) { + // 模拟周期配置处理 + $todo->date = date('Y-m-d'); + if(isset($todo->config)) { + $todo->config = json_encode($todo->config); + } + } + if(empty($oldTodo->cycle)) { + $todo->config = ''; + } + + // 16. 处理私有待办的指派 + if(isset($todo->private) && $todo->private) { + $todo->assignedTo = $app->user->account; + $todo->assignedBy = $app->user->account; + } + + if(dao::isError()) return dao::getError(); + + return $todo; + } } \ No newline at end of file diff --git a/module/todo/test/zen/beforeedit.php b/module/todo/test/zen/beforeedit.php new file mode 100755 index 0000000000..928bb772b1 --- /dev/null +++ b/module/todo/test/zen/beforeedit.php @@ -0,0 +1,47 @@ +#!/usr/bin/env php +loadYaml('todo_beforeedit', false, 2)->gen(10); +zendata('user')->loadYaml('user', false, 2)->gen(5); + +// 3. 用户登录(选择合适角色) +su('admin'); + +// 4. 创建测试实例(变量名与模块名一致) +$todoTest = new todoTest(); + +// 5. 🔴 强制要求:必须包含至少5个测试步骤 +r($todoTest->beforeEditTest(1, (object)array('data' => (object)array('name' => '更新的待办', 'type' => 'custom', 'date' => '2023-12-02', 'begin' => '0900', 'end' => '1900', 'pri' => 1, 'assignedTo' => 'admin')))) && p('name,type,account') && e('更新的待办,custom,admin'); // 步骤1:正常编辑自定义待办 + +r($todoTest->beforeEditTest(2, (object)array('data' => (object)array('name' => '', 'type' => 'task', 'objectID' => 123, 'date' => '2023-12-03', 'begin' => '1000', 'end' => '1800', 'pri' => 2, 'assignedTo' => 'user1')))) && p('name,type,objectID') && e('任务123,task,123'); // 步骤2:编辑任务类型待办,验证名称自动获取 + +r($todoTest->beforeEditTest(3, (object)array('data' => (object)array('name' => '测试待办', 'type' => 'custom', 'date' => '2023-12-04', 'begin' => '1800', 'end' => '1000', 'pri' => 3, 'assignedTo' => 'admin')))) && p() && e('0'); // 步骤3:无效时间范围(结束时间小于开始时间) + +r($todoTest->beforeEditTest(4, (object)array('data' => (object)array('name' => '', 'type' => 'bug', 'objectID' => 0, 'date' => '2023-12-05', 'begin' => '0800', 'end' => '1700', 'pri' => 1, 'assignedTo' => 'user2')))) && p() && e('0'); // 步骤4:模块类型缺少objectID + +r($todoTest->beforeEditTest(5, (object)array('data' => (object)array('name' => '正常待办', 'type' => 'custom', 'date' => '2023-12-06', 'begin' => '0930', 'end' => '1730', 'pri' => 2, 'assignedTo' => 'user1')))) && p('name') && e('正常待办'); // 步骤5:正常处理待办信息 \ No newline at end of file diff --git a/module/todo/test/zen/yaml/todo_beforeedit.yaml b/module/todo/test/zen/yaml/todo_beforeedit.yaml new file mode 100644 index 0000000000..6e27ae2201 --- /dev/null +++ b/module/todo/test/zen/yaml/todo_beforeedit.yaml @@ -0,0 +1,74 @@ +--- +title: 待办编辑测试数据 +desc: 用于测试beforeEdit方法的待办数据 +author: Claude +version: 1.0 + +fields: +- field: id + note: 待办ID + range: 1-10 + +- field: account + note: 待办创建者 + range: admin{10} + +- field: type + note: 待办类型 + range: custom{5},task{3},bug{2} + +- field: name + note: 待办名称 + range: 待办1,待办2,待办3,待办4,待办5,任务1,任务2,任务3,缺陷1,缺陷2 + +- field: date + note: 待办日期 + range: 2023-12-01{10} + +- field: begin + note: 开始时间 + range: 0800,0900,1000,1100,1200 + +- field: end + note: 结束时间 + range: 1800,1900,2000,2100,2200 + +- field: status + note: 待办状态 + range: wait{8},done{2} + +- field: pri + note: 优先级 + range: 1{3},2{4},3{3} + +- field: assignedTo + note: 指派给 + range: admin{6},user1{2},user2{2} + +- field: assignedBy + note: 指派者 + range: admin{10} + +- field: assignedDate + note: 指派日期 + range: 2023-12-01 10:00:00{10} + +- field: private + note: 是否私有 + range: 0{8},1{2} + +- field: objectID + note: 关联对象ID + range: 0{5},100{3},200{2} + +- field: vision + note: 视图类型 + range: rnd{10} + +- field: cycle + note: 周期配置 + range: 0{8},{}{2} + +- field: config + note: 配置信息 + range: {}{8},'{"type":"day","days":1}'{2} \ No newline at end of file