synergy/server/controller/CaseCtrl.php (219 lines of code) (raw):
<?php
namespace Synergy\Controller;
use Exception;
use Synergy\App\Synergy;
use Synergy\DB\CaseDAO;
use Synergy\DB\SpecificationDAO;
use Synergy\DB\SuiteDAO;
use Synergy\Interfaces\Observer;
use Synergy\Model\TestCase;
use Synergy\Model\TestCaseImage;
use Synergy\DB\DB_DAO;
/**
* Description of CaseCtrl
*
* @author lada
*/
class CaseCtrl extends ExtensionCtrl implements Observer {
private $caseDao;
private $specificationDao;
private $suiteDao;
private $suiteCtrl;
function __construct() {
parent::__construct('testcase');
$this->caseDao = new CaseDAO();
$this->specificationDao = new SpecificationDAO();
$this->suiteDao = new SuiteDAO();
}
public function getSuiteCtrl() {
if (is_null($this->suiteCtrl)) {
$this->suiteCtrl = new SuiteCtrl();
}
return $this->suiteCtrl;
}
/**
* for tests only
* @return Bug|Array
*/
public function getIssuesForCase($caseId) {
return $this->caseDao->getIssues($caseId);
}
/**
* for tests only
* @return Bug|Array
*/
public function getLabelsForCase($caseId) {
return $this->caseDao->getLabels($caseId);
}
/**
* for tests only
* @return Bug|Array
*/
public function getImagesForCase($caseId) {
return $this->caseDao->getImages($caseId);
}
/**
* Returns test case for the given ID in perspective of suite with given suite ID
* @param int $id case ID
* @param int $suiteId suite ID where the case belongs
* @return TestCase
*/
public function getCase($id, $suiteId) {
if ($suiteId > 0) {
$spec = $this->specificationDao->getSpecificationTitleIdBySuiteId($suiteId);
$projectCtrl = new ProjectCtrl();
$projects = $projectCtrl->getProjectsForSpecification($spec[1]);
$bugTracking = "other";
if (count($projects) > 0) {
$bugTracking = $projects[0]->bugTrackingSystem;
}
$case = $this->caseDao->getCaseForSuite($id, $suiteId);
if (is_null($case)) {
return null;
}
$case->issues = $this->caseDao->getIssues($id);
try {
for ($i = 0, $max = count($case->issues); $i < $max; $i++) {
$issueCtrl = Synergy::getProvider("issue_" . $bugTracking);
$issue = $issueCtrl->getIssue($case->issues[$i]->bugId, true);
$issue->id = $case->issues[$i]->id;
if (!is_null($issue)) {
$case->issues[$i] = $issue;
}
}
} catch (Exception $e) {
}
$case->images = $this->caseDao->getImages($id);
$case->suiteTitle = $this->suiteDao->getSuiteTitle($suiteId);
$case->specificationTitle = $spec[0];
$case->version = $spec[2];
$case->specificationId = $spec[1];
return parent::get($case);
} else {
$case = $this->caseDao->getCase($id);
if (is_null($case)) {
return null;
}
$case->issues = $this->caseDao->getIssues($id);
$case->images = $this->caseDao->getImages($id);
return parent::get($case);
}
}
/**
* Returns test cases that have given label. Results are paginated and page parameter is used to limit results. Page size is LABEL_PAGE
* @param string $label
* @param int $page page number, first page is 1
* @return TestCase[]
*/
public function getCasesByFilter($label, $page) {
return parent::get($this->caseDao->getCasesByFilter($label, $page));
}
/**
* Edit particular test case. If suite with $suiteId is the only one that has
* this case, the case is updated. Otherwise cases is clonned, updated and reference
* to the new case replaces reference to the old one in suite_has_case
* @param TestCase $testCase test case
* @param int $mode 1 if simply update case, 0 if safely create new case for this suite
*/
public function updateCase($testCase, $mode) {
if ($mode === 1) {
// simply edit
if ($testCase->duration === $testCase->originalDuration) {
$this->caseDao->edit($testCase->id, $testCase->title, $testCase->steps, $testCase->result, $testCase->order);
} else {
$this->caseDao->editWithDuration($testCase->id, $testCase->title, $testCase->steps, $testCase->result, $testCase->duration, $testCase->order);
}
parent::edit($testCase);
return true;
} else {
if ($this->suiteDao->onlySuiteHasCase($testCase->id, $testCase->suiteId)) {
return $this->updateCase($testCase, 1);
} else {
$newId = $this->createDuplicitCase($testCase);
$p = $this->caseDao->cloneLabels($testCase->id, $newId);
$p2 = $this->caseDao->cloneIssues($testCase->id, $newId);
DB_DAO::executeQuery($p.$p2);
$this->caseDao->cloneImages($testCase->id, $newId);
$this->removeCaseFromSuite($testCase->suiteId, $testCase->id);
return true;
}
}
}
public static function on($name, $data) {
}
/**
* Adds issue to the given case
* @param int $bugId bug ID
* @param int $caseId case ID
* @return boolean true on success
*/
public function addIssue($bugId, $caseId) {
return $this->caseDao->addIssue($bugId, $caseId);
}
/**
* Removes issue to the given case
* @param int $bugId bug ID
* @param int $caseId case ID
* @return boolean true on success
*/
public function removeIssue($bugId, $caseId) {
return $this->caseDao->removeIssue($bugId, $caseId);
}
/**
* Adds label to the given case
* @param string $label label
* @param int $caseId case ID
* @return boolean true on success
*/
public function addLabel($label, $caseId) {
$kid = $this->createGetKeyword($label);
if (!$this->caseHasLabel($kid, $caseId)) {
return $this->caseDao->addLabel($label, $caseId, $kid);
}
return true;
}
/**
* Returns ID of given label. If the label does not exist, it is created
* @param string $label label
* @return int ID of label
*/
public function createGetKeyword($label) {
$id = $this->caseDao->getKeywordId($label);
if ($id < 0) {
$id = $this->caseDao->createKeyword($label);
}
return $id;
}
/**
* Removes label to the given case
* @param string $label label
* @param int $caseId case ID
* @return boolean true on success
*/
public function removelabel($label, $caseId) {
$kid = $this->createGetKeyword($label);
return $this->caseDao->removelabel($label, $caseId, $kid);
}
/**
* Creates new test case
* @param TestCase $testCase test case
* @return int new case ID
*/
public function createCase($testCase) {
$caseId = $this->caseDao->createCase($testCase->title, $testCase->steps, $testCase->result, $testCase->duration, $testCase->order);
Mediator::emit("caseCreated", $caseId);
$this->suiteDao->addCaseToSuite($caseId, $testCase->suiteId);
parent::create($testCase, $caseId);
return $caseId;
}
/**
* Clones given test case
* @param TestCase $testCase test case
* @return int new case ID
*/
public function createDuplicitCase($testCase) {
$caseId = $this->caseDao->createDuplicitCase($testCase->title, $testCase->steps, $testCase->result, $testCase->duration, $testCase->order);
$this->suiteDao->addCaseToSuite($caseId, $testCase->suiteId);
parent::create($testCase, $caseId);
return $caseId;
}
/**
* Removes case from test suite
* @param int $suiteId suite ID
* @param int $caseId case ID
* @return boolean true on success
*/
public function removeCaseFromSuite($suiteId, $caseId) {
$result = $this->caseDao->removeCaseFromSuite($suiteId, $caseId);
if ($result) {
$ctrl = $this->getSuiteCtrl();
Mediator::emit("specificationUpdated", $ctrl->getSpecificationId($suiteId));
}
return $result;
}
/**
* Returns cases by their title (LIKE title)
* @param string $title title
* @return TestCase[]
*/
public function findMatchingCases($title) {
return parent::get($this->caseDao->findMatchingCases($title));
}
/**
* Returns case's duration in minutes
* @param int $c_id case ID
* @return int duration of given case
*/
public function getCasesDuration($c_id) {
return $this->caseDao->getCasesDuration($c_id);
}
/**
* Updates case's duration
* @param int $id case ID
* @param int $duration duration in minutes
* @return boolean true on success
*/
public function updateDuration($id, $duration) {
return $this->caseDao->updateDuration($id, intval($duration));
}
/**
* Saves record about image to database
* @param int $id case ID
* @param string $name image file name
* @param string $title image title
* @return boolean true on success
*/
public function saveImage($id, $name, $title) {
return $this->caseDao->saveImage($id, $name, $title);
}
/**
* Removes image and if the file is not used in other run, deletes file as well
* @param int $id image ID
* @return boolean true on success
*/
public function deleteImage($id) {
$path = $this->caseDao->getImageAttachment($id);
if (strlen($path) < 1)
return false;
$this->caseDao->deleteImage($id);
if ($this->caseDao->usedInCasesCount($path) === 0) {
TestCaseImage::deleteFile($path);
}
return true;
}
/**
* Returns all cases with detailed information for suite with given ID
* @param int $id suite ID
* @return TestCase[]
*/
public function getTestCasesDetailed($id, $label = '', $bugTrackingSystem) {
if (strlen($label) > 0) {
$cases = $this->suiteDao->getTestCasesDetailedByLabel($id, $label);
} else {
$cases = $this->suiteDao->getTestCasesDetailed($id);
}
$issueCtrl = Synergy::getProvider("issue_" . $bugTrackingSystem);
for ($index = 0, $max = count($cases); $index < $max; $index++) {
$case = $cases[$index];
$case->images = $this->caseDao->getImages($case->id);
$case->issues = $this->caseDao->getIssues($case->id);
try {
for ($i = 0, $max2 = count($case->issues); $i < $max2; $i++) {
$issue = $issueCtrl->getIssue($case->issues[$i]->bugId, true);
if (!is_null($issue))
$case->issues[$i] = $issue;
}
} catch (Exception $e) {
}
$cases[$index] = $case;
}
return parent::get($cases);
}
/**
* Goes through all cases that are not in any suite and removes them
*/
public function removeUnusedCases() {
$unusedIds = $this->caseDao->getUnusedCases();
for ($i = 0, $max = count($unusedIds); $i < $max; $i++) {
$this->removeCase($unusedIds[$i]);
}
}
/**
* Removes case (+ all references in issues, labels, images...)
* @param type $caseId
*/
public function removeCase($caseId) {
// bug
$this->caseDao->removeIssuesForCase($caseId);
// case_has_keyword
$this->caseDao->removeLabelsForCase($caseId);
// case_image
$allImages = $this->caseDao->getImages($caseId);
for ($i = 0, $max = count($allImages); $i < $max; $i++) {
$this->deleteImage($allImages[$i]->id);
}
// case
$this->caseDao->removeCase($caseId);
}
/**
* Returns true if given case is in specification that is used (exists assignment progress for given specification)
* @param type $caseId
* @return type
*/
public function isCaseInUsedSpecification($caseId) {
return $this->caseDao->isCaseInUsedSpecification($caseId);
}
public function caseHasLabel($labelId, $caseId) {
return $this->caseDao->caseHasLabel($labelId, $caseId);
}
}
?>