* [misc] Enhance unit tests for programplanModel::updateSubStageAttr() method

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
liugang
2025-09-25 09:16:28 +08:00
co-authored by Claude
parent 7fa281aede
commit 16d452fa81
2 changed files with 367 additions and 11 deletions
@@ -3,24 +3,30 @@
/**
title=测试programplanModel->updateSubStageAttr();
title=测试 programplanModel::updateSubStageAttr();
timeout=0
cid=0
- 测试更改 id 为 3 存在子阶段的阶段,attribute 更新值为 mix ,结果为 1 @1
- 测试更改 id 为 5 无子阶段的阶段,更新 attribute 值为 design ,结果为 1 @1
- 测试更改 id 为 2 存在子阶段的阶段,更新 attribute 值为 design ,结果为 design @design
- 测试更改 id 为 3 存在子阶段,子阶段下也存在子阶段,更新 attribute 值为 design ,结果为 design @design
- 测试attribute为mix的情况,应该直接返回true,不更新任何数据 @empty string
- 测试无子阶段的情况,应该返回true,不执行更新操作 @design
- 测试有子阶段的正常更新情况,应该成功更新所有子阶段的attribute @design
- 测试多层级递归更新,有子阶段且子阶段也有子阶段的情况 @review
- 测试边界值情况,planID为0的异常情况 @test
- 测试已删除子阶段的过滤,确保只更新未删除的子阶段 @1
*/
include dirname(__FILE__, 5) . '/test/lib/init.php';
include dirname(__FILE__, 2) . '/lib/programplan.unittest.class.php';
zenData('project')->loadYaml('project_updatesubstageattr', false, 2)->gen(20);
su('admin');
zenData('project')->loadYaml('project')->gen(5);
$plan = new programplanTest();
r($plan->updateSubStageAttrTest(1, 'mix')) && p() && e('1'); // 测试更改 id 为 3 存在子阶段的阶段,attribute 更新值为 mix ,结果为 1
r($plan->updateSubStageAttrTest(5, 'design')) && p() && e(1); // 测试更改 id 为 5 无子阶段的阶段,更新 attribute 值为 design ,结果为 1
r($plan->updateSubStageAttrTest(2, 'design')) && p() && e('design'); // 测试更改 id 为 2 存在子阶段的阶段,更新 attribute 值为 design ,结果为 design
r($plan->updateSubStageAttrTest(3, 'design')) && p() && e('design'); // 测试更改 id 为 3 存在子阶段,子阶段下也存在子阶段,更新 attribute 值为 design ,结果为 design
r($plan->updateSubStageAttrTest(1, 'mix')) && p() && e('empty string'); // 测试attribute为mix的情况,应该直接返回true,不更新任何数据
r($plan->updateSubStageAttrTest(5, 'design')) && p() && e('design'); // 测试无子阶段的情况,应该返回true,不执行更新操作
r($plan->updateSubStageAttrTest(1, 'design')) && p() && e('design'); // 测试有子阶段的正常更新情况,应该成功更新所有子阶段的attribute
r($plan->updateSubStageAttrTest(2, 'review')) && p() && e('review'); // 测试多层级递归更新,有子阶段且子阶段也有子阶段的情况
r($plan->updateSubStageAttrTest(0, 'test')) && p() && e('test'); // 测试边界值情况,planID为0的异常情况
r($plan->updateSubStageAttrTest(11, 'request')) && p() && e(1); // 测试已删除子阶段的过滤,确保只更新未删除的子阶段
@@ -0,0 +1,350 @@
---
title: updateSubStageAttr方法测试数据
desc: 为programplanModel::updateSubStageAttr()方法准备测试数据
author: Claude
version: 1.0
fields:
- field: id
note: 项目ID
range: 1-20
prefix: ""
postfix: ""
loop: 0
format: ""
- field: project
note: 所属项目ID
range: 1-5
prefix: ""
postfix: ""
loop: 0
format: ""
- field: model
note: 项目模型
range: '[scrum]{15},[waterfall]{3},[ipd]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: type
note: 项目类型
range: '[stage]{18},[project]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: parent
note: 父阶段ID,构建多层级结构
range: '[0]{5},[1]{3},[2]{2},[3]{3},[6]{2},[11]{5}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: name
note: 阶段名称
range: '需求阶段,设计阶段,开发阶段,测试阶段,发布阶段,子阶段1,子阶段2,子阶段3,孙阶段1,孙阶段2,顶级阶段1,顶级阶段2,顶级阶段3,顶级阶段4,顶级阶段5,已删除阶段1,已删除阶段2,独立阶段1,独立阶段2,独立阶段3'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: code
note: 项目代码
range: 'STAGE001-STAGE020'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: begin
note: 开始时间
range: '2024-01-01'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: end
note: 结束时间
range: '2024-12-31'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: status
note: 状态
range: '[wait]{10},[doing]{5},[done]{3},[suspended]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: attribute
note: 阶段属性,这是主要测试字段
range: '[request]{8},[design]{4},[review]{3},[mix]{3},[test]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: milestone
note: 里程碑
range: '[0]{15},[1]{5}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: output
note: 可交付成果
range: '[]{15},[需求文档]{2},[设计文档]{2},[代码]{1}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: grade
note: 阶段等级
range: '[1]{5},[2]{10},[3]{5}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: path
note: 路径
range: '[,1,]{5},[,1,2,]{3},[,1,3,]{2},[,1,6,]{2},[,1,2,9,]{3},[,1,2,10,]{2},[,11,]{3}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: order
note: 排序
range: 1-20
prefix: ""
postfix: ""
loop: 0
format: ""
- field: vision
note: 版本
range: 'rnd'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: displayCards
note: 显示卡片
range: '0'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: fluidBoard
note: 流式看板
range: '0'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: deleted
note: 删除状态,重要测试字段
range: '[0]{16},[1]{4}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: openedBy
note: 创建者
range: 'admin'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: openedDate
note: 创建时间
range: '2024-01-01 10:00:00'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: lastEditedBy
note: 最后编辑者
range: '[admin]{15},[user1]{3},[user2]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: lastEditedDate
note: 最后编辑时间
range: '2024-01-02 10:00:00'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: closedBy
note: 关闭者
range: '[]{18},[admin]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: closedDate
note: 关闭时间
range: '[]{18},[2024-01-03 10:00:00]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: canceledBy
note: 取消者
range: '[]{20}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: canceledDate
note: 取消时间
range: '[]{20}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: suspendedDate
note: 挂起时间
range: '[]{18},[2024-01-04 10:00:00]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: PO
note: 产品负责人
range: '[admin]{15},[user1]{3},[user2]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: PM
note: 项目经理
range: '[admin]{15},[user1]{3},[user2]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: QD
note: 测试负责人
range: '[admin]{15},[user1]{3},[user2]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: RD
note: 发布负责人
range: '[admin]{15},[user1]{3},[user2]{2}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: team
note: 团队
range: '[]{20}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: acl
note: 访问控制
range: '[open]{15},[private]{5}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: whitelist
note: 白名单
range: '[]{20}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: auth
note: 权限
range: '[]{20}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: days
note: 天数
range: 0-365
prefix: ""
postfix: ""
loop: 0
format: ""
- field: hours
note: 小时数
range: '0'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: percent
note: 完成百分比
range: 0-100
prefix: ""
postfix: ""
loop: 0
format: ""
- field: budget
note: 预算
range: '0'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: budgetUnit
note: 预算单位
range: 'CNY'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: desc
note: 描述
range: '[]{15},[这是一个测试阶段]{5}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: version
note: 版本号
range: 1
prefix: ""
postfix: ""
loop: 0
format: ""
- field: parentVersion
note: 父版本号
range: 1
prefix: ""
postfix: ""
loop: 0
format: ""
- field: planDuration
note: 计划持续时间
range: 1-365
prefix: ""
postfix: ""
loop: 0
format: ""
- field: realDuration
note: 实际持续时间
range: 1-365
prefix: ""
postfix: ""
loop: 0
format: ""
- field: realBegan
note: 实际开始时间
range: '[]{10},[2024-01-01]{10}'
prefix: ""
postfix: ""
loop: 0
format: ""
- field: realEnd
note: 实际结束时间
range: '[]{15},[2024-12-31]{5}'
prefix: ""
postfix: ""
loop: 0
format: ""