From 2803bd98a2f1cb2ddb06d888294f1668de51f8c3 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 24 May 2023 10:47:59 +0800 Subject: [PATCH] * Refactor bugModel-batchCreate, and add unit test. --- module/bug/config.php | 2 +- module/bug/control.php | 3 - module/bug/model.php | 204 ++++++------------ module/bug/tao.php | 30 +++ module/bug/test/bug.class.php | 132 ++++++++---- module/bug/test/model/afterbatchedit.php | 60 ++++++ module/bug/test/model/batchupdate.php | 103 ++++++++- .../afterbatchedit/bug_afterbatchedit.yaml | 11 + .../yaml/batchupdate/bug_batchupdate.yaml | 13 ++ .../bug/test/tao/checkbugsforbatchupdate.php | 75 +++++++ 10 files changed, 436 insertions(+), 197 deletions(-) create mode 100755 module/bug/test/model/afterbatchedit.php create mode 100644 module/bug/test/model/yaml/afterbatchedit/bug_afterbatchedit.yaml create mode 100644 module/bug/test/model/yaml/batchupdate/bug_batchupdate.yaml create mode 100644 module/bug/test/tao/checkbugsforbatchupdate.php diff --git a/module/bug/config.php b/module/bug/config.php index a55dd9ab32..75bbe4a330 100755 --- a/module/bug/config.php +++ b/module/bug/config.php @@ -8,7 +8,7 @@ $config->bug->create = new stdclass(); $config->bug->edit = new stdclass(); $config->bug->resolve = new stdclass(); $config->bug->create->requiredFields = 'title,openedBuild'; -$config->bug->edit->requiredFields = $config->bug->create->requiredFields; +$config->bug->edit->requiredFields = 'title'; $config->bug->resolve->requiredFields = 'resolution'; $config->bug->actions = new stdclass(); diff --git a/module/bug/control.php b/module/bug/control.php index 73a1463bbe..a44876f00b 100755 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -401,9 +401,6 @@ class bug extends control { if(empty($changes)) continue; - $actionID = $this->action->create('bug', $bugID, 'Edited'); - $this->action->logHistory($actionID, $changes); - /* Pop-up confirmation dialog box, when the bug has been converted to a task. */ $bug = $this->bug->getById($bugID); if($bug->toTask != 0) diff --git a/module/bug/model.php b/module/bug/model.php index 9333f0b876..6604f3bdaf 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -419,156 +419,62 @@ class bugModel extends model } /** + * 批量更新 bugs。 * Batch update bugs. * + * @param array $bugs * @access public - * @return array + * @return array|false */ - public function batchUpdate() + public function batchUpdate(array $bugs): array|bool { - $bugs = array(); - $allChanges = array(); - $now = helper::now(); - $data = fixer::input('post')->get(); - $bugIDList = $this->post->bugIDList ? $this->post->bugIDList : array(); - $unlinkPlans = array(); - $link2Plans = array(); + if(empty($bugs)) return false; - if(!empty($bugIDList)) + /* Check bugs for batch update. */ + $this->bugTao->checkBugsForBatchUpdate($bugs); + if(dao::isError()) return false; + + $oldBugs = $this->getByIdList(array_column($bugs, 'id')); + + /* Update bugs. */ + $toTaskIdList = array(); + $unlinkPlans = array(); + $link2Plans = array(); + foreach($bugs as $bugID => $bug) { - /* Process the data if the value is 'ditto'. */ - foreach($bugIDList as $bugID) + /* Update bug. */ + $this->dao->update(TABLE_BUG)->data($bug) + ->autoCheck() + ->checkFlow() + ->where('id')->eq((int)$bugID) + ->exec(); + if(dao::isError()) { - if(!isset($data->assignedTos[$bugID])) $data->assignedTos[$bugID] = 'closed'; - if($data->types[$bugID] == 'ditto') $data->types[$bugID] = isset($prev['type']) ? $prev['type'] : ''; - if($data->severities[$bugID] == 'ditto') $data->severities[$bugID] = isset($prev['severity']) ? $prev['severity'] : 3; - if($data->pris[$bugID] == 'ditto') $data->pris[$bugID] = isset($prev['pri']) ? $prev['pri'] : 0; - if($data->plans[$bugID] == 'ditto') $data->plans[$bugID] = isset($prev['plan']) ? $prev['plan'] : ''; - if($data->assignedTos[$bugID] == 'ditto') $data->assignedTos[$bugID] = isset($prev['assignedTo']) ? $prev['assignedTo'] : ''; - if($data->resolvedBys[$bugID] == 'ditto') $data->resolvedBys[$bugID] = isset($prev['resolvedBy']) ? $prev['resolvedBy'] : ''; - if($data->resolutions[$bugID] == 'ditto') $data->resolutions[$bugID] = isset($prev['resolution']) ? $prev['resolution'] : ''; - if(isset($data->branches[$bugID]) and $data->branches[$bugID] == 'ditto') $data->branches[$bugID] = isset($prev['branch']) ? $prev['branch'] : 0; - - $prev['type'] = $data->types[$bugID]; - $prev['severity'] = $data->severities[$bugID]; - $prev['pri'] = $data->pris[$bugID]; - $prev['branch'] = isset($data->branches[$bugID]) ? $data->branches[$bugID] : ''; - $prev['plan'] = $data->plans[$bugID]; - $prev['assignedTo'] = $data->assignedTos[$bugID]; - $prev['resolvedBy'] = $data->resolvedBys[$bugID]; - $prev['resolution'] = $data->resolutions[$bugID]; + dao::$errors['message'][] = 'bug#' . ($bugID) . dao::getError(true); + return false; } - /* Initialize bugs from the post data.*/ - $extendFields = $this->getFlowExtendFields(); - $oldBugs = $bugIDList ? $this->getByList($bugIDList) : array(); - foreach($bugIDList as $bugID) + /* Processing other operations after update bug. */ + $oldBug = $oldBugs[$bugID]; + $this->afterBatchEdit($bug, $oldBug); + + if($oldBug->toTask != 0 && isset($bug->status) && $bug->status != $oldBug->status) $toTaskIdList[$oldBug->toTask] = $oldBug->toTask; + + /* Get changes of plan. */ + if($bug->plan != $oldBug->plan) { - $oldBug = $oldBugs[$bugID]; - - $os = array_filter($data->os[$bugID]); - $browsers = array_filter($data->browsers[$bugID]); - $duplicateBug = $data->duplicateBugs[$bugID] ? $data->duplicateBugs[$bugID] : $oldBug->duplicateBug; - - $bug = new stdclass(); - $bug->id = $bugID; - $bug->lastEditedBy = $this->app->user->account; - $bug->lastEditedDate = $now; - $bug->type = $data->types[$bugID]; - $bug->severity = $data->severities[$bugID]; - $bug->pri = $data->pris[$bugID]; - $bug->color = $data->colors[$bugID]; - $bug->title = $data->titles[$bugID]; - $bug->plan = empty($data->plans[$bugID]) ? 0 : $data->plans[$bugID]; - $bug->branch = empty($data->branches[$bugID]) ? 0 : $data->branches[$bugID]; - $bug->module = $data->modules[$bugID]; - $bug->assignedTo = $oldBug->status == 'closed' ? $oldBug->assignedTo : $data->assignedTos[$bugID]; - $bug->deadline = $data->deadlines[$bugID]; - $bug->resolvedBy = $data->resolvedBys[$bugID]; - $bug->keywords = $data->keywords[$bugID]; - $bug->os = implode(',', $os); - $bug->browser = implode(',', $browsers); - $bug->resolution = $data->resolutions[$bugID]; - $bug->duplicateBug = ($bug->resolution != '' and $bug->resolution != 'duplicate') ? 0 : $duplicateBug; - - if($bug->assignedTo != $oldBug->assignedTo) $bug->assignedDate = $now; - if($bug->resolution != '') $bug->confirmed = 1; - if(($bug->resolvedBy != '' or $bug->resolution != '') and strpos(',resolved,closed,', ",{$oldBug->status},") === false) - { - $bug->resolvedDate = $now; - $bug->status = 'resolved'; - } - if($bug->resolution != '' and $bug->resolvedBy == '') $bug->resolvedBy = $this->app->user->account; - if($bug->resolution != '' and $bug->assignedTo == '') - { - $bug->assignedTo = $oldBug->openedBy; - $bug->assignedDate = $now; - } - - foreach($extendFields as $extendField) - { - $bug->{$extendField->field} = $this->post->{$extendField->field}[$bugID]; - if(is_array($bug->{$extendField->field})) $bug->{$extendField->field} = implode(',', $bug->{$extendField->field}); - - $bug->{$extendField->field} = htmlSpecialString($bug->{$extendField->field}); - } - - if($bug->plan != $oldBug->plan) - { - if($bug->plan != $oldBug->plan and !empty($oldBug->plan)) $unlinkPlans[$oldBug->plan] = empty($unlinkPlans[$oldBug->plan]) ? $bugID : "{$unlinkPlans[$oldBug->plan]},$bugID"; - if($bug->plan != $oldBug->plan and !empty($bug->plan)) $link2Plans[$bug->plan] = empty($link2Plans[$bug->plan]) ? $bugID : "{$link2Plans[$bug->plan]},$bugID"; - } - - $bugs[$bugID] = $bug; - unset($bug); - } - - $isBiz = $this->config->edition == 'biz'; - $isMax = $this->config->edition == 'max'; - - /* Update bugs. */ - foreach($bugs as $bugID => $bug) - { - $oldBug = $oldBugs[$bugID]; - - $this->dao->update(TABLE_BUG)->data($bug) - ->autoCheck() - ->batchCheck($this->config->bug->edit->requiredFields, 'notempty') - ->checkIF($bug->resolvedBy, 'resolution', 'notempty') - ->checkIF($bug->resolution == 'duplicate', 'duplicateBug', 'notempty') - ->checkFlow() - ->where('id')->eq((int)$bugID) - ->exec(); - - if(!dao::isError()) - { - if(!empty($bug->resolvedBy)) $this->loadModel('score')->create('bug', 'resolve', $bug); - - $this->executeHooks($bugID); - - $allChanges[$bugID] = common::createChanges($oldBug, $bug); - - if(($isBiz || $isMax) && $oldBug->feedback && !isset($feedbacks[$oldBug->feedback])) - { - $feedbacks[$oldBug->feedback] = $oldBug->feedback; - $this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status); - } - } - else - { - return helper::end(js::error('bug#' . $bugID . dao::getError(true))); - } + if(!empty($oldBug->plan)) $unlinkPlans[$oldBug->plan] = empty($unlinkPlans[$oldBug->plan]) ? $bugID : "{$unlinkPlans[$oldBug->plan]},{$bugID}"; + if(!empty($bug->plan)) $link2Plans[$bug->plan] = empty($link2Plans[$bug->plan]) ? $bugID : "{$link2Plans[$bug->plan]},{$bugID}"; } } - if(!dao::isError()) - { - $this->loadModel('score')->create('ajax', 'batchEdit'); - $this->loadModel('action'); - foreach($unlinkPlans as $planID => $bugs) $this->action->create('productplan', $planID, 'unlinkbug', '', $bugs); - foreach($link2Plans as $planID => $bugs) $this->action->create('productplan', $planID, 'linkbug', '', $bugs); - } - return $allChanges; + $this->loadModel('score')->create('ajax', 'batchEdit'); + + $this->loadModel('action'); + foreach($unlinkPlans as $planID => $bugs) $this->action->create('productplan', $planID, 'unlinkbug', '', $bugs); + foreach($link2Plans as $planID => $bugs) $this->action->create('productplan', $planID, 'linkbug', '', $bugs); + + return $toTaskIdList; } /** @@ -3055,4 +2961,30 @@ class bugModel extends model } return $actionID; } + + /** + * 批量编辑 bug 后的其他处理。 + * Processing after batch edit of bug. + * + * @param object $bug + * @param object $oldBug + * @access protected + * @return bool + */ + protected function afterBatchEdit(object $bug, object $oldBug): bool + { + $this->executeHooks($bug->id); + + /* Record log. */ + $changes = common::createChanges($oldBug, $bug); + $actionID = $this->loadModel('action')->create('bug', $bug->id, 'Edited'); + $this->action->logHistory($actionID, $changes); + + /* Record score when bug is resolved. */ + if(isset($bug->status) and $bug->status == 'resolved' and $oldBug->status == 'active') $this->loadModel('score')->create('bug', 'resolve', $bug, $bug->resolvedBy); + + if($this->config->edition != 'pms' && $oldBug->feedback) $this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status); + + return !dao::isError(); + } } diff --git a/module/bug/tao.php b/module/bug/tao.php index f5f1e8bde5..b09bc91440 100644 --- a/module/bug/tao.php +++ b/module/bug/tao.php @@ -511,4 +511,34 @@ class bugTao extends bugModel $this->dao->update(TABLE_BUG)->data($bug)->autoCheck()->where('id')->eq($bugID)->exec(); return !dao::isError(); } + + /** + * 为批量编辑 bugs 检查数据。 + * Check bugs for batch update. + * + * @param array $bugs + * @access protected + * @return bool + */ + protected function checkBugsForBatchUpdate(array $bugs): bool + { + $requiredFields = explode(',', $this->config->bug->edit->requiredFields); + foreach($bugs as $bug) + { + /* Check required fields. */ + foreach($requiredFields as $requiredField) + { + if(!isset($bug->{$requiredField}) or strlen(trim($bug->{$requiredField})) == 0) + { + $fieldName = isset($this->lang->bug->$requiredField) ? $this->lang->bug->$requiredField : $requiredField; + dao::$errors["{$requiredField}[{$bug->id}]"] = sprintf($this->lang->error->notempty, $fieldName); + } + } + + if(!empty($bug->resolvedBy) && empty($bug->resolution)) dao::$errors["resolution[{$bug->id}]"] = sprintf($this->lang->error->notempty, $this->lang->bug->resolution); + if($bug->resolution == 'duplicate' && empty($bug->duplicateBug)) dao::$errors["duplicateBug[{$bug->id}]"] = sprintf($this->lang->error->notempty, $this->lang->bug->duplicateBug); + } + + return !dao::isError(); + } } diff --git a/module/bug/test/bug.class.php b/module/bug/test/bug.class.php index bd0fa5f726..4bc723b0db 100644 --- a/module/bug/test/bug.class.php +++ b/module/bug/test/bug.class.php @@ -830,66 +830,42 @@ class bugTest } /** + * 测试批量更新 bugs。 * Test batch update bugs. * - * @param array $bugIDList - * @param string $title - * @param string $type - * @param int $bugID + * @param array $bugs * @access public * @return array */ - public function batchUpdateObject($bugIDList, $title, $type, $bugID) + public function batchUpdateObject($bugs) { - $titles = array('1' => 'BUG1', '2' => 'BUG2', '3' => 'BUG3'); - $types = array('1' => 'codeerror', '2' => 'config', '3' => 'install'); - $severities = array('1' => '1', '2' => '2', '3' => '3'); - $pris = array('1' => '1', '2' => '2', '3' => '3'); - $colors = array('1' => '#3da7f5', '2' => '#75c941', '3' => '#2dbdb2'); - $module = array('1' => '1821', '2' => '1822', '3' => '1823'); - $plan = array('1' => '1', '2' => '1', '3' => '1'); - $assignedTo = array('1' => 'admin', '2' => 'admin', '3' => 'admin'); - $deadline = array('1' => date('Y-m-d',strtotime('-1 month')), '2' => date('Y-m-d',strtotime('-1 month +1 day')), '3' => date('Y-m-d',strtotime('-1 month +2 day'))); - $os = array('1' => '', '2' => '', '3' => 'all'); - $browser = array('1' => '', '2' => '', '3' => ''); - $keyword = array('1' => '', '2' => '', '3' => ''); - $resolvedBy = array('1' => '', '2' => '', '3' => ''); - $resolution = array('1' => '', '2' => '', '3' => ''); - $duplicateBug = array('1' => '', '2' => '', '3' => ''); + $_SERVER['HTTP_HOST'] = ''; - $titles[$bugID] = $title; - $types[$bugID] = $type; + global $tester; + $tester->config->global->scoreStatus = true; + $oldScore = $tester->dao->select('score')->from(TABLE_USER)->where('account')->eq('admin')->fetch('score'); - - $batchUpdateFields['bugIDList'] = $bugIDList; - $batchUpdateFields['types'] = $types; - $batchUpdateFields['severities'] = $severities; - $batchUpdateFields['pris'] = $pris; - $batchUpdateFields['titles'] = $titles; - $batchUpdateFields['colors'] = $colors; - $batchUpdateFields['modules'] = $module; - $batchUpdateFields['plans'] = $plan; - $batchUpdateFields['assignedTos'] = $assignedTo; - $batchUpdateFields['deadlines'] = $deadline; - $batchUpdateFields['os'] = $os; - $batchUpdateFields['browsers'] = $browser; - $batchUpdateFields['keywords'] = $keyword; - $batchUpdateFields['resolvedBys'] = $resolvedBy; - $batchUpdateFields['resolutions'] = $resolution; - $batchUpdateFields['duplicateBugs'] = $duplicateBug; - - foreach($batchUpdateFields as $field => $value) $_POST[$field] = $value; - - $object = $this->objectModel->batchUpdate(); - unset($_POST); + $object = $this->objectModel->batchUpdate($bugs); if(dao::isError()) { - return dao::getError(); + $return = ''; + $errors = dao::getError(); + foreach($errors as $key => $value) + { + if(is_string($value)) $return .= "{$key}:{$value}"; + if(is_array($value)) $return .= "{$key}:" .implode('', $value); + } + return $return; } else { - return $object[$bugID]; + $score = $tester->dao->select('score')->from(TABLE_USER)->where('account')->eq('admin')->fetch('score'); + $titles = $tester->dao->select('title')->from(TABLE_BUG)->where('id')->in(array_keys($bugs))->fetchAll('title'); + + $titles = implode(',', array_keys($titles)); + $scoreDifference = $score - $oldScore; + return "scoreDifference:{$scoreDifference};titles:$titles"; } } @@ -2440,4 +2416,68 @@ class bugTest return $file; } } + + /** + * 测试输入的 bugs 是否符合批量编辑的要求。 + * Test check bugs for batch edit. + * + * @param array $bugs + * @access public + * @return string + */ + public function checkBugsForBatchUpdateTest(array $bugs): string + { + $this->objectModel->checkBugsForBatchUpdate($bugs); + + if(dao::isError()) + { + $return = ''; + $errors = dao::getError(); + foreach($errors as $key => $value) + { + if(is_string($value)) $return .= "{$key}:{$value}"; + if(is_array($value)) $return .= "{$key}:" .implode('', $value); + } + return $return; + } + else + { + return 'no error'; + } + } + + /** + * 测试批量编辑 bug 后的其他处理。 + * Test processing after batch edit of bug. + * + * @param object $bug + * @access public + * @return string + */ + public function afterBatchEditTest(object $bug): string + { + $_SERVER['HTTP_HOST'] = ''; + + global $tester; + + $tester->config->global->scoreStatus = true; + + $oldScore = $tester->dao->select('score')->from(TABLE_USER)->where('account')->eq('admin')->fetch('score'); + $oldBug = $tester->dao->findByID($bug->id)->from(TABLE_BUG)->fetch(); + + $this->objectModel->afterBatchEdit($bug, $oldBug); + + if(dao::isError()) + { + return dao::getError(); + } + else + { + $score = $tester->dao->select('score')->from(TABLE_USER)->where('account')->eq('admin')->fetch('score'); + $action = $tester->dao->select('*')->from(TABLE_ACTION)->orderBy('id_desc')->limit(1)->fetch(); + + $scoreDifference = $score - $oldScore; + return "scoreDifference:{$scoreDifference};lastAction:{$action->objectType}-{$action->action}-{$action->objectID}"; + } + } } diff --git a/module/bug/test/model/afterbatchedit.php b/module/bug/test/model/afterbatchedit.php new file mode 100755 index 0000000000..385777441e --- /dev/null +++ b/module/bug/test/model/afterbatchedit.php @@ -0,0 +1,60 @@ +#!/usr/bin/env php +config('bug_afterbatchedit')->gen(10); +zdTable('user')->gen(2); +zdTable('action')->gen(1); +zdTable('score')->gen(1); + +su('admin'); + +/** + +title=bugModel->afterBatchEdit(); +cid=1 +pid=1 + +*/ + +$normal = new stdclass(); +$normal->id = 1; +$normal->severity = 1; +$normal->title = '修改后的名称1'; + +$resolved1 = new stdclass(); +$resolved1->id = 2; +$resolved1->severity = 1; +$resolved1->title = '修改后的名称2'; +$resolved1->status = 'resolved'; +$resolved1->resolvedBy = 'admin'; + +$resolved3 = new stdclass(); +$resolved3->id = 3; +$resolved3->severity = 3; +$resolved3->title = '修改后的名称3'; +$resolved3->status = 'resolved'; +$resolved3->resolvedBy = 'admin'; + +$hasResolved1 = new stdclass(); +$hasResolved1->id = 4; +$hasResolved1->severity = 1; +$hasResolved1->title = '修改后的名称4'; +$hasResolved1->status = 'resolved'; +$hasResolved1->resolvedBy = 'admin'; + +$hasResolved3 = new stdclass(); +$hasResolved3->id = 5; +$hasResolved3->severity = 3; +$hasResolved3->title = '修改后的名称5'; +$hasResolved3->status = 'resolved'; +$hasResolved3->resolvedBy = 'admin'; + +$bug = new bugTest(); + +r($bug->afterBatchEditTest($normal)) && p() && e('scoreDifference:0;lastAction:bug-edited-1'); // 测试 普通的 bug 批量更新后的操作 +r($bug->afterBatchEditTest($resolved1)) && p() && e('scoreDifference:4;lastAction:bug-edited-2'); // 测试 编辑时解决的优先级1 bug 批量更新后的操作 +r($bug->afterBatchEditTest($resolved3)) && p() && e('scoreDifference:2;lastAction:bug-edited-3'); // 测试 编辑时解决的优先级3 bug 批量更新后的操作 +r($bug->afterBatchEditTest($hasResolved1)) && p() && e('scoreDifference:0;lastAction:bug-edited-4'); // 测试 之前就解决的优先级1 bug 批量更新后的操作 +r($bug->afterBatchEditTest($hasResolved3)) && p() && e('scoreDifference:0;lastAction:bug-edited-5'); // 测试 之前就解决的优先级3 bug 批量更新后的操作 diff --git a/module/bug/test/model/batchupdate.php b/module/bug/test/model/batchupdate.php index 37f91101d2..a8d7110f10 100755 --- a/module/bug/test/model/batchupdate.php +++ b/module/bug/test/model/batchupdate.php @@ -1,7 +1,13 @@ #!/usr/bin/env php config('bug_batchupdate')->gen(10); +zdTable('user')->gen(1); +zdTable('action')->gen(1); +zdTable('score')->gen(1); + su('admin'); /** @@ -10,18 +16,93 @@ title=测试bugModel->batchUpdate(); cid=1 pid=1 -测试批量修改bug1 >> type,codeerror,config;title,BUG1,批量修改bug一 -测试批量修改bug2 >> type,config,install;title,BUG2,批量修改bug二 -测试批量修改bug3 >> type,install,security;title,BUG3,批量修改bug三 - */ -$bugIDList = array('1', '2', '3'); +$normal = new stdclass(); +$normal->id = 1; +$normal->severity = 1; +$normal->title = '修改后的名称1'; +$normal->resolution = ''; +$normal->plan = 1; -$title = array('1' => '批量修改bug一', '2' => '批量修改bug二', '3' => '批量修改bug三'); -$type = array('1' => 'config', '2' => 'install', '3' => 'security'); +$resolved1 = new stdclass(); +$resolved1->id = 2; +$resolved1->severity = 1; +$resolved1->title = '修改后的名称2'; +$resolved1->resolution = 'fixed'; +$resolved1->status = 'resolved'; +$resolved1->resolvedBy = 'admin'; +$resolved1->plan = 0; + +$resolved3 = new stdclass(); +$resolved3->id = 3; +$resolved3->severity = 3; +$resolved3->title = '修改后的名称3'; +$resolved3->resolution = 'fixed'; +$resolved3->status = 'resolved'; +$resolved3->resolvedBy = 'admin'; +$resolved3->plan = 0; + +$hasResolved1 = new stdclass(); +$hasResolved1->id = 4; +$hasResolved1->severity = 1; +$hasResolved1->title = '修改后的名称4'; +$hasResolved1->status = 'resolved'; +$hasResolved1->resolution = 'fixed'; +$hasResolved1->resolvedBy = 'admin'; +$hasResolved1->plan = 0; + +$hasResolved3 = new stdclass(); +$hasResolved3->id = 5; +$hasResolved3->severity = 3; +$hasResolved3->title = '修改后的名称5'; +$hasResolved3->status = 'resolved'; +$hasResolved3->resolution = 'fixed'; +$hasResolved3->resolvedBy = 'admin'; +$hasResolved3->plan = 0; + +$hasResolution = new stdclass(); +$hasResolution->id = 6; +$hasResolution->title = '有解决方案'; +$hasResolution->resolvedBy = 'admin'; +$hasResolution->resolution = 'fixed'; +$hasResolution->plan = 2; + +$hasDuplicateBug = new stdclass(); +$hasDuplicateBug->id = 7; +$hasDuplicateBug->title = '有重复bug'; +$hasDuplicateBug->resolution = 'duplicate'; +$hasDuplicateBug->duplicateBug = 1; +$hasDuplicateBug->plan = 1; + +$noTitle = new stdclass(); +$noTitle->id = 8; +$noTitle->title = ''; +$noTitle->resolution = ''; + +$noResolution = new stdclass(); +$noResolution->id = 9; +$noResolution->title = '没有解决方案'; +$noResolution->resolvedBy = 'admin'; +$noResolution->resolution = ''; + +$noDuplicateBug = new stdclass(); +$noDuplicateBug->id = 10; +$noDuplicateBug->title = '没有重复bug'; +$noDuplicateBug->resolution = 'duplicate'; +$noDuplicateBug->duplicateBug = 0; + +$titleErrorBugs = array($normal->id => $normal, $noTitle->id => $noTitle); +$resolutionErrorBugs = array($hasResolution->id => $hasResolution, $noResolution->id => $noResolution); +$duplicateErrorBugs = array($hasDuplicateBug->id => $hasDuplicateBug, $noDuplicateBug->id => $noDuplicateBug); +$allErrorBugs = array($noTitle->id => $noTitle, $noResolution->id => $noResolution, $noDuplicateBug->id => $noDuplicateBug); +$normalBugs = array($normal->id => $normal, $resolved1->id => $resolved1, $resolved3->id => $resolved3); +$hasResolvedBugs = array($resolved1->id => $resolved1, $resolved3->id => $resolved3); $bug = new bugTest(); -r($bug->batchUpdateObject($bugIDList, $title[$bugIDList[0]], $type[$bugIDList[0]], $bugIDList[0])) && p('0:field,old,new;1:field,old,new') && e('type,codeerror,config;title,BUG1,批量修改bug一'); // 测试批量修改bug1 -r($bug->batchUpdateObject($bugIDList, $title[$bugIDList[1]], $type[$bugIDList[1]], $bugIDList[1])) && p('0:field,old,new;1:field,old,new') && e('type,config,install;title,BUG2,批量修改bug二'); // 测试批量修改bug2 -r($bug->batchUpdateObject($bugIDList, $title[$bugIDList[2]], $type[$bugIDList[2]], $bugIDList[2])) && p('0:field,old,new;1:field,old,new') && e('type,install,security;title,BUG3,批量修改bug三'); // 测试批量修改bug3 +r($bug->batchUpdateObject($titleErrorBugs)) && p() && e('title[8]:『Bug标题』不能为空。'); // 测试批量修改 bugs 中 有标题为空的 bug +r($bug->batchUpdateObject($resolutionErrorBugs)) && p() && e('resolution[9]:『解决方案』不能为空。'); // 测试批量修改 bugs 中 有解决的bug但解决方案为空的 bug +r($bug->batchUpdateObject($duplicateErrorBugs)) && p() && e('duplicateBug[10]:『重复Bug』不能为空。'); // 测试批量修改 bugs 中 有解决方案为重复bug的bug但重复bug为空的 bug +r($bug->batchUpdateObject($allErrorBugs)) && p() && e('title[8]:『Bug标题』不能为空。resolution[9]:『解决方案』不能为空。duplicateBug[10]:『重复Bug』不能为空。'); // 测试批量修改 bugs 中 有标题为空的 bug 有解决的bug但解决方案为空的 bug 有解决方案为重复bug的bug但重复bug为空的 bug +r($bug->batchUpdateObject($normalBugs)) && p() && e('scoreDifference:26;titles:修改后的名称1,修改后的名称2,修改后的名称3'); // 测试批量修改 bugs +r($bug->batchUpdateObject($hasResolvedBugs)) && p() && e('scoreDifference:0;titles:修改后的名称2,修改后的名称3'); // 测试批量修改 已经解决bugs diff --git a/module/bug/test/model/yaml/afterbatchedit/bug_afterbatchedit.yaml b/module/bug/test/model/yaml/afterbatchedit/bug_afterbatchedit.yaml new file mode 100644 index 0000000000..21d3ecb163 --- /dev/null +++ b/module/bug/test/model/yaml/afterbatchedit/bug_afterbatchedit.yaml @@ -0,0 +1,11 @@ +--- +title: zt_bug +author: Mengyi Liu +version: "1.0" +fields: +- field: assignedTo + range: user1 +- field: status + range: active{3},resolved{2} +... + diff --git a/module/bug/test/model/yaml/batchupdate/bug_batchupdate.yaml b/module/bug/test/model/yaml/batchupdate/bug_batchupdate.yaml new file mode 100644 index 0000000000..cc1aa4f78b --- /dev/null +++ b/module/bug/test/model/yaml/batchupdate/bug_batchupdate.yaml @@ -0,0 +1,13 @@ +--- +title: zt_bug +author: Mengyi Liu +version: "1.0" +fields: +- field: assignedTo + range: user1 +- field: status + range: active{3},resolved{2},active{10} +- field: plan + range: 1,0 +... + diff --git a/module/bug/test/tao/checkbugsforbatchupdate.php b/module/bug/test/tao/checkbugsforbatchupdate.php new file mode 100644 index 0000000000..a16c51a6a1 --- /dev/null +++ b/module/bug/test/tao/checkbugsforbatchupdate.php @@ -0,0 +1,75 @@ +#!/usr/bin/env php +checkRequired4Resolve(); +timeout=0 +cid=1 + + +*/ + +$hasTitle = new stdclass(); +$hasTitle->id = 1; +$hasTitle->title = 'hasTitle'; +$hasTitle->resolution = ''; + +$hasResolution = new stdclass(); +$hasResolution->id = 2; +$hasResolution->title = 'hasResolution'; +$hasResolution->resolvedBy = 'admin'; +$hasResolution->resolution = 'fixed'; + +$hasDuplicateBug = new stdclass(); +$hasDuplicateBug->id = 3; +$hasDuplicateBug->title = 'hasDuplicateBug'; +$hasDuplicateBug->resolution = 'duplicate'; +$hasDuplicateBug->duplicateBug = 1; + +$noTitle = new stdclass(); +$noTitle->id = 4; +$noTitle->title = ''; +$noTitle->resolution = ''; + +$noResolution = new stdclass(); +$noResolution->id = 5; +$noResolution->title = 'noResolution'; +$noResolution->resolvedBy = 'admin'; +$noResolution->resolution = ''; + +$noDuplicateBug = new stdclass(); +$noDuplicateBug->id = 6; +$noDuplicateBug->title = 'noDuplicateBug'; +$noDuplicateBug->resolution = 'duplicate'; +$noDuplicateBug->duplicateBug = 0; + +$bugs1 = array($hasTitle); +$bugs2 = array($hasResolution); +$bugs3 = array($hasDuplicateBug); +$bugs4 = array($hasTitle, $hasResolution, $hasDuplicateBug); +$bugs5 = array($noTitle); +$bugs6 = array($noResolution); +$bugs7 = array($noDuplicateBug); +$bugs8 = array($noTitle, $noResolution, $noDuplicateBug); +$bugs9 = array($hasTitle, $noTitle); +$bugs10 = array($hasResolution, $noResolution); +$bugs11 = array($hasDuplicateBug, $noDuplicateBug); +$bugs12 = array($hasTitle, $hasResolution, $hasDuplicateBug, $noTitle, $noResolution, $noDuplicateBug); + +$bug = new bugTest(); + +r($bug->checkBugsForBatchUpdateTest($bugs1)) && p() && e('no error'); // 检查 有名称 的bug是否符合要求 +r($bug->checkBugsForBatchUpdateTest($bugs2)) && p() && e('no error'); // 检查 有解决方案 的bug是否符合要求 +r($bug->checkBugsForBatchUpdateTest($bugs3)) && p() && e('no error'); // 检查 有重复bug 的bug是否符合要求 +r($bug->checkBugsForBatchUpdateTest($bugs4)) && p() && e('no error'); // 检查 有名称 有解决方案 有重复bug 的bug是否符合要求 +r($bug->checkBugsForBatchUpdateTest($bugs5)) && p() && e('title[4]:『Bug标题』不能为空。'); // 检查 无名称 的bug是否符合要求 +r($bug->checkBugsForBatchUpdateTest($bugs6)) && p() && e('resolution[5]:『解决方案』不能为空。'); // 检查 无解决方案 的bug是否符合要求 +r($bug->checkBugsForBatchUpdateTest($bugs7)) && p() && e('duplicateBug[6]:『重复Bug』不能为空。'); // 检查 无重复bug 的bug是否符合要求 +r($bug->checkBugsForBatchUpdateTest($bugs8)) && p() && e('title[4]:『Bug标题』不能为空。resolution[5]:『解决方案』不能为空。duplicateBug[6]:『重复Bug』不能为空。'); // 检查 无名称 无解决方案 无重复bug 的bug是否符合要求 +r($bug->checkBugsForBatchUpdateTest($bugs9)) && p() && e('title[4]:『Bug标题』不能为空。'); // 检查 有名称 无名称 的bug是否符合要求 +r($bug->checkBugsForBatchUpdateTest($bugs10)) && p() && e('resolution[5]:『解决方案』不能为空。'); // 检查 有解决方案 无解决方案 的bug是否符合要求 +r($bug->checkBugsForBatchUpdateTest($bugs11)) && p() && e('duplicateBug[6]:『重复Bug』不能为空。'); // 检查 有重复bug 无重复bug 的bug是否符合要求 +r($bug->checkBugsForBatchUpdateTest($bugs12)) && p() && e('title[4]:『Bug标题』不能为空。resolution[5]:『解决方案』不能为空。duplicateBug[6]:『重复Bug』不能为空。'); // 检查 有名称 有解决方案 有重复bug 无名称 无解决方案 无重复bug 的bug是否符合要求