214 lines
7.5 KiB
PHP
214 lines
7.5 KiB
PHP
<?php
|
|
/**
|
|
* The model file of case module of ZenTaoPMS.
|
|
*
|
|
* @copyright Copyright 2009-2011 青岛易软天创网络科技有限公司 (QingDao Nature Easy Soft Network Technology Co,LTD www.cnezsoft.com)
|
|
* @license LGPL (http://www.gnu.org/licenses/lgpl.html)
|
|
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
|
* @package case
|
|
* @version $Id$
|
|
* @link http://www.zentao.net
|
|
*/
|
|
?>
|
|
<?php
|
|
class testcaseModel extends model
|
|
{
|
|
/**
|
|
* Set menu.
|
|
*
|
|
* @param array $products
|
|
* @param int $productID
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function setMenu($products, $productID)
|
|
{
|
|
$selectHtml = html::select('productID', $products, $productID, "onchange=\"switchProduct(this.value, 'testcase', 'browse');\"");
|
|
foreach($this->lang->testcase->menu as $key => $menu)
|
|
{
|
|
$replace = ($key == 'product') ? $selectHtml . $this->lang->arrow : $productID;
|
|
common::setMenuVars($this->lang->testcase->menu, $key, $replace);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create a case.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
function create()
|
|
{
|
|
$now = helper::now();
|
|
$case = fixer::input('post')
|
|
->add('openedBy', $this->app->user->account)
|
|
->add('openedDate', $now)
|
|
->add('status', 'normal')
|
|
->add('version', 1)
|
|
->setIF($this->post->story != false, 'storyVersion', $this->loadModel('story')->getVersion($this->post->story))
|
|
->remove('steps,expects,files,labels')
|
|
->setDefault('story', 0)
|
|
->specialChars('title')
|
|
->join('stage', ',')
|
|
->get();
|
|
$this->dao->insert(TABLE_CASE)->data($case)->autoCheck()->batchCheck($this->config->testcase->create->requiredFields, 'notempty')->exec();
|
|
if(!$this->dao->isError())
|
|
{
|
|
$caseID = $this->dao->lastInsertID();
|
|
$this->loadModel('file')->saveUpload('testcase', $caseID);
|
|
foreach($this->post->steps as $stepID => $stepDesc)
|
|
{
|
|
if(empty($stepDesc)) continue;
|
|
$step->case = $caseID;
|
|
$step->version = 1;
|
|
$step->desc = htmlspecialchars($stepDesc);
|
|
$step->expect = htmlspecialchars($this->post->expects[$stepID]);
|
|
$this->dao->insert(TABLE_CASESTEP)->data($step)->autoCheck()->exec();
|
|
}
|
|
return $caseID;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get cases of a module.
|
|
*
|
|
* @param int $productID
|
|
* @param int $moduleIds
|
|
* @param string $orderBy
|
|
* @param object $pager
|
|
* @access public
|
|
* @return array
|
|
*/
|
|
public function getModuleCases($productID, $moduleIds = 0, $orderBy = 'id_desc', $pager = null)
|
|
{
|
|
return $this->dao->select('*')->from(TABLE_CASE)
|
|
->where('product')->eq((int)$productID)
|
|
->beginIF($moduleIds)->andWhere('module')->in($moduleIds)->fi()
|
|
->andWhere('deleted')->eq('0')
|
|
->orderBy($orderBy)->page($pager)->fetchAll();
|
|
}
|
|
|
|
/**
|
|
* Get case info by ID.
|
|
*
|
|
* @param int $caseID
|
|
* @param int $version
|
|
* @access public
|
|
* @return object|bool
|
|
*/
|
|
public function getById($caseID, $version = 0)
|
|
{
|
|
$case = $this->dao->findById($caseID)->from(TABLE_CASE)->fetch();
|
|
if(!$case) return false;
|
|
foreach($case as $key => $value) if(strpos($key, 'Date') !== false and !(int)substr($value, 0, 4)) $case->$key = '';
|
|
if($case->story)
|
|
{
|
|
$story = $this->dao->findById($case->story)->from(TABLE_STORY)->fields('title, status, version')->fetch();
|
|
$case->storyTitle = $story->title;
|
|
$case->storyStatus = $story->status;
|
|
$case->latestStoryVersion = $story->version;
|
|
}
|
|
if($case->linkCase) $case->linkCaseTitles = $this->dao->select('id,title')->from(TABLE_CASE)->where('id')->in($case->linkCase)->fetchPairs();
|
|
if($version == 0) $version = $case->version;
|
|
$case->steps = $this->dao->select('*')->from(TABLE_CASESTEP)->where('`case`')->eq($caseID)->andWhere('version')->eq($version)->fetchAll();
|
|
$case->files = $this->loadModel('file')->getByObject('testcase', $caseID);
|
|
return $case;
|
|
}
|
|
|
|
/**
|
|
* Update a case.
|
|
*
|
|
* @param int $caseID
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function update($caseID)
|
|
{
|
|
$oldCase = $this->getById($caseID);
|
|
$now = helper::now();
|
|
$stepChanged = false;
|
|
$steps = array();
|
|
|
|
//---------------- Judge steps changed or not.-------------------- */
|
|
|
|
/* Remove the empty setps in post. */
|
|
foreach($this->post->steps as $key => $desc)
|
|
{
|
|
$desc = trim($desc);
|
|
if(!empty($desc)) $steps[] = array('desc' => $desc, 'expect' => trim($this->post->expects[$key]));
|
|
}
|
|
|
|
/* If step count changed, case changed. */
|
|
if(count($oldCase->steps) != count($steps))
|
|
{
|
|
$stepChanged = true;
|
|
}
|
|
else
|
|
{
|
|
/* Compare every step. */
|
|
foreach($oldCase->steps as $key => $oldStep)
|
|
{
|
|
if(trim($oldStep->desc) != trim($steps[$key]['desc']) or trim($oldStep->expect) != $steps[$key]['expect'])
|
|
{
|
|
$stepChanged = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
$version = $stepChanged ? $oldCase->version + 1 : $oldCase->version;
|
|
|
|
$case = fixer::input('post')
|
|
->add('lastEditedBy', $this->app->user->account)
|
|
->add('lastEditedDate', $now)
|
|
->add('version', $version)
|
|
->setIF($this->post->story != false and $this->post->story != $oldCase->story, 'storyVersion', $this->loadModel('story')->getVersion($this->post->story))
|
|
->setDefault('story', 0)
|
|
->specialChars('title')
|
|
->join('stage', ',')
|
|
->remove('comment,steps,expects,files,labels')
|
|
->get();
|
|
$this->dao->update(TABLE_CASE)->data($case)->autoCheck()->batchCheck($this->config->testcase->edit->requiredFields, 'notempty')->where('id')->eq((int)$caseID)->exec();
|
|
if(!$this->dao->isError())
|
|
{
|
|
if($stepChanged)
|
|
{
|
|
foreach($this->post->steps as $stepID => $stepDesc)
|
|
{
|
|
if(empty($stepDesc)) continue;
|
|
$step->case = $caseID;
|
|
$step->version = $version;
|
|
$step->desc = htmlspecialchars($stepDesc);
|
|
$step->expect = htmlspecialchars($this->post->expects[$stepID]);
|
|
$this->dao->insert(TABLE_CASESTEP)->data($step)->autoCheck()->exec();
|
|
}
|
|
}
|
|
|
|
/* Join the steps to diff. */
|
|
if($stepChanged)
|
|
{
|
|
$oldCase->steps = $this->joinStep($oldCase->steps);
|
|
$case->steps = $this->joinStep($this->getById($caseID, $version)->steps);
|
|
}
|
|
else
|
|
{
|
|
unset($oldCase->steps);
|
|
}
|
|
return common::createChanges($oldCase, $case);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Join steps to a string, thus can diff them.
|
|
*
|
|
* @param array $steps
|
|
* @access private
|
|
* @return string
|
|
*/
|
|
private function joinStep($steps)
|
|
{
|
|
$retrun = '';
|
|
foreach($steps as $step) $return .= $step->desc . ' EXPECT:' . $step->expect . "\n";
|
|
return $return;
|
|
}
|
|
}
|