diff --git a/module/qa/control.php b/module/qa/control.php index e01a85e0f6..8a6e0b0227 100644 --- a/module/qa/control.php +++ b/module/qa/control.php @@ -36,6 +36,11 @@ class qa extends control foreach($this->config->qa->menuList as $module) $this->lang->navGroup->$module = 'qa'; $this->lang->noMenuModule[] = $this->app->rawModule; } + else + { + $this->lang->qa->menu = $this->lang->projectQa->menu; + $this->lang->qa->subMenu = $this->lang->projectQa->subMenu; + } } /** diff --git a/module/testcase/control.php b/module/testcase/control.php index a6df85f4ee..1c94cd15d3 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -48,6 +48,11 @@ class testcase extends control foreach($this->config->qa->menuList as $module) $this->lang->navGroup->$module = 'qa'; //$this->lang->noMenuModule[] = $this->app->rawModule; } + else + { + $this->lang->testcase->menu = $this->lang->projectQa->menu; + $this->lang->testcase->subMenu = $this->lang->projectQa->subMenu; + } $this->view->products = $this->products = $this->product->getProductPairsByProject($this->projectID); if(empty($this->products)) die($this->locate($this->createLink('product', 'showErrorNone', "fromModule=testcase"))); @@ -206,7 +211,7 @@ class testcase extends control } } - $this->app->loadLang('project'); + $this->app->loadLang('execution'); $this->app->loadLang('task'); $this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->testcase->common; diff --git a/module/testcase/lang/de.php b/module/testcase/lang/de.php index 1eaa586057..e7a6bb0a49 100644 --- a/module/testcase/lang/de.php +++ b/module/testcase/lang/de.php @@ -74,6 +74,8 @@ $lang->testcase->ignore = 'Ignore'; $lang->testcase->fromTesttask = 'From Test Request'; $lang->testcase->fromCaselib = 'From CaseLib'; $lang->testcase->deleted = 'Deleted'; +$lang->testcase->browseUnits = 'Unit Test'; + $lang->case = $lang->testcase; // For dao checking using. Because 'case' is a php keywords, so the module name is testcase, table name is still case. $lang->testcase->stepID = 'ID'; @@ -219,7 +221,8 @@ $lang->testcase->action->reviewed = array('main' => '$date, überprüft von testcase->featureBar['browse']['all'] = $lang->testcase->allCases; $lang->testcase->featureBar['browse']['wait'] = 'Wartend'; $lang->testcase->featureBar['browse']['needconfirm'] = $lang->testcase->needConfirm; -$lang->testcase->featureBar['browse']['group'] = ''; +$lang->testcase->featureBar['browse']['group'] = 'Group View'; $lang->testcase->featureBar['browse']['suite'] = 'Suite'; -$lang->testcase->featureBar['browse']['zerocase'] = ''; +$lang->testcase->featureBar['browse']['zerocase'] = 'Zero Case Story'; +$lang->testcase->featureBar['browse']['browseunits'] = 'Unit Test'; $lang->testcase->featureBar['groupcase'] = $lang->testcase->featureBar['browse']; diff --git a/module/testcase/lang/en.php b/module/testcase/lang/en.php index f6654283ee..54f198aa3e 100644 --- a/module/testcase/lang/en.php +++ b/module/testcase/lang/en.php @@ -74,6 +74,8 @@ $lang->testcase->ignore = 'Ignore'; $lang->testcase->fromTesttask = 'From Test Request'; $lang->testcase->fromCaselib = 'From Case Library'; $lang->testcase->deleted = 'Deleted'; +$lang->testcase->browseUnits = 'Unit Test'; + $lang->case = $lang->testcase; // For dao checking using. Because 'case' is a php keywords, so the module name is testcase, table name is still case. $lang->testcase->stepID = 'ID'; @@ -219,7 +221,8 @@ $lang->testcase->action->reviewed = array('main' => '$date, recorded by $lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases; $lang->testcase->featureBar['browse']['wait'] = 'Waiting'; $lang->testcase->featureBar['browse']['needconfirm'] = $lang->testcase->needConfirm; -$lang->testcase->featureBar['browse']['group'] = ''; +$lang->testcase->featureBar['browse']['group'] = 'Group View'; $lang->testcase->featureBar['browse']['suite'] = 'Suite'; -$lang->testcase->featureBar['browse']['zerocase'] = ''; +$lang->testcase->featureBar['browse']['zerocase'] = 'Zero Case Story'; +$lang->testcase->featureBar['browse']['browseunits'] = 'Unit Test'; $lang->testcase->featureBar['groupcase'] = $lang->testcase->featureBar['browse']; diff --git a/module/testcase/lang/fr.php b/module/testcase/lang/fr.php index a6c57bd588..7a445fe8fa 100644 --- a/module/testcase/lang/fr.php +++ b/module/testcase/lang/fr.php @@ -74,6 +74,8 @@ $lang->testcase->ignore = 'Ignorer'; $lang->testcase->fromTesttask = 'De Campagne'; $lang->testcase->fromCaselib = 'De Library'; $lang->testcase->deleted = 'Deleted'; +$lang->testcase->browseUnits = 'Unit Test'; + $lang->case = $lang->testcase; // For dao checking using. Because 'case' is a php keywords, so the module name is testcase, table name is still case. $lang->testcase->stepID = 'ID'; @@ -219,7 +221,8 @@ $lang->testcase->action->reviewed = array('main' => '$date, enregistré par testcase->featureBar['browse']['all'] = $lang->testcase->allCases; $lang->testcase->featureBar['browse']['wait'] = 'En Attente'; $lang->testcase->featureBar['browse']['needconfirm'] = $lang->testcase->needConfirm; -$lang->testcase->featureBar['browse']['group'] = ''; -$lang->testcase->featureBar['browse']['suite'] = 'Cahier Recette'; -$lang->testcase->featureBar['browse']['zerocase'] = ''; +$lang->testcase->featureBar['browse']['group'] = 'Group View'; +$lang->testcase->featureBar['browse']['suite'] = 'Suite'; +$lang->testcase->featureBar['browse']['zerocase'] = 'Zero Case Story'; +$lang->testcase->featureBar['browse']['browseunits'] = 'Unit Test'; $lang->testcase->featureBar['groupcase'] = $lang->testcase->featureBar['browse']; diff --git a/module/testcase/lang/vi.php b/module/testcase/lang/vi.php index 418693d528..bc4c152648 100644 --- a/module/testcase/lang/vi.php +++ b/module/testcase/lang/vi.php @@ -74,6 +74,8 @@ $lang->testcase->ignore = 'Bỏ qua'; $lang->testcase->fromTesttask = 'Từ Yêu cầu Test'; $lang->testcase->fromCaselib = 'Từ thư viện tình huống'; $lang->testcase->deleted = 'Đã xóa'; +$lang->testcase->browseUnits = 'Unit Test'; + $lang->case = $lang->testcase; // For dao checking using. Because 'case' is a php keywords, so the module name is testcase, table name is still case. $lang->testcase->stepID = 'ID'; @@ -219,7 +221,8 @@ $lang->testcase->action->reviewed = array('main' => '$date, ghi nhận bởi testcase->featureBar['browse']['all'] = $lang->testcase->allCases; $lang->testcase->featureBar['browse']['wait'] = 'Đang đợi'; $lang->testcase->featureBar['browse']['needconfirm'] = $lang->testcase->needConfirm; -$lang->testcase->featureBar['browse']['group'] = ''; +$lang->testcase->featureBar['browse']['group'] = 'Group View'; $lang->testcase->featureBar['browse']['suite'] = 'Suite'; -$lang->testcase->featureBar['browse']['zerocase'] = ''; +$lang->testcase->featureBar['browse']['zerocase'] = 'Zero Case Story'; +$lang->testcase->featureBar['browse']['browseunits'] = 'Unit Test'; $lang->testcase->featureBar['groupcase'] = $lang->testcase->featureBar['browse']; diff --git a/module/testcase/lang/zh-cn.php b/module/testcase/lang/zh-cn.php index 0ce5bd5a56..4c376fabe4 100644 --- a/module/testcase/lang/zh-cn.php +++ b/module/testcase/lang/zh-cn.php @@ -74,6 +74,8 @@ $lang->testcase->ignore = '忽略'; $lang->testcase->fromTesttask = '来自测试单用例'; $lang->testcase->fromCaselib = '来自用例库用例'; $lang->testcase->deleted = '是否删除'; +$lang->testcase->browseUnits = '单元测试'; + $lang->case = $lang->testcase; // 用于DAO检查时使用。因为case是系统关键字,所以无法定义该模块为case,只能使用testcase,但表还是使用的case。 $lang->testcase->stepID = '编号'; @@ -222,4 +224,5 @@ $lang->testcase->featureBar['browse']['needconfirm'] = $lang->testcase->needConf $lang->testcase->featureBar['browse']['group'] = '分组查看'; $lang->testcase->featureBar['browse']['suite'] = '套件'; $lang->testcase->featureBar['browse']['zerocase'] = "零用例{$lang->SRCommon}"; +$lang->testcase->featureBar['browse']['browseunits'] = '单元测试'; $lang->testcase->featureBar['groupcase'] = $lang->testcase->featureBar['browse']; diff --git a/module/testcase/model.php b/module/testcase/model.php index 7556806d5e..a6d4585d50 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -45,7 +45,10 @@ class testcaseModel extends model foreach($this->lang->testcase->menu as $key => $menu) { if($this->lang->navGroup->testcase != 'qa') $this->loadModel('qa')->setSubMenu('testcase', $key, $productID); - common::setMenuVars($this->lang->testcase->menu, $key, $productID); + + $replace = $productID; + if($this->lang->navGroup->testcase == 'project' and $key == 'bug') $replace = 0; + common::setMenuVars($this->lang->testcase->menu, $key, $replace); } if($this->lang->navGroup->testcase == 'qa') @@ -117,26 +120,7 @@ class testcaseModel extends model } /* If the story is linked project, make the case link the project. */ - if(!empty($case->story)) - { - $projects = $this->dao->select('project')->from(TABLE_PROJECTSTORY)->Where('story')->eq($case->story)->fetchAll('project'); - $projects = array_keys($projects); - } - if($this->lang->navGroup->testcase != 'qa' and empty($case->story)) $projects = array($this->session->PRJ); - if(!empty($projects)) - { - foreach($projects as $projectID) - { - $lastOrder = (int)$this->dao->select('*')->from(TABLE_PROJECTCASE)->where('project')->eq($projectID)->orderBy('order_desc')->limit(1)->fetch('order'); - $data = new stdclass(); - $data->project = $projectID; - $data->product = $case->product; - $data->case = $caseID; - $data->version = 1; - $data->order = ++ $lastOrder; - $this->dao->insert(TABLE_PROJECTCASE)->data($data)->exec(); - } - } + $this->syncCase2Project($case); return array('status' => 'created', 'id' => $caseID); } @@ -246,27 +230,7 @@ class testcaseModel extends model $caseID = $this->dao->lastInsertID(); /* If the story is linked project, make the case link the project. */ - if(!empty($case->story)) - { - $projects = $this->dao->select('project')->from(TABLE_PROJECTSTORY)->Where('story')->eq($case->story)->fetchAll('project'); - $projects = array_keys($projects); - } - if($this->lang->navGroup->testcase != 'qa' and empty($case->story)) $projects = array($this->session->PRJ); - if(!empty($projects)) - { - foreach($projects as $projectID) - { - $lastOrder = (int)$this->dao->select('*')->from(TABLE_PROJECTCASE)->where('project')->eq($projectID)->orderBy('order_desc')->limit(1)->fetch('order'); - $data = new stdclass(); - $data->project = $projectID; - $data->product = $case->product; - $data->case = $caseID; - $data->version = 1; - $data->order = ++ $lastOrder; - $this->dao->insert(TABLE_PROJECTCASE)->data($data)->exec(); - } - } - + $this->syncCase2Project($case); $this->executeHooks($caseID); $this->loadModel('score')->create('testcase', 'create', $caseID); @@ -659,6 +623,40 @@ class testcaseModel extends model $titleChanged = ($case->title != $oldCase->title); if($isLibCase and $titleChanged) $this->dao->update(TABLE_CASE)->set('`title`')->eq($case->title)->where('`fromCaseID`')->eq($caseID)->exec(); + /* The case is linked the project. */ + if($oldCase->project != 0) + { + $productChanged = ($oldCase->product != $case->product); + $storyChanged = ($oldCase->story != $case->story); + + if($productChanged) + { + $this->dao->update(TABLE_PROJECTCASE) + ->set('product')->eq($case->product) + ->set('version')->eq($case->version) + ->where('project')->eq($oldCase->project) + ->andWhere('`case`')->eq($oldCase->id) + ->exec(); + } + + /* If the related story is changed and the new related story isn't linked the project, unlink the case. */ + if($storyChanged) + { + $projectStory = $this->dao->select('*')->from(TABLE_PROJECTSTORY) + ->where('project')->eq($oldCase->project) + ->andWhere('story')->eq($case->story) + ->fetchAll(); + if(!$projectStory) + { + $this->dao->delete()->from(TABLE_PROJECTCASE) + ->where('project')->eq($oldCase->project) + ->andWhere('`case`')->eq($oldCase->id) + ->exec(); + } + + } + } + if($stepChanged) { $parentStepID = 0; @@ -1305,7 +1303,7 @@ class testcaseModel extends model { $case->fromCaseID = $case->id; $case->fromCaseVersion = $case->version; - $case->product = $productID; + $case->product = $productID; if(isset($data->module[$case->id])) $case->module = $data->module[$case->id]; if(isset($data->branch[$case->id])) $case->branch = $data->branch[$case->id]; unset($case->id); @@ -1325,6 +1323,20 @@ class testcaseModel extends model } } + /* If under the project module, the cases is imported need linking to the project. */ + if($this->lang->navGroup->testcase != 'qa') + { + $lastOrder = (int)$this->dao->select('*')->from(TABLE_PROJECTCASE)->where('project')->eq($this->session->PRJ)->orderBy('order_desc')->limit(1)->fetch('order'); + + $this->dao->insert(TABLE_PROJECTCASE) + ->set('project')->eq($case->project) + ->set('product')->eq($case->product) + ->set('case')->eq($caseID) + ->set('version')->eq($case->version) + ->set('order')->eq(++ $lastOrder) + ->exec(); + } + /* Fix bug #1518. */ $oldFiles = zget($libFiles, $libCaseID, array()); foreach($oldFiles as $fileID => $file) @@ -1638,6 +1650,41 @@ class testcaseModel extends model return sprintf($this->lang->testcase->summary, count($cases), $executed); } + /** + * Sync case to project. + * + * @param object $case + * @access public + * @return void + */ + public function syncCase2Project($case) + { + if(!empty($case->story)) + { + $projects = $this->dao->select('project')->from(TABLE_PROJECTSTORY)->where('story')->eq($case->story)->fetchAll('project'); + $projects = array_keys($projects); + } + elseif($this->lang->navGroup->testcase == 'project' and empty($case->story)) + { + $projects = array($this->session->PRJ); + } + + if(!empty($projects)) + { + foreach($projects as $projectID) + { + $lastOrder = (int)$this->dao->select('*')->from(TABLE_PROJECTCASE)->where('project')->eq($projectID)->orderBy('order_desc')->limit(1)->fetch('order'); + $data = new stdclass(); + $data->project = $projectID; + $data->product = $case->product; + $data->case = $caseID; + $data->version = 1; + $data->order = ++ $lastOrder; + $this->dao->insert(TABLE_PROJECTCASE)->data($data)->exec(); + } + } + } + /** * Get status for different method. * diff --git a/module/testcase/view/caseheader.html.php b/module/testcase/view/caseheader.html.php index 48e4229f78..68008aabad 100644 --- a/module/testcase/view/caseheader.html.php +++ b/module/testcase/view/caseheader.html.php @@ -5,11 +5,18 @@
lang->tree->all; - if(!empty($moduleID)) + if($this->app->rawMethod == 'browseunits') { - $removeLink = $browseType == 'bymodule' ? $this->createLink('testcase', 'browse', "productID=$productID&branch=$branch&browseType=$browseType¶m=0&orderBy=$orderBy&recTotal=0&recPerPage={$pager->recPerPage}") : 'javascript:removeCookieByKey("caseModule")'; - echo html::a($removeLink, "", '', "class='text-muted'"); + echo $lang->testtask->unitTag[$browseType]; + } + else + { + echo !empty($moduleID) ? $moduleName : $this->lang->tree->all; + if(!empty($moduleID)) + { + $removeLink = $browseType == 'bymodule' ? $this->createLink('testcase', 'browse', "productID=$productID&branch=$branch&browseType=$browseType¶m=0&orderBy=$orderBy&recTotal=0&recPerPage={$pager->recPerPage}") : 'javascript:removeCookieByKey("caseModule")'; + echo html::a($removeLink, "", '', "class='text-muted'"); + } } ?>
@@ -19,6 +26,7 @@ $hasBrowsePriv = common::hasPriv('testcase', 'browse'); $hasGroupPriv = common::hasPriv('testcase', 'groupcase'); $hasZeroPriv = common::hasPriv('story', 'zerocase'); + $hasUnitPriv = common::hasPriv('testtask', 'browseunits'); ?> createLink('story', 'zeroCase', "productID=$productID&orderBy=id_desc&from={$this->lang->navGroup->testcase}"), "{$lang->story->zeroCase}", '', "class='btn btn-link' id='zerocaseTab'"); } + elseif($hasUnitPriv and $menuType == 'browseunits') + { + echo html::a($this->createLink('testtask', 'browseUnits', "productID=$productID"), "{$lang->testcase->browseUnits}", '', "class='btn btn-link' id='browseunitsTab'"); + } ?> " . $lang->testcase->create, '', "class='btn btn-primary'"); } ?> + app->rawMethod == 'browseunits' and common::canModify('product', $product)):?> + " . $lang->testtask->importUnitResult, '', "class='btn btn-primary'");?> +