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