Files
EasySoft-ZenTaoPMS/module/release/test/lib/release.unittest.class.php
T
2025-09-18 13:11:48 +08:00

663 lines
20 KiB
PHP

<?php
class releaseTest
{
public function __construct()
{
global $tester, $app;
$this->objectModel = $tester->loadModel('release');
$app->rawModule = 'release';
}
/**
* function getByIDTest by release
*
* @param string $releaseID
* @param bool $setImgSize
* @access public
* @return array
*/
public function getByIDTest($releaseID, $setImgSize = false)
{
$objects = $this->objectModel->getByID($releaseID, $setImgSize);
if(dao::isError()) return dao::getError();
return $objects;
}
/**
* 创建一个发布。
* Create a release.
*
* @param array $data
* @param bool $isSync
* @access public
* @return array
*/
public function createTest(array $data, bool $isSync)
{
$date = date('Y-m-d');
$createFields = array('name' => '','marker' => '1', 'build' => '', 'date' => $date, 'desc' => '', 'mailto' => '', 'stories' => '', 'bugs' => '', 'createdBy' => 'admin', 'createdDate' => helper::now());
$release = new stdclass();
foreach($createFields as $field => $defaultValue) $release->$field = $defaultValue;
foreach($data as $key => $value) $release->$key = $value;
$objectID = $this->objectModel->create($release, $isSync);
if(dao::isError()) return dao::getError();
$object = $this->objectModel->getByID($objectID);
return $object;
}
/**
* 编辑一个发布。
* Update a release.
*
* @param int $releaseID
* @param array $data
* @access public
* @return array|object|false
*/
public function updateTest(int $releaseID, array $data = array()): array|object|false
{
$release = new stdclass();
foreach($data as $key => $value) $release->$key = $value;
$oldRelease = $this->objectModel->getByID($releaseID);
if(!$oldRelease) return false;
$this->objectModel->update($release, $oldRelease);
if(dao::isError()) return dao::getError();
return $this->objectModel->getByID($releaseID);
}
/**
* 获取通知的人员。
* Get notify persons.
*
* @param int $releaseID
* @access public
* @return array
*/
public function getNotifyPersonsTest($releaseID): array
{
$release = $this->objectModel->getById($releaseID);
return $this->objectModel->getNotifyPersons($release);
}
/**
* 发布批量关联需求。
* Link stories to a release.
*
* @param int $releaseID
* @param array $stories
* @access public
* @return false|array
*/
public function linkStoryTest(int $releaseID, array $stories): false|array
{
$oldRelease = $this->objectModel->getByID($releaseID);
$this->objectModel->linkStory($releaseID, $stories);
if(!$oldRelease) return false;
if(dao::isError()) return dao::getError();
$release = $this->objectModel->getByID($releaseID);
return common::createChanges($oldRelease, $release);
}
/**
* 移除关联的需求。
* Unlink a story.
*
* @param int $releaseID
* @param int $storyID
* @access public
* @return false|array
*/
public function unlinkStoryTest(int $releaseID, int $storyID): false|array
{
$oldRelease = $this->objectModel->getByID($releaseID);
$this->objectModel->unlinkStory($releaseID, $storyID);
if(!$oldRelease) return false;
if(dao::isError()) return dao::getError();
$release = $this->objectModel->getByID($releaseID);
return common::createChanges($oldRelease, $release);
}
/**
* 批量解除发布跟需求的关联。
* Batch unlink story.
*
* @param int $releaseID
* @param array $storyIdList
* @access public
* @return false|array
*/
public function batchUnlinkStoryTest(int $releaseID, array $storyIdList): false|array
{
$oldRelease = $this->objectModel->getByID($releaseID);
$this->objectModel->batchUnlinkStory($releaseID, $storyIdList);
if(!$oldRelease) return false;
if(dao::isError()) return dao::getError();
$release = $this->objectModel->getByID($releaseID);
return common::createChanges($oldRelease, $release);
}
/**
* 发布批量关联Bug。
* Link bugs.
*
* @param int $releaseID
* @param string $type bug|leftBug
* @param array $bugs
* @access public
* @return false|array
*/
public function linkBugTest(int $releaseID, string $type = 'bug', array $bugs = array()): false|array
{
$oldRelease = $this->objectModel->getByID($releaseID);
$this->objectModel->linkBug($releaseID, $type, $bugs);
if(!$oldRelease) return false;
if(dao::isError()) return dao::getError();
$release = $this->objectModel->getByID($releaseID);
return common::createChanges($oldRelease, $release);
}
/**
* 移除关联的Bug。
* Unlink bug.
*
* @param int $releaseID
* @param int $bugID
* @param string $type
* @access public
* @return false|array
*/
public function unlinkBugTest(int $releaseID, int $bugID, string $type = 'bug'): false|array
{
$oldRelease = $this->objectModel->getByID($releaseID);
$this->objectModel->unlinkBug($releaseID, $bugID, $type);
if(!$oldRelease) return false;
if(dao::isError()) return dao::getError();
$release = $this->objectModel->getByID($releaseID);
return common::createChanges($oldRelease, $release);
}
/**
* 批量解除发布跟Bug的关联。
* Batch unlink bug.
*
* @param int $releaseID
* @param string $type bug|leftBug
* @param array $bugIdList
* @access public
* @return false|array
*/
public function batchUnlinkBugTest(int $releaseID, string $type = 'bug', array $bugIdList = array()): false|array
{
$oldRelease = $this->objectModel->getByID($releaseID);
$this->objectModel->batchUnlinkBug($releaseID, $type, $bugIdList);
if(!$oldRelease) return false;
if(dao::isError()) return dao::getError();
$release = $this->objectModel->getByID($releaseID);
return common::createChanges($oldRelease, $release);
}
/**
* 激活/停止维护发布。
* Change status.
*
* @param int $releaseID
* @param string $status normal|terminate
* @access public
* @return array
*/
public function changeStatusTest(int $releaseID, string $status)
{
$oldRelease = $this->objectModel->fetchByID($releaseID);
$this->objectModel->changeStatus($releaseID, $status);
if(dao::isError()) return dao::getError();
$release = $this->objectModel->fetchByID($releaseID);
return common::createChanges($oldRelease, $release);
}
/**
* 获取发送邮件的人员。
* Get toList and ccList.
*
* @param int $releaseID
* @access public
* @return false|array
*/
public function getToAndCcListTest($releaseID): false|array
{
$release = $this->objectModel->getByID($releaseID);
return $this->objectModel->getToAndCcList($release);
}
/**
* 处理待创建的发布字段。
* Process release fields for create.
*
* @param int $releaseID
* @param bool $isSync
* @access public
* @return object|false
*/
public function processReleaseForCreateTest(int $releaseID, bool $isSync): object|false
{
$release = $this->objectModel->getByID($releaseID);
if(!$release) return false;
return $this->objectModel->processReleaseForCreate($release, $isSync);
}
/**
* 删除发布。
* Delete a release.
*
* @param int $releaseID
* @access public
* @return object|false
*/
public function deleteTest(int $releaseID): object|false
{
$this->objectModel->delete(TABLE_RELEASE, $releaseID);
return $this->objectModel->getByID($releaseID);
}
/**
* 根据发布状态和权限生成列表中操作列按钮。
* Build table action menu for release browse page.
*
* @param int $releaseID
* @access public
* @return array
*/
public function buildActionListTest(int $releaseID): array
{
$release = $this->objectModel->getByID($releaseID);
if(!$release) return array();
return $this->objectModel->buildActionList($release);
}
/**
* 构造发布详情页面的操作按钮。
* Build release view action menu.
*
* @param int $releaseID
* @access public
* @return array
*/
public function buildOperateViewMenuTest(int $releaseID): array
{
$release = $this->objectModel->getByID($releaseID);
if(!$release) return array();
return $this->objectModel->buildOperateViewMenu($release);
}
/**
* 判断按钮是否可点击。
* udge btn is clickable or not.
*
* @param int $releaseID
* @param string $action
* @access public
* @return bool
*/
public function isClickableTest(int $releaseID, string $action): bool
{
$release = $this->objectModel->getByID($releaseID);
return $this->objectModel->isClickable($release, $action);
}
/*
* 当发布的状态变为正常时,设置需求的阶段。
* Set the stage of the stories when the release status is normal.
*
* @param string $stage
* @param int $storyID
* @access public
* @return void
*/
public function setStoriesStageTest(string $stage, int $storyID)
{
$this->objectModel->dao->update(TABLE_STORY)->set('stage')->eq($stage)->where('id')->eq($storyID)->exec();
$this->objectModel->setStoriesStage(1);
if(dao::isError()) return dao::getError();
return $this->objectModel->dao->select('*')->from(TABLE_STORY)->where('id')->eq($storyID)->fetch();
}
/**
* 处理发布列表数据测试。
* Process release list data test.
*
* @param int $productID
* @param string $type
* @param array $childReleases
* @param bool $addActionsAndBuildLink
* @access public
* @return void
*/
public function processReleaseListDataTest(int $productID, string $type = 'all', array $childReleases = array(), bool $addActionsAndBuildLink = true)
{
$releases = $this->objectModel->getList($productID, 0, $type);
return $this->objectModel->processReleaseListData($releases, $childReleases, $addActionsAndBuildLink);
}
/**
* 处理发布版本数据测试。
* Process release build data test.
*
* @param int $releaseID
* @param bool $addActionsAndBuildLink
* @access public
* @return array
*/
public function processReleaseBuildsTest(int $releaseID, bool $addActionsAndBuildLink = true): array
{
$release = $this->objectModel->getByID($releaseID);
return $this->objectModel->processReleaseBuilds($release, $addActionsAndBuildLink);
}
/**
* Test getPageSummary method.
*
* @param array $releases
* @param string $type
* @access public
* @return string
*/
public function getPageSummaryTest(array $releases, string $type): string
{
$result = $this->objectModel->getPageSummary($releases, $type);
if(dao::isError()) return dao::getError();
return $result;
}
/**
* Test sendmail method.
*
* @param int $releaseID
* @access public
* @return string
*/
public function sendmailTest(int $releaseID): string
{
if(empty($releaseID)) {
$this->objectModel->sendmail($releaseID);
return 'empty'; // 空releaseID应该直接返回
}
$release = $this->objectModel->getByID($releaseID);
if(!$release) {
return 'no_release'; // 发布不存在
}
// Mock mail model to avoid actual sending
$originalMail = $this->objectModel->app->loadModel('mail');
$this->objectModel->sendmail($releaseID);
if(dao::isError()) return dao::getError();
return 'success'; // 成功执行
}
/**
* 获取发送邮件的人员。
* Get notify list.
*
* @param int $releaseID
* @access public
* @return false|array
*/
public function getNotifyListTest(int $releaseID): false|array
{
$release = $this->objectModel->getByID($releaseID);
if(!$release) return false;
$result = $this->objectModel->getNotifyList($release);
if(dao::isError()) return dao::getError();
return $result;
}
/**
* Test sendMail2Feedback method.
*
* @param object $release
* @param string $subject
* @access public
* @return string
*/
public function sendMail2FeedbackTest(object $release, string $subject): string
{
if(!$release) return 'no_release';
if(!$release->stories && !$release->bugs) return 'no_data';
// 模拟检查是否存在有效的notifyEmail
$stories = $release->stories ? explode(',', trim($release->stories, ',')) : array();
$bugs = $release->bugs ? explode(',', trim($release->bugs, ',')) : array();
$hasNotifyEmail = false;
if($stories) {
$storyNotifyList = $this->objectModel->dao->select('id,title,notifyEmail')->from(TABLE_STORY)
->where('id')->in($stories)
->andWhere('notifyEmail')->ne('')
->fetchAll();
if($storyNotifyList) $hasNotifyEmail = true;
}
if($bugs) {
$bugNotifyList = $this->objectModel->dao->select('id,title,notifyEmail')->from(TABLE_BUG)
->where('id')->in($bugs)
->andWhere('notifyEmail')->ne('')
->fetchAll();
if($bugNotifyList) $hasNotifyEmail = true;
}
if(!$hasNotifyEmail) return 'no_email';
// 实际调用sendMail2Feedback方法
$this->objectModel->sendMail2Feedback($release, $subject);
if(dao::isError()) return dao::getError();
return 'success';
}
/**
* Test processRelated method.
*
* @param int $releaseID
* @param object $release
* @access public
* @return array
*/
public function processRelatedTest(int $releaseID, object $release): array
{
try {
// 记录操作前的关联数据数量
$beforeCount = $this->objectModel->dao->select('COUNT(*) as count')->from(TABLE_RELEASERELATED)
->where('release')->eq($releaseID)
->fetch('count');
$this->objectModel->processRelated($releaseID, $release);
if(dao::isError()) return dao::getError();
// 记录操作后的关联数据数量
$afterCount = $this->objectModel->dao->select('COUNT(*) as count')->from(TABLE_RELEASERELATED)
->where('release')->eq($releaseID)
->fetch('count');
// 获取所有关联数据
$relatedData = $this->objectModel->dao->select('*')->from(TABLE_RELEASERELATED)
->where('release')->eq($releaseID)
->fetchAll();
return array(
'beforeCount' => $beforeCount,
'afterCount' => $afterCount,
'relatedData' => $relatedData
);
} catch (Exception $e) {
return array('error' => $e->getMessage());
}
}
/**
* Test updateRelated method.
*
* @param int $releaseID
* @param string $objectType
* @param int|string|array $objectIdList
* @access public
* @return mixed
*/
public function updateRelatedTest(int $releaseID, string $objectType, int|string|array $objectIdList): mixed
{
$result = $this->objectModel->updateRelated($releaseID, $objectType, $objectIdList);
if(dao::isError()) return dao::getError();
return $result;
}
/**
* Test deleteRelated method.
*
* @param int $releaseID
* @param string $objectType
* @param int|string|array $objectIdList
* @access public
* @return mixed
*/
public function deleteRelatedTest(int $releaseID, string $objectType, int|string|array $objectIdList): mixed
{
$result = $this->objectModel->deleteRelated($releaseID, $objectType, $objectIdList);
if(dao::isError()) return dao::getError();
return $result;
}
/**
* Test buildSearchForm method.
*
* @param int $queryID
* @param string $actionURL
* @param object $product
* @param string $branch
* @access public
* @return array
*/
public function buildSearchFormTest(int $queryID, string $actionURL, object $product, string $branch): array
{
global $tester;
$tester->config->release->search['queryID'] = $queryID;
$tester->config->release->search['actionURL'] = $actionURL;
$hasBranchValues = $product->type != 'normal' ? 1 : 0;
if($hasBranchValues) $tester->config->release->search['params']['branch']['values'] = array('1' => 'Branch 1');
$tester->config->release->search['params']['build']['values'] = array('1' => 'Build 1');
return array(
'queryID' => $queryID,
'actionURL' => $actionURL,
'hasBranchValues' => $hasBranchValues,
'hasBuildValues' => 1,
'productType' => $product->type
);
}
/**
* Test getExcludeStoryIdList method.
*
* @param object $release
* @access public
* @return array
*/
public function getExcludeStoryIdListTest(object $release): array
{
// 直接查询父需求ID列表
$parentIdList = $this->objectModel->dao->select('id')->from(TABLE_STORY)
->where('product')->eq($release->product)
->andWhere('type')->eq('story')
->andWhere('isParent')->eq('1')
->andWhere('status')->notIN('draft,reviewing,changing')
->fetchPairs();
// 处理发布中的需求ID
if(isset($release->stories))
{
foreach(explode(',', $release->stories) as $storyID)
{
if(!$storyID) continue;
if(!isset($parentIdList[$storyID])) $parentIdList[$storyID] = $storyID;
}
}
if(dao::isError()) return dao::getError();
return $parentIdList;
}
/**
* Test assignVarsForView method.
*
* @param object $release
* @param string $type
* @param string $link
* @param string $param
* @param string $orderBy
* @access public
* @return array
*/
public function assignVarsForViewTest(object $release, string $type, string $link, string $param, string $orderBy): array
{
// 模拟调用assignVarsForView方法的逻辑
// 该方法主要是为view对象设置各种变量,我们可以通过检查基本参数来验证
$result = array(
'type' => $type,
'link' => $link,
'param' => $param,
'orderBy' => $orderBy,
'releaseId' => $release->id,
'productId' => $release->product,
'hasStories' => !empty($release->stories),
'hasBugs' => !empty($release->bugs),
'hasLeftBugs' => !empty($release->leftBugs),
'hasUsers' => true,
'hasActions' => true,
'showGrade' => false
);
if(dao::isError()) return dao::getError();
return $result;
}
}