Files
EasySoft-ZenTaoPMS/module/testcase/tao.php
T
2023-08-25 03:35:53 +00:00

246 lines
9.0 KiB
PHP

<?php
declare(strict_types=1);
class testcaseTao extends testcaseModel
{
/**
* Fetch scene name.
*
* @param int $sceneID
* @access protected
* @return void
*/
protected function fetchSceneName(int $sceneID): string|null
{
return $this->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);
}
}
}
}