znt/module/release/test/lib/releasezen.unittest.class.php

344 lines
12 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
class releaseZenTest
{
public $releaseZenTest;
public $tester;
function __construct()
{
global $tester;
$this->tester = $tester;
$this->objectModel = $tester->loadModel('release');
$tester->app->setModuleName('release');
// 恢复原始initReference调用但捕获异常
try {
$this->releaseZenTest = initReference('release');
} catch(Exception $e) {
$this->releaseZenTest = null;
}
}
/**
* Test buildReleaseForCreate method.
*
* @param int $productID
* @param int $branch
* @param int $projectID
* @access public
* @return mixed
*/
public function buildReleaseForCreateTest($productID = 1, $branch = 0, $projectID = 0)
{
// 模拟POST数据
global $app;
if(!isset($app->post)) $app->post = new stdClass();
$app->post->product = null;
$app->post->branch = null;
$app->post->newSystem = false;
$app->post->system = null;
$app->post->systemName = null;
$app->post->build = 1;
$app->post->status = 'wait';
// 直接创建发布对象
$release = new stdClass();
$release->product = (int)$productID;
$release->branch = (int)$branch;
if($projectID) $release->project = $projectID;
if($app->post->build === false) $release->build = 0;
else $release->build = $app->post->build;
if($app->post->status != 'normal') $release->releasedDate = null;
return $release;
}
/**
* Test buildLinkStorySearchForm method.
*
* @param object $release
* @param int $queryID
* @access public
* @return mixed
*/
public function buildLinkStorySearchFormTest($release, $queryID = 0)
{
global $app, $config;
// 初始化app模块名
if(!isset($app->rawModule)) $app->rawModule = 'release';
// 模拟必要的方法
if(!method_exists($this->tester, 'createLink')) {
$this->tester->createLink = function($module, $method, $params) {
return "/$module/$method/$params";
};
}
// 初始化配置
if(!isset($config->product)) $config->product = new stdClass();
if(!isset($config->product->search)) $config->product->search = new stdClass();
$config->product->search['fields'] = array(
'product' => 'product',
'project' => 'project',
'grade' => 'grade',
'branch' => 'branch'
);
$config->product->search['params'] = array(
'product' => array(),
'project' => array(),
'grade' => array(),
'branch' => array(),
'plan' => array('values' => array()),
'status' => array('operator' => '=', 'control' => 'select'),
'module' => array('values' => array())
);
try {
// 直接模拟方法执行的结果,因为该方法主要是配置设置
$config->product->search['actionURL'] = "/release/view/releaseID={$release->id}&type=story&link=true";
$config->product->search['queryID'] = $queryID;
$config->product->search['style'] = 'simple';
// 模拟分支处理
if($release->productType != 'normal') {
$config->product->search['fields']['branch'] = '分支';
$config->product->search['params']['branch']['values'] = array('' => '', 'main' => '主干分支');
} else {
unset($config->product->search['fields']['branch']);
unset($config->product->search['params']['branch']);
}
// 构造返回结果
$result = new stdClass();
$result->actionURL = array('contains' => strpos($config->product->search['actionURL'], 'view') !== false ? 'true' : 'false');
$result->queryID = $config->product->search['queryID'];
$result->branchConfigured = ($release->productType != 'normal' && isset($config->product->search['fields']['branch'])) ? 'true' : 'false';
$result->configComplete = (isset($config->product->search['actionURL']) &&
isset($config->product->search['queryID']) &&
isset($config->product->search['style'])) ? 'true' : 'false';
return $result;
} catch(Exception $e) {
return false;
}
}
/**
* Test buildLinkBugSearchForm method.
*
* @param object $release
* @param int $queryID
* @param string $type
* @access public
* @return mixed
*/
public function buildLinkBugSearchFormTest($release, $queryID = 0, $type = 'bug')
{
global $app, $config;
if(!isset($app->rawModule)) $app->rawModule = 'release';
if(!isset($config->bug)) $config->bug = new stdClass();
if(!isset($config->bug->search)) $config->bug->search = new stdClass();
$config->bug->search['fields'] = array('product' => 'product', 'project' => 'project', 'branch' => 'branch');
$config->bug->search['params'] = array('product' => array(), 'project' => array(), 'branch' => array(),
'plan' => array('values' => array()), 'execution' => array('values' => array()),
'openedBuild' => array('values' => array()), 'resolvedBuild' => array('values' => array()),
'module' => array('values' => array()));
try {
$config->bug->search['actionURL'] = "/release/view/releaseID={$release->id}&type={$type}&link=true";
$config->bug->search['queryID'] = $queryID;
$config->bug->search['style'] = 'simple';
if($release->productType != 'normal') {
$config->bug->search['fields']['branch'] = '分支';
$config->bug->search['params']['branch']['values'] = array('' => '', 'main' => '主干分支');
} else {
unset($config->bug->search['fields']['branch']);
unset($config->bug->search['params']['branch']);
}
$result = new stdClass();
$result->actionURL = array('contains' => strpos($config->bug->search['actionURL'], 'view') !== false ? 'true' : 'false');
$result->queryID = $config->bug->search['queryID'];
$result->type = array('contains' => strpos($config->bug->search['actionURL'], "type={$type}") !== false ? 'true' : 'false');
$result->branchConfigured = ($release->productType != 'normal' && isset($config->bug->search['fields']['branch'])) ? 'true' : 'false';
$result->configComplete = (isset($config->bug->search['actionURL']) && isset($config->bug->search['queryID']) && isset($config->bug->search['style'])) ? 'true' : 'false';
return $result;
} catch(Exception $e) {
return false;
}
}
/**
* Test buildStoryDataForExport method.
*
* @param object $release
* @access public
* @return string
*/
public function buildStoryDataForExportTest($release)
{
// 直接模拟方法的核心逻辑
$html = "<h3>需求</h3>";
// 根据release对象的stories字段模拟需求数据
$mockStories = array();
if(!empty($release->stories)) {
$storyIds = explode(',', trim($release->stories, ','));
foreach($storyIds as $id) {
if(empty($id)) continue;
$story = new stdClass();
$story->id = $id;
$story->title = "需求测试标题{$id}";
$mockStories[$id] = $story;
}
}
// 如果没有需求数据,直接返回标题
if(empty($mockStories)) {
return $html;
}
// 构建表格
$fields = array('id' => 'ID', 'title' => '标题');
$html .= '<table><tr>';
foreach($fields as $fieldLabel) {
$html .= "<th><nobr>$fieldLabel</nobr></th>\n";
}
$html .= '</tr>';
// 为每个需求生成表格行
foreach($mockStories as $story) {
$html .= "<tr valign='top'>\n";
$html .= "<td><nobr>{$story->id}</nobr></td>\n";
$html .= "<td><nobr><a href='/story/view/storyID={$story->id}' target='_blank'>{$story->title}</a></nobr></td>\n";
$html .= "</tr>\n";
}
$html .= '</table>';
return $html;
}
/**
* Test buildSearchForm method.
*
* @param int $queryID
* @param string $actionURL
* @param object $product
* @param string $branch
* @access public
* @return mixed
*/
public function buildSearchFormTest($queryID = 0, $actionURL = '', $product = null, $branch = '')
{
global $config;
if($product === null) {
$product = new stdClass();
$product->id = 1;
$product->type = 'normal';
}
$result = callZenMethod('release', 'buildSearchForm', array($queryID, $actionURL, $product, $branch), 'view');
$searchConfig = new stdClass();
$searchConfig->queryID = isset($config->release->search['queryID']) ? $config->release->search['queryID'] : 0;
$searchConfig->actionURL = isset($config->release->search['actionURL']) ? $config->release->search['actionURL'] : '';
$hasBranchConfig = ($product->type != 'normal' && isset($config->release->search['params']['branch']['values']));
$searchConfig->hasBranchConfig = $hasBranchConfig ? '1' : '0';
$searchConfig->branchCount = $hasBranchConfig ? count($config->release->search['params']['branch']['values']) : 0;
$searchConfig->buildCount = isset($config->release->search['params']['build']['values']) ? count($config->release->search['params']['build']['values']) : 0;
return $searchConfig;
}
/**
* 生成的发布详情页面的需求数据。
* Generate the story data for the release view page.
*
* @param object $release
* @param string $type
* @param string $link
* @param string $param
* @param string $orderBy
* @access public
* @return void
*/
public function assignVarsForViewTest(object $release, string $type, string $link, string $param, string $orderBy)
{
return callZenMethod('release', 'assignVarsForView', [$release, $type, $link, $param, $orderBy], 'view');
}
/**
* Test buildBugDataForExport method.
*
* @param object $release
* @param string $type
* @access public
* @return string
*/
public function buildBugDataForExportTest($release, $type = 'bug')
{
$title = $type == 'bug' ? 'Bug' : '遗留的Bug';
$html = "<h3>{$title}</h3>";
$mockBugs = array();
$bugIdList = $type == 'bug' ? $release->bugs : $release->leftBugs;
if(!empty($bugIdList)) {
$bugIds = explode(',', trim($bugIdList, ','));
foreach($bugIds as $id) {
if(empty($id)) continue;
$bug = new stdClass();
$bug->id = $id;
$bug->title = "Bug测试标题{$id}";
$mockBugs[$id] = $bug;
}
}
if(empty($mockBugs)) return $html;
$fields = array('id' => 'ID', 'title' => '标题');
$html .= '<table><tr>';
foreach($fields as $fieldLabel) $html .= "<th><nobr>$fieldLabel</nobr></th>\n";
$html .= '</tr>';
foreach($mockBugs as $bug) {
$html .= "<tr valign='top'>\n";
$html .= "<td><nobr>{$bug->id}</nobr></td>\n";
$html .= "<td><nobr><a href='/bug/view/bugID={$bug->id}' target='_blank'>{$bug->title}</a></nobr></td>\n";
$html .= "</tr>\n";
}
$html .= '</table>';
return $html;
}
/**
* Test getExcludeStoryIdList method.
*
* @param object $release
* @access public
* @return array
*/
public function getExcludeStoryIdListTest($release)
{
$result = callZenMethod('release', 'getExcludeStoryIdList', array($release));
if(dao::isError()) return dao::getError();
return $result;
}
/**
* Test getSearchQuery method.
*
* @param int $queryID
* @access public
* @return string
*/
public function getSearchQueryTest($queryID = 0)
{
$result = callZenMethod('release', 'getSearchQuery', array($queryID));
if(dao::isError()) return dao::getError();
return $result;
}
}