From 0517a21ec23a92d1eac6f1b7112f002ac05ab8d7 Mon Sep 17 00:00:00 2001 From: liugang Date: Mon, 15 Sep 2025 07:30:56 +0800 Subject: [PATCH] + [misc] Add unit tests for productZen::getProducts4DropMenu() method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../test/lib/product.unittest.class.php | 30 ++++ .../product/test/zen/getproducts4dropmenu.php | 59 ++++++++ .../yaml/product_getproducts4dropmenu.yaml | 134 ++++++++++++++++++ 3 files changed, 223 insertions(+) create mode 100755 module/product/test/zen/getproducts4dropmenu.php create mode 100644 module/product/test/zen/yaml/product_getproducts4dropmenu.yaml diff --git a/module/product/test/lib/product.unittest.class.php b/module/product/test/lib/product.unittest.class.php index 5fe107107d..8f47eb5697 100644 --- a/module/product/test/lib/product.unittest.class.php +++ b/module/product/test/lib/product.unittest.class.php @@ -2723,4 +2723,34 @@ class productTest return $result; } + + /** + * Test getProducts4DropMenu method. + * + * @param string $shadow + * @param string $module + * @access public + * @return int + */ + public function getProducts4DropMenuTest(string $shadow = '0', string $module = '') + { + global $tester; + + // 创建productZen实例并初始化相关模型 + $productZen = new productZen(); + $productZen->loadModel('product'); + $productZen->loadModel('workflow'); + $productZen->loadModel('feedback'); + $productZen->config = $tester->config; + $productZen->app = $tester->app; + $productZen->session = $tester->session; + + $method = $this->objectZen->getMethod('getProducts4DropMenu'); + $method->setAccessible(true); + + $result = $method->invokeArgs($productZen, array($shadow, $module)); + if(dao::isError()) return dao::getError(); + + return is_array($result) ? count($result) : 0; + } } diff --git a/module/product/test/zen/getproducts4dropmenu.php b/module/product/test/zen/getproducts4dropmenu.php new file mode 100755 index 0000000000..b2cef56fc5 --- /dev/null +++ b/module/product/test/zen/getproducts4dropmenu.php @@ -0,0 +1,59 @@ +#!/usr/bin/env php +id->range('1-10'); +$product->name->range('产品A,产品B,产品C,产品D,产品E,Shadow产品,Workflow产品,Feedback产品,Project产品,Normal产品'); +$product->code->range('PRODA,PRODB,PRODC,PRODD,PRODE,SHADOWS,WORKFLOW,FEEDBACK,PROJECT,NORMAL'); +$product->shadow->range('0{8},1{2}'); +$product->status->range('normal{7},closed{3}'); +$product->type->range('normal'); +$product->acl->range('open'); +$product->vision->range('rnd'); +$product->deleted->range('0'); +$product->gen(10); + +$project = zenData('project'); +$project->id->range('1-3'); +$project->name->range('项目A,项目B,项目C'); +$project->status->range('doing'); +$project->type->range('project'); +$project->deleted->range('0'); +$project->gen(3); + +$projectproduct = zenData('projectproduct'); +$projectproduct->project->range('1-3'); +$projectproduct->product->range('1-3'); +$projectproduct->gen(3); + +// 3. 用户登录 +su('admin'); + +// 4. 创建测试实例 +$productTest = new productTest(); + +// 5. 执行测试步骤 - 检查结果数量 +r($productTest->getProducts4DropMenuTest('0', '')) && p() && e('8'); // 步骤1:正常情况获取产品下拉菜单数据(不包含影子产品) +r($productTest->getProducts4DropMenuTest('all', '')) && p() && e('10'); // 步骤2:获取所有产品包括影子产品 +r($productTest->getProducts4DropMenuTest('0', 'testmodule')) && p() && e('8'); // 步骤3:指定module参数 +r($productTest->getProducts4DropMenuTest('0', '')) && p() && e('8'); // 步骤4:正常参数测试 +r($productTest->getProducts4DropMenuTest('all', 'any')) && p() && e('10'); // 步骤5:边界参数测试 \ No newline at end of file diff --git a/module/product/test/zen/yaml/product_getproducts4dropmenu.yaml b/module/product/test/zen/yaml/product_getproducts4dropmenu.yaml new file mode 100644 index 0000000000..c0afbd6ad4 --- /dev/null +++ b/module/product/test/zen/yaml/product_getproducts4dropmenu.yaml @@ -0,0 +1,134 @@ +--- +title: 产品下拉菜单测试数据 +desc: 为getProducts4DropMenu方法生成测试数据 + +fields: +- field: id + note: 产品ID + range: 1-10 + +- field: program + note: 项目集ID + range: 1-3 + +- field: name + note: 产品名称 + range: "产品A,产品B,产品C,产品D,产品E,Shadow产品,Workflow产品,Feedback产品,Project产品,Normal产品" + +- field: code + note: 产品代码 + range: "PRODA,PRODB,PRODC,PRODD,PRODE,SHADOWS,WORKFLOW,FEEDBACK,PROJECT,NORMAL" + +- field: shadow + note: 影子产品标识 + range: 0{8},1{2} + +- field: bind + note: 绑定标识 + range: "0" + +- field: line + note: 产品线ID + range: 0-2 + +- field: type + note: 产品类型 + range: "normal{8},branch{2}" + +- field: status + note: 产品状态 + range: "normal{7},closed{3}" + +- field: subStatus + note: 子状态 + range: "" + +- field: desc + note: 产品描述 + range: "这是产品A的描述,这是产品B的描述,这是产品C的描述,这是产品D的描述,这是产品E的描述,这是Shadow产品的描述,这是Workflow产品的描述,这是Feedback产品的描述,这是Project产品的描述,这是Normal产品的描述" + +- field: PO + note: 产品负责人 + range: "admin,user1,user2,user3" + +- field: QD + note: 测试负责人 + range: "admin,user1,user2" + +- field: RD + note: 发布负责人 + range: "admin,user1,user2" + +- field: feedback + note: 反馈负责人 + range: "admin,user1" + +- field: ticket + note: 工单负责人 + range: "admin" + +- field: workflowGroup + note: 工作流组 + range: 0{8},1{2} + +- field: acl + note: 访问控制 + range: "open{6},private{2},custom{2}" + +- field: groups + note: 用户组 + range: "1,2,3,1,2,2,3,1,2,3" + +- field: whitelist + note: 白名单 + range: "admin,user1,admin,user2,admin,user1,user2,admin,user1,admin" + +- field: reviewer + note: 评审人员 + range: "admin,user1,admin,user2,admin,user1,user2,admin,user1,admin" + +- field: PMT + note: PMT成员 + range: "admin,user1,admin,user2,admin,user1,user2,admin,user1,admin" + +- field: draftEpics + note: 草稿史诗数量 + range: 0-5 + +- field: activeEpics + note: 激活史诗数量 + range: 0-8 + +- field: changingEpics + note: 变更史诗数量 + range: 0-3 + +- field: order + note: 排序 + range: 10-50:5 + +- field: vision + note: 视角 + range: "rnd" + +- field: createdBy + note: 创建者 + range: "admin,user1,user2" + +- field: createdDate + note: 创建时间 + range: "(-1M)-(0D):1D" + format: "YYYY-MM-DD hh:mm:ss" + +- field: editedBy + note: 编辑者 + range: "admin,user1,user2" + +- field: editedDate + note: 编辑时间 + range: "(-1w)-(0D):1D" + format: "YYYY-MM-DD hh:mm:ss" + +- field: deleted + note: 是否删除 + range: "0" \ No newline at end of file