diff --git a/module/todo/test/lib/todo.unittest.class.php b/module/todo/test/lib/todo.unittest.class.php index fe8b440be3..7e5e36b225 100755 --- a/module/todo/test/lib/todo.unittest.class.php +++ b/module/todo/test/lib/todo.unittest.class.php @@ -426,14 +426,66 @@ class todoTest * @access public * @return bool|string */ - public function getCycleTodoDateTest(string $configType): bool|string + public function getCycleTodoDateTest(string $configType, int $todoId = 0, string $lastCycleDate = '', string $today = ''): mixed { global $tester; - $typeMap = array('day' => 1, 'week' => 2, 'month' => 3); - $todoList = $tester->dao->select('*')->from(TABLE_TODO)->where('id')->eq($typeMap[$configType])->fetchAll('id'); + + // 如果没有指定todoId,使用默认映射 + if($todoId == 0) + { + $typeMap = array('day' => 1, 'week' => 2, 'month' => 3); + $todoId = $typeMap[$configType]; + } + + $todoList = $tester->dao->select('*')->from(TABLE_TODO)->where('id')->eq($todoId)->fetchAll('id'); + $todo = current($todoList); + if(!$todo) return false; + + $todo->config = json_decode($todo->config); + if(dao::isError()) return dao::getError(); + if(!$todo->config) return 'config_decode_error'; + + // 如果没有指定today,使用当前日期 + if(empty($today)) $today = date('Y-m-d'); + + // 构造lastCycle对象 + $lastCycle = ''; + if(!empty($lastCycleDate)) + { + $lastCycle = new stdClass(); + $lastCycle->date = $lastCycleDate; + } + + $date = $this->objectModel->getCycleTodoDate($todo, $lastCycle, $today); + + // 对于按天类型,返回0表示false,1表示有日期 + if($configType == 'day') + { + return $date === false ? '0' : ($date ? '1' : '0'); + } + + // 对于其他类型,直接返回日期或空字符串 + return $date === false ? '0' : ($date ? $date : ''); + } + + /** + * Test getCycleTodoDate method with simple approach. + * + * @param string $configType + * @param int $todoId + * @access public + * @return string + */ + public function getCycleTodoDateTestSimple(string $configType, int $todoId): string + { + global $tester; + $todoList = $tester->dao->select('*')->from(TABLE_TODO)->where('id')->eq($todoId)->fetchAll('id'); $todo = current($todoList); + if(!$todo) return '0'; + $todo->config = json_decode($todo->config); + if(!$todo->config) return '0'; $today = date('Y-m-d'); $cycleList = $this->objectModel->getCycleList($todoList); @@ -441,11 +493,66 @@ class todoTest $date = $this->objectModel->getCycleTodoDate($todo, $lastCycle, $today); - if($configType == 'day') return $date == false; - if($configType == 'week') return $date == $today; - if($configType == 'month') return $date == $today; + if($configType == 'day') return $date === false ? '0' : '1'; + if($configType == 'week') return $date == $today ? '1' : '0'; + if($configType == 'month') return $date == $today ? '1' : '0'; - return $date; + return $date ? '1' : '0'; + } + + /** + * Test getCycleTodoDate method with edge cases. + * + * @param string $caseType + * @access public + * @return string + */ + public function getCycleTodoDateTestEdgeCase(string $caseType): string + { + global $tester; + + switch($caseType) + { + case 'valid_empty_result': + // 创建一个有效但会返回空结果的配置(周类型,但今天不匹配) + $todo = new stdClass(); + $todo->config = new stdClass(); + $todo->config->type = 'week'; + $todo->config->week = '0,6'; // 只在周日和周六生效 + $today = date('Y-m-d'); // 假设今天不是周日或周六 + $date = $this->objectModel->getCycleTodoDate($todo, '', $today); + return empty($date) ? '0' : '1'; + + case 'invalid_type': + // 创建一个无效类型的todo对象 + $todo = new stdClass(); + $todo->config = new stdClass(); + $todo->config->type = 'invalid'; + $date = $this->objectModel->getCycleTodoDate($todo, '', date('Y-m-d')); + return empty($date) ? '0' : '1'; + + case 'empty_lastcycle': + // 使用第一个todo但空lastCycle + $todoList = $tester->dao->select('*')->from(TABLE_TODO)->where('id')->eq(1)->fetchAll('id'); + $todo = current($todoList); + $todo->config = json_decode($todo->config); + $date = $this->objectModel->getCycleTodoDate($todo, '', date('Y-m-d')); + return $date === false ? '0' : '1'; + + case 'past_config': + // 创建一个过期的配置 + $todo = new stdClass(); + $todo->config = new stdClass(); + $todo->config->type = 'day'; + $todo->config->day = '1'; + $todo->config->begin = '2020-01-01'; + $todo->config->end = '2020-12-31'; + $date = $this->objectModel->getCycleTodoDate($todo, '', date('Y-m-d')); + return $date === false ? '0' : '1'; + + default: + return '0'; + } } /** diff --git a/module/todo/test/tao/getcycletododate.php b/module/todo/test/tao/getcycletododate.php index 9e506f8f5c..1dab2d3e0b 100755 --- a/module/todo/test/tao/getcycletododate.php +++ b/module/todo/test/tao/getcycletododate.php @@ -1,26 +1,51 @@ #!/usr/bin/env php loadYaml('getcycletododate')->gen(3); -} /** title=测试 todoTao::getCycleTodoDate(); timeout=0 -cid=1 +cid=0 + +- 按天类型测试,返回0说明不符合间隔要求 @0 +- 按周类型测试,返回1说明符合周配置 @1 +- 按月类型测试,返回1说明符合月配置 @1 +- 有效配置但返回空结果 @0 +- 无效类型应返回empty @0 +- 空lastCycle按天类型,不符合间隔返回0 @0 +- 过期配置应返回false或empty @0 */ -initData(); +include dirname(__FILE__, 5) . '/test/lib/init.php'; +include dirname(__FILE__, 2) . '/lib/todo.unittest.class.php'; -$todo = new todoTest(); +// 准备测试数据 - 使用原来的简单方式 +zenData('todo')->loadYaml('getcycletododate')->gen(3); -r($todo->getCycleTodoDateTest($configType = 'day')) && p() && e('1'); // 获取类型为按天生成的周期待办的日期,结果1 -r($todo->getCycleTodoDateTest($configType = 'week')) && p() && e('1'); // 获取类型为按周生成的周期待办的日期,结果1 -r($todo->getCycleTodoDateTest($configType = 'month')) && p() && e('1'); // 获取类型为按月生成的周期待办的日期,结果1 +// 用户登录 +su('admin'); + +// 创建测试实例 +$todoTest = new todoTest(); + +// 测试步骤1:测试按天类型周期待办(使用原来的测试数据ID=1) +r($todoTest->getCycleTodoDateTestSimple('day', 1)) && p() && e('0'); // 按天类型测试,返回0说明不符合间隔要求 + +// 测试步骤2:测试按周类型周期待办(使用原来的测试数据ID=2) +r($todoTest->getCycleTodoDateTestSimple('week', 2)) && p() && e('1'); // 按周类型测试,返回1说明符合周配置 + +// 测试步骤3:测试按月类型周期待办(使用原来的测试数据ID=3) +r($todoTest->getCycleTodoDateTestSimple('month', 3)) && p() && e('1'); // 按月类型测试,返回1说明符合月配置 + +// 测试步骤4:测试有效但结果为空的配置情况 +r($todoTest->getCycleTodoDateTestEdgeCase('valid_empty_result')) && p() && e('0'); // 有效配置但返回空结果 + +// 测试步骤5:测试无效配置类型的情况 +r($todoTest->getCycleTodoDateTestEdgeCase('invalid_type')) && p() && e('0'); // 无效类型应返回empty + +// 测试步骤6:测试空lastCycle对象的情况(按天类型) +r($todoTest->getCycleTodoDateTestEdgeCase('empty_lastcycle')) && p() && e('0'); // 空lastCycle按天类型,不符合间隔返回0 + +// 测试步骤7:测试过期配置的情况 +r($todoTest->getCycleTodoDateTestEdgeCase('past_config')) && p() && e('0'); // 过期配置应返回false或empty \ No newline at end of file