dao->findByID((int)$sceneID - CHANGEVALUE)->from(TABLE_SCENE)->fetch('title'); } /** * 插入用例的步骤。 * Insert the steps of the case. * * @param int $caseID * @param array $steps * @param array $expects * @param array $stepTypes * @access protected * @return void */ protected function insertSteps(int $caseID, array $steps, array $expects, array $stepTypes) { $preGrade = 0; $parentStepID = $grandPaStepID = 0; foreach($steps as $stepKey => $stepDesc) { /* 跳过步骤描述为空的步骤。 */ /* If step desc is empty, skip it. */ if(empty($stepDesc)) continue; /* 计算步骤类型和层级。 */ /* Set step type and step grade. */ $stepType = $stepTypes[$stepKey]; $grade = substr_count((string)$stepKey, '.'); /* 如果当前步骤层级为0,父ID和祖父ID清0。 */ /* If step grade is zero, set parent step id and grand step id to zero. */ if($grade == 0) { $parentStepID = $grandPaStepID = 0; } /* 如果前一个步骤的层级比当前步骤的层级大,将父ID设置为祖父ID,祖父ID清0。 */ /* If previous step grade is greater than current step grade, set parent step id to grand step id, and set grand step id to zero. */ elseif($preGrade > $grade) { $parentStepID = $grandPaStepID; $grandPaStepID = 0; } /* 构建步骤数据,插入步骤。 */ /* Build step data, and insert it. */ $step = new stdClass(); $step->type = $stepType; $step->parent = $parentStepID; $step->case = $caseID; $step->version = 1; $step->desc = rtrim(htmlSpecialString($stepDesc)); $step->expect = $stepType == 'group' ? '' : rtrim(htmlSpecialString(zget($expects, $stepKey, ''))); $this->dao->insert(TABLE_CASESTEP)->data($step) ->autoCheck() ->exec(); /* 如果步骤类型是group,将祖父ID设置为父ID,父ID设置为当前步骤ID。 */ /* If step type is group, set grand step id to parent step id and set parent step id to current step id. */ if($stepType == 'group') { $grandPaStepID = $parentStepID; $parentStepID = $this->dao->lastInsertID(); } $preGrade = $grade; } } /** * 获取用例步骤。 * Get case steps. * * @param int $caseID * @param int $version * @access protected * @return void */ protected function getSteps(int $caseID, int $version) { $caseSteps = array(); $steps = $this->dao->select('*')->from(TABLE_CASESTEP)->where('`case`')->eq($caseID)->andWhere('version')->eq($version)->orderBy('id')->fetchAll('id'); $preGrade = 1; $parentSteps = array(); $key = array(0, 0, 0); foreach($steps as $step) { $parentSteps[$step->id] = $step->parent; $grade = 1; if(isset($parentSteps[$step->parent])) $grade = isset($parentSteps[$parentSteps[$step->parent]]) ? 3 : 2; if($grade > $preGrade) { $key[$grade - 1] = 1; } else { if($grade < $preGrade) { if($grade < 2) $key[1] = 0; if($grade < 3) $key[2] = 0; } $key[$grade - 1] ++; } $name = implode('.', $key); $name = str_replace('.0', '', $name); $data = new stdclass(); $data->name = str_replace('.0', '', $name); $data->id = $step->id; $data->step = $step->desc; $data->desc = $step->desc; $data->expect = $step->expect; $data->type = $step->type; $data->parent = $step->parent; $data->grade = $grade; $caseSteps[] = $data; $preGrade = $grade; } } /* * Deal with the relationship between the case and project when edit the case. * * @param object $oldCase * @param object $case * @access public * @return void */ protected function updateCase2Project($oldCase, $case) { $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('`case`')->eq($oldCase->id) ->exec(); } /* The related story is changed. */ if($storyChanged) { /* If the new related story isn't linked the project, unlink the case. */ $projects = $this->dao->select('project')->from(TABLE_PROJECTSTORY)->where('story')->eq($oldCase->story)->fetchAll('project'); $projectIdList = array_keys($projects); $this->dao->delete()->from(TABLE_PROJECTCASE) ->where('project')->in() ->andWhere('`case`')->eq($oldCase->id) ->exec(); /* If the new related story is not null, make the case link the project which link the new related story. */ if(!empty($case->story)) { $projects = $this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('story')->eq($case->story)->fetchAll('project'); if($projects) { $projects = array_keys($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 = $oldCase->id; $data->version = $oldCase->version; $data->order = ++ $lastOrder; $this->dao->replace(TABLE_PROJECTCASE)->data($data)->exec(); } } } } } protected function updateStep(object $case, object $oldCase): bool { if($oldCase->lib && empty($oldCase->product)) { $fromcaseVersion = $this->dao->select('fromCaseVersion')->from(TABLE_CASE)->where('fromCaseID')->eq($caseID)->fetch('fromCaseVersion'); $fromcaseVersion = (int)$fromcaseVersion + 1; $this->dao->update(TABLE_CASE)->set('`fromCaseVersion`')->eq($fromcaseVersion)->where('`fromCaseID`')->eq($caseID)->exec(); } /* Ignore steps when post has no steps. */ if($case->steps) { $this->insertSteps($case->id, $case->steps, $case->expects, (array)$case->stepType); } else { foreach($oldCase->steps as $step) { unset($step->id); $step->version = $version; $this->dao->insert(TABLE_CASESTEP)->data($step)->autoCheck()->exec(); } } return !dao::isError(); } protected function linkBugs($linkedBugs, $case): bool { $toLinkBugs = $case->linkBug; $newBugs = array_diff($toLinkBugs, $linkedBugs); $removeBugs = array_diff($linkedBugs, $toLinkBugs); foreach($newBugs as $bugID) $this->dao->update(TABLE_BUG)->set('`case`')->eq($caseID)->set('caseVersion')->eq($case->version)->set('`story`')->eq($case->story)->set('storyVersion')->eq($case->storyVersion)->where('id')->eq($bugID)->exec(); foreach($removeBugs as $bugID) $this->dao->update(TABLE_BUG)->set('`case`')->eq(0)->set('caseVersion')->eq(0)->set('`story`')->eq(0)->set('storyVersion')->eq(0)->where('id')->eq($bugID)->exec(); return !dao::isError(); } protected function unlinkCaseFromTesttask($caseID, $testtasks): bool { $this->loadModel('action'); foreach($testtasks as $taskID => $testtask) { if($testtask->branch != $case->branch && $taskID) { $this->dao->delete()->from(TABLE_TESTRUN)->where('task')->eq($taskID)->andWhere('`case`')->eq($caseID)->exec(); $this->action->create('case' ,$caseID, 'unlinkedfromtesttask', '', $taskID); } } } }