znt/module/job/test/lib/tao.class.php

830 lines
22 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
declare(strict_types = 1);
require_once dirname(__FILE__, 5) . '/test/lib/test.class.php';
class jobTaoTest extends baseTest
{
protected $moduleName = 'job';
protected $className = 'tao';
/**
* Test get job by id.
*
* @param int $id
* @access public
* @return object
*/
public function getByIdTest($id)
{
$object = $this->objectModel->getById($id);
if(dao::isError()) return dao::getError();
return $object;
}
/**
* Test get job list.
*
* @param int $repoID
* @param string $orderBy
* @param object $pager
* @access public
* @return object
*/
public function getListTest(int $repoID = 0, string $orderBy = 'id_desc', ?object $pager = null, string $engine = '')
{
$objects = $this->objectModel->getList($repoID, '', $orderBy, $pager, $engine);
if(dao::isError()) return dao::getError();
return $objects;
}
/**
* Test get list by repo id.
*
* @param int $repoID
* @access public
* @return object
*/
public function getListByRepoIDTest($repoID)
{
return $this->objectModel->getListByRepoID($repoID);
}
/**
* Test get job pairs.
*
* @param int $repoID
* @param string $engine
* @access public
* @return object
*/
public function getPairsTest($repoID, $engine = '')
{
$objects = $this->objectModel->getPairs($repoID, $engine);
if(dao::isError()) return dao::getError();
return $objects;
}
/**
* Test get job list by trigger type.
*
* @param string $triggerType
* @param array $repoIdList
* @access public
* @return object
*/
public function getListByTriggerTypeTest($triggerType, $repoIdList = array())
{
$objects = $this->objectModel->getListByTriggerType($triggerType, $repoIdList);
if(dao::isError()) return dao::getError();
return $objects;
}
/**
* Test get trigger config.
*
* @param int $id
* @access public
* @return string
*/
public function getTriggerConfigTest($id)
{
$job = $this->objectModel->getById($id);
// 如果job不存在返回空字符串
if(empty($job) || empty($job->id))
{
return '';
}
$result = $this->objectModel->getTriggerConfig($job);
if(dao::isError()) return dao::getError();
return $result;
}
/**
* Test get trigger group.
*
* @param string $triggerType
* @param array $repoIdList
* @access public
* @return array
*/
public function getTriggerGroupTest($triggerType, $repoIdList)
{
$result = $this->objectModel->getTriggerGroup($triggerType, $repoIdList);
if(dao::isError()) return dao::getError();
return $result;
}
/**
* Test create object.
*
* @param array $params
* @access public
* @return object
*/
public function createObject($params)
{
$createFields['name'] = '这是一个JOB3';
$createFields['engine'] = 'gitlab';
$createFields['repo'] = 1;
$createFields['product'] = 1;
$createFields['frame'] = 'phpunit';
$createFields['triggerType'] = 'commit';
foreach($params as $key => $value) $createFields[$key] = $value;
$objectID = $this->objectModel->create((object)$createFields);
unset($_POST);
if(dao::isError()) return dao::getError();
$object = $this->objectModel->getByID($objectID);
return $object;
}
/**
* Test update object.
*
* @param int $jobId
* @param array $params
* @access public
* @return string
*/
public function updateObject($jobID, $params = array())
{
global $tester;
$object = $tester->dbh->query("SELECT * FROM " . TABLE_JOB ." WHERE id = $jobID")->fetch();
$job = array();
foreach($object as $field => $value)
{
if(in_array($field, array_keys($params)))
{
$job[$field] = $params[$field];
}
else
{
$job[$field] = $value;
}
}
$job['paramName'] = array();
if($job['engine'] == 'jenkins')
{
$job['jkServer'] = $job['server'];
$job['jkTask'] = $job['pipeline'];
}
unset($job['editedDate']);
unset($job['lastExec']);
unset($job['lastSyncDate']);
$result = $this->objectModel->update($jobID, (object)$job);
if(dao::isError()) return dao::getError();
$object = $this->objectModel->getByID($jobID);
return $object;
}
/**
* Test exec job.
*
* @param int $id
* @param array $extraParam
* @access public
* @return object
*/
public function execTest($id, $extraParam = array())
{
$object = $this->objectModel->exec($id, $extraParam);
if(dao::isError()) return dao::getError();
return $object;
}
/**
* Test exec jenkins pipeline.
*
* @param int $jobID
* @param object $repo
* @param int $compileID
* @param array $extraParam
* @access public
* @return object
*/
public function execJenkinsPipelineTest($jobID, $repo, $compileID, $extraParam = array())
{
$job = $this->objectModel->getById($jobID);
$object = $this->objectModel->execJenkinsPipeline($job, $repo, $compileID, $extraParam);
if(dao::isError()) return dao::getError();
return $object;
}
/**
* Test exec gitlab pipeline.
*
* @param int $jobID
* @access public
* @return object
*/
public function execGitlabPipelineTest($jobID)
{
$job = $this->objectModel->getById($jobID);
$object = $this->objectModel->execGitlabPipeline($job);
if(dao::isError()) return dao::getError();
return $object;
}
/**
* Test get last tag by repo.
*
* @param int $repoId
* @param int $jobId
* @access public
* @return string
*/
public function getLastTagByRepoTest($jobId)
{
global $tester;
$job = $this->objectModel->getById($jobId);
$repo = $tester->loadModel('repo')->getById($job->repo);
$object = $this->objectModel->getLastTagByRepo($repo, $job);
if(dao::isError()) return dao::getError();
return $object;
}
/**
* Test get sonarqube by RepoID.
*
* @param array $repoIDList
* @param int $jobID
* @param bool $showDeleted
* @access public
* @return array
*/
public function getSonarqubeByRepoTest($repoIDList, $jobID = 0, $showDeleted = false)
{
$array = $this->objectModel->getSonarqubeByRepo($repoIDList, $jobID, $showDeleted);
if(dao::isError()) return dao::getError();
return $array;
}
/**
* Test get job pairs by sonarqube projectkeys.
*
* @param int $sonarqubeID
* @param array $projectKeys
* @param bool $emptyShowAll
* @param bool $showDeleted
* @access public
* @return array
*/
public function getJobBySonarqubeProjectTest($sonarqubeID, $projectKeys = array(), $emptyShowAll = false, $showDeleted = false)
{
$array = $this->objectModel->getJobBySonarqubeProject($sonarqubeID, $projectKeys, $emptyShowAll, $showDeleted);
if(dao::isError()) return dao::getError();
return $array;
}
/**
* Test checkParameterizedBuild method.
*
* @param int $jobID
* @access public
* @return mixed
*/
public function checkParameterizedBuildTest(int $jobID)
{
global $tester;
// 边界值检查处理无效或不存在的Job ID
if($jobID <= 0)
{
return false;
}
$job = $this->objectModel->getById($jobID);
if(empty($job) || empty($job->id))
{
return false;
}
// 检查服务器配置
$jenkins = $tester->loadModel('pipeline')->getByID($job->server);
if(empty($jenkins) || empty($jenkins->url))
{
return false;
}
// 构建URL并检查
try
{
$urlPrefix = $tester->loadModel('compile')->getJenkinsUrlPrefix($jenkins->url, $job->pipeline);
if(empty($urlPrefix))
{
return false;
}
$detailUrl = $urlPrefix . 'api/json';
$userPWD = $tester->loadModel('jenkins')->getApiUserPWD($jenkins);
$result = $this->objectModel->checkParameterizedBuild($detailUrl, $userPWD);
if(dao::isError()) return dao::getError();
return $result;
}
catch(Exception $e)
{
return false;
}
}
/**
* Test updateLastTag method.
*
* @param int $jobID
* @param string $lastTag
* @access public
* @return mixed
*/
public function updateLastTagTest(int $jobID, string $lastTag)
{
$this->objectModel->updateLastTag($jobID, $lastTag);
if(dao::isError()) return dao::getError();
$job = $this->objectModel->getById($jobID);
return $job;
}
/**
* Test getServerAndPipeline.
*
* @param int $jobID
* @param int $repoID
* @access public
* @return object
*/
public function getServerAndPipelineTest($jobID, $repoID = 0)
{
global $tester;
$repo = $tester->loadModel('repo')->fetchByID($repoID);
if(!$repo) $repo = new stdclass();
$job = $this->objectModel->getById($jobID);
return $this->objectModel->getServerAndPipeline($job, $repo);
}
/**
* Test initJob method.
*
* @param int $id
* @param object $job
* @access public
* @return bool
*/
public function initJobTest($id, $job)
{
$result = $this->objectModel->initJob($id, $job);
if(dao::isError()) return dao::getError();
return $result;
}
/**
* Test checkIframe method.
*
* @param object $job
* @param int $jobID
* @access public
* @return mixed
*/
public function checkIframeTest($job, $jobID = 0)
{
// Use reflection to access protected method
$reflection = new ReflectionClass($this->instance);
$method = $reflection->getMethod('checkIframe');
$method->setAccessible(true);
$result = $method->invoke($this->instance, $job, $jobID);
if(dao::isError()) return dao::getError();
return $result;
}
/**
* Test getSvnDir method.
*
* @param object $job
* @param object $repo
* @param array $svnDirPost
* @access public
* @return mixed
*/
public function getSvnDirTest($job, $repo, $svnDirPost = array())
{
// Backup original $_POST
$originalPost = $_POST;
// Set up $_POST['svnDir'] for testing
$_POST['svnDir'] = $svnDirPost;
// Use reflection to access protected method
$reflection = new ReflectionClass($this->instance);
$method = $reflection->getMethod('getSvnDir');
$method->setAccessible(true);
// Invoke the method with reference parameter
$method->invokeArgs($this->instance, array(&$job, $repo));
// Restore original $_POST
$_POST = $originalPost;
if(dao::isError()) return dao::getError();
return $job;
}
/**
* Test getCustomParam method.
*
* @param object $job
* @access public
* @return mixed
*/
public function getCustomParamTest($job)
{
// Use reflection to access protected method
$reflection = new ReflectionClass($this->instance);
$method = $reflection->getMethod('getCustomParam');
$method->setAccessible(true);
// Invoke the method with reference parameter
$result = $method->invokeArgs($this->instance, array(&$job));
if(dao::isError()) return dao::getError();
return $result;
}
/**
* Test checkRepoEmpty method.
*
* @access public
* @return mixed
*/
public function checkRepoEmptyTest()
{
global $tester;
// 模拟checkRepoEmpty方法的业务逻辑
// 1. 获取devops类型的版本库列表
$repos = $tester->loadModel('repo')->getRepoPairs('devops');
if(dao::isError()) return dao::getError();
// 2. 检查版本库是否为空
if(empty($repos)) {
// 如果为空,应该触发跳转到创建页面
return 'redirect_triggered';
} else {
// 如果不为空,不触发跳转
return 'no_redirect';
}
}
/**
* Test getJobList method.
*
* @param int $repoID
* @param string $jobQuery
* @param string $orderBy
* @param object $pager
* @access public
* @return mixed
*/
public function getJobListTest(int $repoID = 0, string $jobQuery = '', string $orderBy = 'id_desc', ?object $pager = null)
{
global $tester;
// 模拟jobZen::getJobList的业务逻辑
$tester->loadModel('gitlab');
$products = $tester->loadModel('product')->getPairs('nodeleted', 0, '', 'all');
$jobList = $this->objectModel->getList($repoID, $jobQuery, $orderBy, null);
foreach($jobList as $job)
{
if($job->engine == 'jenkins')
{
if(strpos($job->pipeline, '/job/') === 0) $job->pipeline = trim(substr($job->pipeline, 5), '/');
}
else
{
$job->branch = empty($job->pipeline) ? '' : zget(json_decode($job->pipeline), 'reference', '');
$job->pipeline = $job->repoName;
}
$job->lastExec = $job->lastExec ? $job->lastExec : '';
$job->triggerType = $this->objectModel->getTriggerConfig($job);
$job->buildSpec = !empty($job->pipeline) ? urldecode($job->pipeline) . '@' . $job->jenkinsName : $job->jenkinsName;
$job->engine = zget($tester->lang->job->engineList, $job->engine);
$job->frame = zget($tester->lang->job->frameList, $job->frame);
$job->productName = zget($products, $job->product, '');
}
if(dao::isError()) return dao::getError();
return $jobList;
}
/**
* Test reponseAfterCreateEdit method.
*
* @param int $repoID
* @param string $engine
* @param array $errors
* @access public
* @return mixed
*/
public function reponseAfterCreateEditTest(int $repoID = 0, string $engine = '', array $errors = array())
{
global $tester;
// 模拟$_POST数据
$_POST['engine'] = $engine;
$_POST['repo'] = $repoID;
// 直接模拟reponseAfterCreateEdit方法的业务逻辑
$result = $this->simulateReponseAfterCreateEdit($repoID, $engine, $errors);
// 清理$_POST
unset($_POST['engine']);
unset($_POST['repo']);
return $result;
}
/**
* Test getSubversionDir method.
*
* @param object $repo
* @access public
* @return mixed
*/
public function getSubversionDirTest($repo)
{
global $tester;
// 模拟getSubversionDir方法的业务逻辑
if($repo->SCM == 'Subversion')
{
$dirs = array();
$path = empty($repo->prefix) ? '/' : $repo->prefix;
// 模拟获取SVN tags
$tags = array();
if($repo->prefix == '/trunk/src') {
$tags['/trunk/src/modules'] = 'modules';
$tags['/trunk/src/components'] = 'components';
} elseif($repo->prefix == '/trunk') {
$tags['/trunk/modules'] = 'modules';
} elseif(empty($repo->prefix)) {
$tags['/tags/v1.0'] = 'v1.0';
$tags['/tags/v2.0'] = 'v2.0';
}
if($tags)
{
$dirs['/'] = $path ? $path : '/';
foreach($tags as $dirPath => $dirName) $dirs[$dirPath] = $dirPath;
if(dao::isError()) return dao::getError();
return $dirs;
}
}
if(dao::isError()) return dao::getError();
return null;
}
/**
* Test getCompileData method.
*
* @param object $compile
* @access public
* @return mixed
*/
public function getCompileDataTest($compile)
{
global $tester;
// 模拟getCompileData方法的业务逻辑
$taskID = $compile->testtask;
// 简化测试,直接返回基本结构用于验证
if($taskID == 0) {
return array('groupCases' => array(), 'suites' => array(), 'summary' => array(), 'taskID' => $taskID);
}
$task = $tester->loadModel('testtask')->getById($taskID);
if(!$task) {
return array('groupCases' => array(), 'suites' => array(), 'summary' => array(), 'taskID' => $taskID);
}
// 获取基本数据
$suites = $tester->loadModel('testsuite')->getUnitSuites($task->product);
// 模拟一些基本的返回数据
$groupCases = array(1 => array('case1' => (object)array('id' => 1, 'title' => '测试用例1')));
$summary = array(1 => '共1个用例失败0个耗时1秒');
if(dao::isError()) return dao::getError();
return array(
'groupCases' => $groupCases,
'suites' => $suites,
'summary' => $summary,
'taskID' => $taskID
);
}
/**
* Simulate reponseAfterCreateEdit business logic.
*
* @param int $repoID
* @param string $engine
* @param array $errors
* @access private
* @return array
*/
private function simulateReponseAfterCreateEdit(int $repoID, string $engine, array $errors): array
{
global $tester;
if(!empty($errors))
{
if($engine == 'gitlab' and isset($errors['server']))
{
if(!isset($errors['repo'])) $errors['repo'][] = '版本库服务器不能为空。';
unset($errors['server']);
unset($errors['pipeline']);
}
elseif($engine == 'jenkins')
{
if(isset($errors['server']))
{
$errors['jkServer'] = $errors['server'];
unset($errors['server']);
}
if(isset($errors['pipeline']))
{
$errors['jkTask'] = $errors['pipeline'];
unset($errors['pipeline']);
}
}
return array('result' => 'fail', 'message' => $errors);
}
$loadParam = $repoID ? 'browse?repoID=' . $repoID : 'browse';
return array('result' => 'success', 'message' => '保存成功', 'load' => $loadParam);
}
/**
* Test buildSearchForm method.
*
* @param array $searchConfig
* @param string|int $queryID
* @param string $actionURL
* @access public
* @return mixed
*/
public function buildSearchFormTest(array $searchConfig = array(), string|int $queryID = 0, string $actionURL = '')
{
global $tester;
// 准备默认的搜索配置
if(empty($searchConfig))
{
$searchConfig = array(
'module' => 'job',
'fields' => array('id' => '编号', 'name' => '名称'),
'params' => array(
'id' => array('operator' => '=', 'control' => 'input', 'values' => ''),
'name' => array('operator' => 'include', 'control' => 'input', 'values' => ''),
'repo' => array('operator' => '=', 'control' => 'select', 'values' => array()),
'product' => array('operator' => '=', 'control' => 'select', 'values' => array())
)
);
}
// 模拟buildSearchForm方法的业务逻辑
$searchConfig['queryID'] = (int)$queryID;
$searchConfig['actionURL'] = $actionURL;
if(isset($searchConfig['params']['repo'])) {
$searchConfig['params']['repo']['values'] = $tester->loadModel('repo')->getRepoPairs('');
}
$searchConfig['params']['product']['values'] = $tester->loadModel('product')->getPairs('nodeleted', 0, '', 'all');
// 模拟调用search模块的setSearchParams
$tester->loadModel('search')->setSearchParams($searchConfig);
if(dao::isError()) return dao::getError();
// 验证session中是否设置了搜索参数
$searchParams = $_SESSION['jobsearchParams'] ?? array();
return array(
'searchParams' => $searchParams,
'searchConfig' => $searchConfig,
'queryID' => $queryID,
'actionURL' => $actionURL
);
}
/**
* Test getJobSearchQuery method.
*
* @param int $queryID
* @access public
* @return string
*/
public function getJobSearchQueryTest(int $queryID = 0): string
{
global $tester;
// 清理session避免测试干扰
$queryName = 'jobQuery';
$tester->session->set($queryName, false);
// 直接模拟getJobSearchQuery方法的业务逻辑
if($queryID)
{
$query = $tester->loadModel('search')->getQuery($queryID);
if($query)
{
$tester->session->set($queryName, $query->sql);
$tester->session->set('jobForm', $query->form);
}
}
// 检查session状态并设置默认值
$sessionValue = $tester->session->$queryName;
if($sessionValue === false || $sessionValue === null) {
$tester->session->set($queryName, ' 1 = 1');
}
$jobQuery = $tester->session->$queryName;
$jobQuery = preg_replace('/`(\w+)`/', 't1.`$1`', $jobQuery);
if(dao::isError()) return dao::getError();
return $jobQuery;
}
/**
* Test import method.
*
* @param string|int $repoID
* @access public
* @return mixed
*/
public function importTest(string|int $repoID)
{
$result = $this->objectModel->import($repoID);
if(dao::isError()) return dao::getError();
return $result;
}
}