From f3cf1efbf898bd01a3c5a967a1c5bd8f6f6c2433 Mon Sep 17 00:00:00 2001 From: liugang Date: Thu, 11 Sep 2025 00:14:08 +0800 Subject: [PATCH] + [misc] Add unit tests for userModel::getLatestUserView() 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 --- module/user/test/model/getlatestuserview.php | 216 +++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100755 module/user/test/model/getlatestuserview.php diff --git a/module/user/test/model/getlatestuserview.php b/module/user/test/model/getlatestuserview.php new file mode 100755 index 0000000000..d5adda40a7 --- /dev/null +++ b/module/user/test/model/getlatestuserview.php @@ -0,0 +1,216 @@ +#!/usr/bin/env php +id->range('1-10'); +$user->account->range('admin,user1,user2,pm1,pm2,po1,po2,dev1,dev2,tester1'); +$user->realname->range('管理员,用户1,用户2,项目经理1,项目经理2,产品经理1,产品经理2,开发1,开发2,测试1'); +$user->role->range('admin,user{9}'); +$user->password->range('123456{10}'); +$user->deleted->range('0{10}'); +$user->gen(10); + +$company = zenData('company'); +$company->id->range('1'); +$company->name->range('测试公司'); +$company->admins->range(',admin,'); +$company->gen(1); + +// 直接通过DAO更新数据库确保admins字段格式正确 +global $tester; +$tester->dao->update(TABLE_COMPANY)->set('admins')->eq(',admin,')->where('id')->eq(1)->exec(); + +$project = zenData('project'); +$project->id->range('1-5'); +$project->name->range('项目1,项目2,项目3,项目4,项目5'); +$project->type->range('project{5}'); +$project->PM->range('pm1,pm2,admin,user1,user2'); +$project->openedBy->range('admin,user1,user2,pm1,pm2'); +$project->acl->range('open,private,custom,open,private'); +$project->deleted->range('0{5}'); +$project->gen(5); + +$product = zenData('product'); +$product->id->range('1-5'); +$product->name->range('产品1,产品2,产品3,产品4,产品5'); +$product->type->range('normal{5}'); +$product->PO->range('po1,po2,admin,user1,user2'); +$product->QD->range('po1,po2,admin,user1,user2'); +$product->RD->range('dev1,dev2,admin,user1,user2'); +$product->PMT->range('pm1,pm2,admin,user1,user2'); +$product->createdBy->range('admin,user1,user2,po1,po2'); +$product->acl->range('open,private,custom,open,private'); +$product->deleted->range('0{5}'); +$product->gen(5); + +$program = zenData('project'); +$program->id->range('101-105'); +$program->name->range('项目集1,项目集2,项目集3,项目集4,项目集5'); +$program->type->range('program{5}'); +$program->PM->range('pm1,pm2,admin,user1,user2'); +$program->openedBy->range('admin,user1,user2,pm1,pm2'); +$program->acl->range('open,private,program,open,private'); +$program->parent->range('0{5}'); +$program->deleted->range('0{5}'); +$program->gen(5); + +// 3. 用户登录(选择合适角色) +su('admin'); + +// 4. 创建测试实例(变量名与模块名一致) +$userTest = new userTest(); + +// 5. 🔴 强制要求:必须包含至少5个测试步骤 + +// 步骤1:用户有权限访问项目,权限ID不在视图列表中,期望添加到视图列表 +$project1 = new stdClass(); +$project1->id = 1; +$project1->PM = 'user1'; +$project1->PO = ''; +$project1->QD = ''; +$project1->RD = ''; +$project1->openedBy = 'admin'; +$project1->acl = 'open'; +$project1->type = 'project'; +$project1->parent = 0; +$project1->path = ',1,'; +$project1->deleted = '0'; +r($userTest->getLatestUserViewTest('user1', '2,3', $project1, 'project', array(), array(1 => array('user1')), array(), array())) && p() && e('2,3,1'); + +// 步骤2:用户有权限访问产品,权限ID不在视图列表中,期望添加到视图列表 +$product1 = new stdClass(); +$product1->id = 1; +$product1->PO = 'user1'; +$product1->QD = 'user2'; +$product1->RD = 'dev1'; +$product1->PMT = 'pm1'; +$product1->reviewer = 'admin'; +$product1->createdBy = 'user1'; +$product1->acl = 'open'; +$product1->deleted = '0'; +r($userTest->getLatestUserViewTest('user1', '2,3', $product1, 'product', array(1 => array('user1')), array(1 => array('user1')), array(), array())) && p() && e('2,3,1'); + +// 步骤3:用户无权限访问项目,权限ID在视图列表中,期望从视图列表移除 +$project2 = new stdClass(); +$project2->id = 2; +$project2->PM = 'pm1'; +$project2->PO = ''; +$project2->QD = ''; +$project2->RD = ''; +$project2->openedBy = 'pm2'; +$project2->acl = 'private'; +$project2->type = 'project'; +$project2->parent = 0; +$project2->path = ',2,'; +$project2->deleted = '0'; +r($userTest->getLatestUserViewTest('user1', '1,2,3', $project2, 'project', array(), array(), array(), array())) && p() && e('1,3'); + +// 步骤4:用户无权限访问产品,权限ID在视图列表中,期望从视图列表移除 +$product2 = new stdClass(); +$product2->id = 2; +$product2->PO = 'po1'; +$product2->QD = 'po2'; +$product2->RD = 'dev1'; +$product2->PMT = 'pm1'; +$product2->reviewer = 'admin'; +$product2->createdBy = 'po1'; +$product2->acl = 'private'; +$product2->deleted = '0'; +r($userTest->getLatestUserViewTest('user1', '1,2,3', $product2, 'product', array(), array(), array(), array())) && p() && e('1,3'); + +// 步骤5:用户有权限访问项目集,但ID已在视图列表中,期望视图列表保持不变 +$program1 = new stdClass(); +$program1->id = 101; +$program1->PM = 'user1'; +$program1->openedBy = 'admin'; +$program1->acl = 'open'; +$program1->parent = 0; +$program1->deleted = '0'; +r($userTest->getLatestUserViewTest('user1', '101,102,103', $program1, 'program', array(101 => array('user1')), array(), array(), array())) && p() && e('101,102,103'); + +// 步骤6:管理员用户访问私有项目,期望获得访问权限并添加到视图列表 +$project3 = new stdClass(); +$project3->id = 3; +$project3->PM = 'admin'; +$project3->PO = ''; +$project3->QD = ''; +$project3->RD = ''; +$project3->openedBy = 'admin'; +$project3->acl = 'private'; +$project3->type = 'project'; +$project3->parent = 0; +$project3->path = ',3,'; +$project3->deleted = '0'; +r($userTest->getLatestUserViewTest('admin', '1,2', $project3, 'project', array(), array(), array(), array())) && p() && e('1,2,3'); + +// 步骤7:普通用户访问有ACL限制的项目集,期望根据项目集权限规则进行权限判断 +$program2 = new stdClass(); +$program2->id = 102; +$program2->PM = 'pm1'; +$program2->openedBy = 'pm2'; +$program2->acl = 'program'; +$program2->parent = 0; +$program2->path = ',102,'; +$program2->deleted = '0'; +r($userTest->getLatestUserViewTest('user1', '101,103', $program2, 'program', array(), array(), array(), array())) && p() && e('101,103'); + +// 步骤8:测试空视图列表的情况,期望正确处理空字符串 +$project4 = new stdClass(); +$project4->id = 4; +$project4->PM = 'user1'; +$project4->PO = ''; +$project4->QD = ''; +$project4->RD = ''; +$project4->openedBy = 'admin'; +$project4->acl = 'open'; +$project4->type = 'project'; +$project4->parent = 0; +$project4->path = ',4,'; +$project4->deleted = '0'; +r($userTest->getLatestUserViewTest('user1', '', $project4, 'project', array(), array(4 => array('user1')), array(), array())) && p() && e(',4'); + +// 步骤9:测试迭代(sprint)对象的权限控制,期望按项目权限规则处理 +$sprint1 = new stdClass(); +$sprint1->id = 5; +$sprint1->PM = 'user1'; +$sprint1->PO = ''; +$sprint1->QD = ''; +$sprint1->RD = ''; +$sprint1->openedBy = 'admin'; +$sprint1->acl = 'open'; +$sprint1->type = 'sprint'; +$sprint1->parent = 1; +$sprint1->path = ',1,5,'; +$sprint1->deleted = '0'; +r($userTest->getLatestUserViewTest('user1', '1,2,3', $sprint1, 'sprint', array(), array(5 => array('user1')), array(), array())) && p() && e('1,2,3,5'); \ No newline at end of file