Files
EasySoft-ZenTaoPMS/module/upgrade/test/upgrade.class.php
T
2024-01-08 16:08:42 +08:00

742 lines
23 KiB
PHP
Executable File

<?php
declare(strict_types=1);
class upgradeTest
{
private $objectModel;
public function __construct()
{
global $tester;
$this->objectModel = $tester->loadModel('upgrade');
}
/**
* 测试获取升级版本。
* Test get update version.
*
* @param string $openVersion
* @param string $fromEdition
* @access public
* @return string
*/
public function getVersionsToUpdateTest(string $openVersion, string $fromEdition): string
{
$versions = $this->objectModel->getVersionsToUpdate($openVersion, $fromEdition);
$return = '';
foreach($versions[$openVersion] as $edition => $version)
{
if(!isset($version[0])) $version[0] = '0';
$return .="{$edition}:{$version[0]};";
}
return trim($return, ';');
}
/**
* __call魔术方法,如果比较简单的方法可以直接调用,不需要单独写方法。
* __call magic method, if the method is simple, you can call it directly, no need to write a method.
*
* @param string $method
* @param array $args
* @access public
* @return mixed
*/
public function __call(string $method, array $args): mixed
{
return call_user_func_array(array($this->objectModel, $method), $args);
}
/**
* 测试通过版本号获取产品版本类型。
* Test get edition by version.
*
* @param string $version
* @access public
* @return string
*/
public function getEditionByVersionTest(string $version): string
{
return $this->objectModel->getEditionByVersion($version);
}
/**
* 测试获取开源版版本。
* Test get open version.
*
* @param string $version
* @access public
* @return string
*/
public function getOpenVersionTest(string $version): string
{
return $this->objectModel->getOpenVersion($version);
}
/**
* 测试打开UR开关。
* Test set UR switch status.
*
* @param string $version
* @access public
* @return bool
*/
public function setURSwitchStatusTest(string $version): bool
{
$this->objectModel->fromVersion = $version;
return $this->objectModel->setURSwitchStatus();
}
/**
* 测试删除临时 model 文件。
* Test delete tmp model files.
*
* @access public
* @return int
*/
public function deleteTmpModelTest(): int
{
$this->objectModel->deleteTmpModel();
global $tester;
return count(glob($tester->app->getTmpRoot() . 'model/*.php'));
}
/**
* 测试处理devOps上线步骤的历史记录。
* Test process deploy step action.
*
* @param int deployStepID
* @access public
* @return object|false
*/
public function processDeployStepActionTest(int $deployStepID): object|false
{
$this->objectModel->processDeployStepAction();
global $tester;
return $tester->dao->select('*')->from(TABLE_ACTION)->where('objectID')->eq($deployStepID)->andWhere('objectType')->eq('deploystep')->fetch();
}
/**
* 测试删除补丁记录。
* Test delete patch records.
*
* @access public
* @return int
*/
public function deletePatchTest(): int
{
$this->objectModel->deletePatch();
global $tester;
return $tester->dao->select('count(1) as count')->from(TABLE_EXTENSION)->where('type')->eq('patch')->orWhere('code')->in('zentaopatch,patch')->fetch('count');
}
/**
* 测试获取升级 sql 文件路径。
* Test get the upgrade sql file.
*
* @param string $version
* @access public
* @return string
*/
public function getUpgradeFileTest(string $version): string
{
$filepath = $this->objectModel->getUpgradeFile($version);
global $tester;
return str_replace($tester->app->getAppRoot() . 'db' . DS, '', $filepath);
}
/**
* 测试获取项目集下的项目键值对。
* Test get the project of the program it belongs to.
*
* @param int $programID
* @access public
* @return string
*/
public function getProjectPairsByProgramTest(int $programID): string
{
$projects = $this->objectModel->getProjectPairsByProgram($programID);
$return = '';
foreach($projects as $projectID => $projectName) $return .= "{$projectID}:{$projectName};";
return trim($return, ';');
}
/**
* 测试将 sql 文件解析为 sql 语句。
* Test parse sql file to sqls.
*
* @param string $version
* @access public
* @return string
*/
public function parseToSqlsTest(string $version): string
{
$sqlFile = $this->objectModel->getUpgradeFile($version);
$sqls = $this->objectModel->parseToSqls($sqlFile);
return substr($sqls[0], 0, 30);
}
/**
* 测试将 sql 文件解析为 sql 语句。
* Test parse sql file to sqls.
*
* @access public
* @return string
*/
public function addORPrivTest(): string
{
$this->objectModel->addORPriv();
global $tester;
$groups = $tester->dao->select('count(1) as count')->from(TABLE_GROUP)->fetch('count');
$groupPrivs = $tester->dao->select('count(1) as count')->from(TABLE_GROUPPRIV)->fetch('count');
return "groups:{$groups},groupPrivs:{$groupPrivs}";
}
/**
* 测试判断是否出现错误。
* Test judge any error occurs.
*
* @param array $errors
* @access public
* @return bool
*/
public function isErrorTest(array $errors): bool
{
$this->objectModel::$errors = $errors;
return $this->objectModel->isError();
}
/**
* 测试获取升级时的错误。
* Test get errors during the upgrading.
*
* @param array $errors
* @access public
* @return string
*/
public function getErrorTest(array $errors): string
{
$this->objectModel::$errors = $errors;
$return = $this->objectModel->getError();
return implode(',', $return);
}
/**
* 测试检查流程。
* Test check weither process or not.
*
* @param string $installedVersion
* @param string $systemMode
* @access public
* @return string
*/
public function checkProcessTest(string $installedVersion, string $systemMode): string
{
global $tester;
$tester->config->installedVersion = $installedVersion;
$tester->config->systemMode = $systemMode;
$process = $this->objectModel->checkProcess();
$return = '';
foreach($process as $key => $value) $return .= "{$key}:{$value};";
return trim($return, ';');
}
/**
* 测试更新BI相关zt_pivot表的sql字段。
* Update BI SQL for 18.4.stable new function: dataview model.php checkUniColumn().
*
* @param int $pivotID
* @param string $errorValue
* @param string $rightValue
* @param string $testField
* @access public
* @return bool
*/
public function updateBISQLTest(int $pivotID, string $errorValue, string $rightValue, string $testField): bool
{
global $tester;
/* Init pivot table data. */
$pivotSqlFile = $tester->app->getAppRoot() . 'test' . DS . 'data' . DS . 'pivot.sql';
$pivotSQLs = explode(";", file_get_contents($pivotSqlFile));
$tester->dao->delete()->from(TABLE_PIVOT)->exec();
foreach($pivotSQLs as $pivotSQL) if(trim($pivotSQL)) $tester->dbh->exec($pivotSQL);
$tester->dao->update(TABLE_PIVOT)->set('sql')->eq($errorValue)->where('id')->eq($pivotID)->exec();
$this->objectModel->updateBISQL();
$pivot = $tester->dao->select('*')->from(TABLE_PIVOT)->where('id')->eq($pivotID)->fetch();
return $pivot->$testField == $rightValue;
}
/**
* 测试初始化用户视图。
* Test initialize user view.
*
* @access public
* @return int
*/
public function initUserViewTest(): int
{
$this->objectModel->initUserView();
global $tester;
return $tester->dao->select('count(1) as count')->from(TABLE_USERVIEW)->fetch('count');
}
/**
* 测试存储日志。
* Test save logs.
*
* @param string $log
* @access public
* @return string
*/
public function saveLogsTest(string $log): string
{
$this->objectModel->saveLogs($log);
$logFile = $this->getLogFile();
$logContent = file_get_contents($logFile);
$logContent = explode("\n", $logContent);
array_pop($logContent);
return substr(array_pop($logContent), 20, 30);
}
/**
* 测试设置项目集默认权限。
* Test set program default priv.
*
* @access public
* @return bool
*/
public function setDefaultPrivTest(): bool
{
$this->objectModel->setDefaultPriv();
return true;
}
/**
* 测试更新透视表的阶段。
* Test update pivot stage.
*
* @param array $changeFields
* @access public
* @return void
*/
public function updatePivotStageTest(array $changeFields)
{
global $tester;
/* Init pivot table data. */
$pivotSqlFile = $tester->app->getAppRoot() . 'test' . DS . 'data' . DS . 'pivot.sql';
$pivotSQLs = explode(";", file_get_contents($pivotSqlFile));
$tester->dao->delete()->from(TABLE_PIVOT)->exec();
foreach($pivotSQLs as $pivotSQL) if(trim($pivotSQL)) $tester->dbh->exec($pivotSQL);
$tester->dao->update(TABLE_PIVOT)->data($changeFields)->where('id')->eq($changeFields['id'])->exec();
$this->objectModel->updatePivotStage();
$afterUpdatePivot = $tester->dao->select('*')->from(TABLE_PIVOT)->where('id')->eq($changeFields['id'])->fetch();
return $afterUpdatePivot;
}
/**
* 测试获取自定义的模块。
* Test get custom modules.
*
* @param array $allModules
* @access public
* @return string
*/
public function getCustomModulesTest(array $allModules): string
{
$return = $this->objectModel->getCustomModules($allModules);
return implode(',', $return);
}
/**
* 测试为用户故事添加创建动作。
* Test add create action for story.
*
* @param string $version
* @access public
* @return void
*/
public function addCreateAction4StoryTest(string $version): void
{
$this->objectModel->fromVersion = $version;
$this->objectModel->addCreateAction4Story();
}
/**
* 测试更新透视表中字段的类型。
* Test update pivot fields type.
*
* @access public
* @return bool
*/
public function updatePivotFieldsTypeTest(int $pivotID, array $changeFields, array $rightValue): bool
{
global $tester;
/* Init pivot table data. */
$pivotSqlFile = $tester->app->getAppRoot() . 'test' . DS . 'data' . DS . 'pivot.sql';
$pivotSQLs = explode(";", file_get_contents($pivotSqlFile));
$tester->dao->delete()->from(TABLE_PIVOT)->exec();
foreach($pivotSQLs as $pivotSQL) if(trim($pivotSQL)) $tester->dbh->exec($pivotSQL);
$tester->dao->update(TABLE_PIVOT)->data($changeFields)->where('id')->eq($pivotID)->exec();
$this->objectModel->updatePivotFieldsType();
$afterUpdatePivot = $tester->dao->select('*')->from(TABLE_PIVOT)->where('id')->eq($pivotID)->fetch();
$result = $afterUpdatePivot->fields == $rightValue[$pivotID]['fields'];
if(isset($rightValue[$pivotID]['langs'])) $result = $afterUpdatePivot->langs == $rightValue[$pivotID]['langs'];
return $result;
}
/**
* 测试为项目创建项目主库。
* Test create doc lib for project.
*
* @param object $project
* @access public
* @return object
*/
public function createProjectDocLibTest(int $projectID): object
{
global $tester;
$project = $tester->loadModel('project')->getByID($projectID);
$this->objectModel->createProjectDocLib($project);
return $tester->dao->select('*')->from(TABLE_DOCLIB)->where('project')->eq($projectID)->fetch();
}
/**
* 测试更新在编辑器中的文件 objectID。
* Test update file objectID in editor.
*
* @param string $type
* @param int $lastID
* @access public
* @return string
*/
public function updateFileObjectIDTest(string $type, int $lastID): object
{
global $tester;
$tester->dao->update(TABLE_FILE)->set('extra')->eq('editor')->exec();
$result = $this->objectModel->updateFileObjectID($type, $lastID);
$return = new stdclass();
foreach($result as $key => $value) $return->$key = $value;
$files = $tester->dao->select('id')->from(TABLE_FILE)->where('extra')->eq('editor')->beginIF($type != '' && $type != 'comment')->andWhere('objectType')->eq($type)->fi()->fetchPairs();
$return->files = implode(',', $files);
return $return;
}
/**
* 测试更新文件对象。
* Test update file objects.
*
* @param string $type
* @param int $lastID
* @param int $limit
* @access public
* @return string
*/
public function updateFileObjectsTest(string $type, int $lastID, int $limit): string
{
global $tester;
$tester->dao->update(TABLE_FILE)->set('extra')->eq('editor')->exec();
list($objectCount, $lastID) = $this->objectModel->updateFileObjects($type, $lastID, $limit);
$files = $tester->dao->select('id')->from(TABLE_FILE)->where('objectType')->eq($type)->andWhere('extra')->eq('editor')->fetchPairs();
return "count:{$objectCount},lastID:{$lastID},fileID:" . implode(',', $files);
}
/**
* 测试获取没有合并的产品的数量。
* Get no merged product count test.
*
* @access public
* @return int
*/
public function getNoMergedProductCountTest(): int
{
return $this->objectModel->getNoMergedProductCount();
}
/**
* 测试计算项目、产品、迭代的成员。
* Test compute project, product and sprint members.
*
* @param bool $execute
* @param int $objectID
* @param string $objectType
* @access public
* @return string
*/
public function computeObjectMembersTest(bool $execute = false, int $objectID = 0, string $objectType = ''): string
{
if($execute) $this->objectModel->computeObjectMembers();
$return = '';
if($objectID && $objectType)
{
global $tester;
$acls = $tester->dao->select('account')->from(TABLE_ACL)->where('objectType')->eq($objectType)->andWhere('objectID')->eq($objectID)->fetchPairs();
$teams = $tester->dao->select('account')->from(TABLE_TEAM)->where('type')->eq($objectType)->andWhere('root')->eq($objectID)->fetchPairs();
$return = 'acls:' . implode(',', $acls) . ';' . 'teams:' . implode(',', $teams);
}
return $return;
}
/**
* 测试获取没有合并的迭代的数量。
* Get no merged sprint count test.
*
* @access public
* @return int
*/
public function getNoMergedSprintCountTest(): int
{
return $this->objectModel->getNoMergedSprintCount();
}
/**
* 测试计算产品的 acl。
* Test compute product acl.
*
* @param array $productIdList
* @param int $programID
* @param int|object $lineID
* @access public
* @return string
*/
public function computeProductAclTest(array $productIdList = array(), int $programID = 0, int|object $lineID = null): string
{
$this->objectModel->computeProductAcl($productIdList, $programID, $lineID);
global $tester;
$return = '';
$products = $tester->dao->select('id,program,acl,line')->from(TABLE_PRODUCT)->where('id')->in($productIdList)->fetchAll();
foreach($products as $product) $return .= "{$product->id}:{$product->program},{$product->acl},{$product->line}; ";
return $return;
}
/**
* 测试将历史的项目作为执行升级。
* Test historical projects are upgraded by execution.
*
* @param int $programID
* @access public
* @return array
*/
public function upgradeInExecutionModeTest(int $programID): array
{
$_POST['projectType'] = 'execution';
$this->objectModel->upgradeInExecutionMode($programID);
global $tester;
return $tester->dao->select('*')->from(TABLE_PROJECT)->fetchAll('id');
}
/**
* 测试创建一个项目。
* Test create a project.
*
* @param int $programID
* @param object $data
* @access public
* @return string|array
*/
public function createProjectTest(int $programID = 0, object $data = null): string|array
{
$projectID = $this->objectModel->createProject($programID, $data);
if(dao::isError()) return dao::getError();
global $tester;
$actionCount = $tester->dao->select('count(1) as count')->from(TABLE_ACTION)->where('objectType')->eq('project')->andWhere('objectID')->eq($projectID)->fetch('count');
$project = $tester->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($projectID)->fetch();
$program = $tester->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($programID)->fetch();
return "project:{$project->id},{$project->team},{$project->end},{$project->acl}; program:{$program->begin},{$program->end}; actionCount:{$actionCount}";
}
/**
* 测试计算开始和结束日期中间的工作日数。
* Test compute delta between the begin and end date.
*
* @param string $begin
* @param string $end
* @access public
* @return int
*/
public function computeDaysDeltaTest(string $begin, string $end): int
{
return $this->objectModel->computeDaysDelta($begin, $end);
}
/**
* 测试将历史的项目作为香米升级。
* Test historical projects are upgraded by project.
*
* @param int $programID
* @param string $fromMode
* @access public
* @return string
*/
public function upgradeInProjectModeTest(int $programID, string $fromMode): string
{
$this->objectModel->upgradeInProjectMode($programID, $fromMode);
global $tester;
$return = '';
$projects = $tester->dao->select('id,parent,multiple')->from(TABLE_PROJECT)->where('type')->eq('project')->fetchAll();
foreach($projects as $project) $return .= "{$project->id}:{$project->parent},{$project->multiple};";
return trim($return, ';');
}
/**
* 测试安装IPD。
* Test install IPD.
*
* @param string $version
* @access public
* @return void
*/
public function installIPDTest(string $version): void
{
$this->objectModel->fromVersion = $version;
$this->objectModel->installIPD();
}
/**
* 测试新建项目集。
* Test create program.
*
* @param object $data
* @param array $projectIdList
* @access public
* @return array|bool
*/
public function createProgramTest(object $data, array $projectIdList): bool|array
{
foreach($data as $key => $value) $_POST[$key] = $value;
$result = $this->objectModel->createProgram($projectIdList);
return $result;
}
/**
* 测试新建一个项目集。
* Test create a program.
*
* @param object $data
* @param array $projectIdList
* @access public
* @return array|object
*/
public function createNewProgramTest(object $data, array $projectIdList): array|object
{
$result = $this->objectModel->createNewProgram($data, $projectIdList);
if(dao::isError()) return dao::getError();
if(is_array($result) && isset($result['result']) && $result['result'] == 'fail') return $result;
global $tester;
$programID = $result;
return $tester->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($programID)->fetch();
}
/**
* 测试合并项目。
* Test merge project.
*
* @param object $data
* @param int $programID
* @param array $projectIdList
* @access public
* @return array|object|bool
*/
public function createNewProjectTest(object $data, int $programID, array $projectIdList): array|object|bool
{
$result = $this->objectModel->createNewProject($data, $programID, $projectIdList);
if(dao::isError()) return dao::getError();
if(is_array($result) && isset($result['result']) && $result['result'] == 'fail') return $result;
if($data->projectType == 'execution')
{
$projectID = $result;
global $tester;
return $tester->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($projectID)->fetch();
}
if($data->projectType == 'project') return $result;
}
/**
* 测试新建产品线。
* Test create new line.
*
* @param string $lineName
* @param int $programID
* @access public
* @return array|object
*/
public function createNewLineTest(string $lineName, int $programID): array|object
{
$result = $this->objectModel->createNewLine($lineName, $programID);
if(dao::isError()) return dao::getError();
$lineID = $result;
global $tester;
$productLine = $tester->dao->select('*')->from(TABLE_MODULE)->where('id')->eq($lineID)->fetch();
return $productLine;
}
/**
* 测试检查必填项。
* Test check program required.
*
* @param object $data
* @param string $projectType
* @access public
* @return array|bool
*/
public function checkProgramRequiredTest(object $data, string $projectType): array|bool
{
$this->objectModel->checkProgramRequired($data, $projectType);
if(dao::isError()) return dao::getError();
return true;
}
/**
* 测试获取重复名称的项目 id 列表。
* Test get duplicate project name.
*
* @param array $projectIdList
* @access public
* @return string
*/
public function getDuplicateProjectNameTest(array $projectIdList): string
{
return $this->objectModel->getDuplicateProjectName($projectIdList);
}
/**
* Test revert story custom fields.
*
* @access public
* @return void
*/
public function revertStoryCustomFieldsTest()
{
$this->objectModel->revertStoryCustomFields();
return $this->objectModel->dao->select('*')->from(TABLE_CONFIG)->where('module')->eq('datatable')->andWhere('section')->eq('productBrowse')->andWhere('key')->eq('cols')->fetch();
}
}