* [misc] Fix unit tests for actionModel::processActionForAPI() method
🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -359,11 +359,35 @@ class actionTest
|
||||
*/
|
||||
public function logHistoryTest($actionID, $changes)
|
||||
{
|
||||
$this->objectModel->logHistory($actionID, $changes);
|
||||
// 确保actionID是整数类型
|
||||
$actionID = (int)$actionID;
|
||||
|
||||
// 如果actionID无效或变更为空,直接返回空数组
|
||||
if($actionID <= 0 || empty($changes)) return array();
|
||||
|
||||
// 先创建一个基础的action记录,避免processHistory失败
|
||||
global $tester;
|
||||
$existingAction = $tester->dao->select('id')->from(TABLE_ACTION)->where('id')->eq($actionID)->fetch();
|
||||
if(!$existingAction)
|
||||
{
|
||||
$tester->dao->insert(TABLE_ACTION)->data(array(
|
||||
'id' => $actionID,
|
||||
'objectType' => 'task',
|
||||
'objectID' => 1,
|
||||
'actor' => 'admin',
|
||||
'action' => 'edited',
|
||||
'date' => date('Y-m-d H:i:s'),
|
||||
'extra' => ''
|
||||
))->exec();
|
||||
}
|
||||
|
||||
$result = $this->objectModel->logHistory($actionID, $changes);
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
global $tester;
|
||||
// 如果logHistory返回false,说明有问题
|
||||
if($result === false) return array();
|
||||
|
||||
$objects = $tester->dao->select('*')->from(TABLE_HISTORY)->where('action')->eq($actionID)->fetchAll('', false);
|
||||
return $objects;
|
||||
}
|
||||
@@ -1362,6 +1386,24 @@ class actionTest
|
||||
return array_values($actions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test processActionForAPI method specifically for history field mapping.
|
||||
*
|
||||
* @param array|object $actions
|
||||
* @param array|object $users
|
||||
* @param array|object $objectLang
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function processActionForAPIHistoryTest($actions, $users = array(), $objectLang = array()): string
|
||||
{
|
||||
$result = $this->processActionForAPITest($actions, $users, $objectLang);
|
||||
if(empty($result) || !isset($result[0]->history) || !is_array($result[0]->history) || empty($result[0]->history)) {
|
||||
return '';
|
||||
}
|
||||
return $result[0]->history[0]->fieldName ?? '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Test buildTrashSearchForm method.
|
||||
*
|
||||
@@ -1503,42 +1545,42 @@ class actionTest
|
||||
{
|
||||
global $tester;
|
||||
$actionTao = $tester->loadTao('action');
|
||||
|
||||
|
||||
// 创建测试用的action对象
|
||||
$action = new stdClass();
|
||||
$action->extra = $extraID;
|
||||
$action->objectType = 'bug';
|
||||
$action->action = 'converttotask';
|
||||
$action->project = 1;
|
||||
|
||||
|
||||
// 备份原始extra值
|
||||
$originalExtra = $action->extra;
|
||||
|
||||
|
||||
// 模拟onlyBody场景
|
||||
if($onlyBody)
|
||||
{
|
||||
$originalIsonlybody = $tester->config->requestType ?? 'GET';
|
||||
$_GET['onlybody'] = 'yes';
|
||||
}
|
||||
|
||||
|
||||
// 调用测试方法
|
||||
$actionTao->processActionExtra($table, $action, $fields, $type, $method, $onlyBody, $addLink);
|
||||
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
|
||||
// 恢复onlyBody状态
|
||||
if($onlyBody)
|
||||
{
|
||||
unset($_GET['onlybody']);
|
||||
}
|
||||
|
||||
|
||||
// 分析结果 - 优先检查特殊场景
|
||||
if($action->extra == $originalExtra) return 'no_change';
|
||||
if($onlyBody && strpos($action->extra, '<a') === false) return 'onlybody_mode';
|
||||
if(!$addLink && strpos($action->extra, '#') !== false && strpos($action->extra, '<a') === false) return 'no_link';
|
||||
if($action->objectType == 'bug' && $type == 'task' && strpos($action->extra, 'data-app=') !== false) return 'bug_to_task';
|
||||
if(strpos($action->extra, '<a') !== false) return 'contains_link';
|
||||
|
||||
|
||||
return 'processed';
|
||||
}
|
||||
|
||||
@@ -1553,16 +1595,16 @@ class actionTest
|
||||
{
|
||||
global $tester;
|
||||
$actionTao = $tester->loadTao('action');
|
||||
|
||||
|
||||
// 创建测试用的action对象
|
||||
$action = new stdClass();
|
||||
$action->objectID = $storyID;
|
||||
$action->extra = '';
|
||||
|
||||
|
||||
$result = $actionTao->processStoryGradeActionExtra($action);
|
||||
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
@@ -1882,13 +1924,13 @@ class actionTest
|
||||
public function getTrashesHeaderNavigationTest(array $objectTypeList): array
|
||||
{
|
||||
global $tester;
|
||||
|
||||
|
||||
// 加载action控制器基类
|
||||
if(!class_exists('action'))
|
||||
{
|
||||
include dirname(__FILE__, 3) . '/control.php';
|
||||
}
|
||||
|
||||
|
||||
// 包含zen文件并实例化
|
||||
include_once dirname(__FILE__, 3) . '/zen.php';
|
||||
$actionZen = new actionZen();
|
||||
@@ -1909,7 +1951,7 @@ class actionTest
|
||||
public function saveUrlIntoSessionTest(string $testUri = ''): array|string
|
||||
{
|
||||
global $tester;
|
||||
|
||||
|
||||
// 备份原来的session数据
|
||||
$sessionKeys = array(
|
||||
'productList', 'productPlanList', 'releaseList', 'programList', 'projectList',
|
||||
@@ -1919,30 +1961,30 @@ class actionTest
|
||||
'storyLibList', 'issueLibList', 'riskLibList', 'opportunityLibList',
|
||||
'practiceLibList', 'componentLibList'
|
||||
);
|
||||
|
||||
|
||||
$originalSession = array();
|
||||
foreach($sessionKeys as $key)
|
||||
{
|
||||
$originalSession[$key] = isset($tester->session->$key) ? $tester->session->$key : '';
|
||||
}
|
||||
|
||||
|
||||
// 加载action控制器基类并创建actionZen实例
|
||||
if(!class_exists('action'))
|
||||
{
|
||||
include dirname(__FILE__, 3) . '/control.php';
|
||||
}
|
||||
include_once dirname(__FILE__, 3) . '/zen.php';
|
||||
|
||||
|
||||
// 创建一个模拟的actionZen类用于测试
|
||||
$actionZen = new class($testUri) extends actionZen {
|
||||
private $mockUri;
|
||||
|
||||
|
||||
public function __construct($uri = '')
|
||||
{
|
||||
$this->mockUri = $uri;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
|
||||
public function saveUrlIntoSession()
|
||||
{
|
||||
global $tester;
|
||||
@@ -1975,19 +2017,19 @@ class actionTest
|
||||
$tester->session->componentLibList = $uri;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// 调用测试方法
|
||||
$actionZen->saveUrlIntoSession();
|
||||
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
|
||||
// 获取保存后的session数据
|
||||
$result = array();
|
||||
foreach($sessionKeys as $key)
|
||||
{
|
||||
$result[$key] = isset($tester->session->$key) ? $tester->session->$key : '';
|
||||
}
|
||||
|
||||
|
||||
// 恢复原来的session数据
|
||||
foreach($originalSession as $key => $value)
|
||||
{
|
||||
@@ -2000,7 +2042,7 @@ class actionTest
|
||||
unset($tester->session->$key);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
@@ -2017,22 +2059,22 @@ class actionTest
|
||||
public function processTrashTest(object $trash, array $projectList = array(), array $productList = array(), array $executionList = array()): object
|
||||
{
|
||||
global $tester;
|
||||
|
||||
|
||||
// 加载action控制器基类
|
||||
if(!class_exists('action'))
|
||||
{
|
||||
include dirname(__FILE__, 3) . '/control.php';
|
||||
}
|
||||
|
||||
|
||||
// 包含zen文件并实例化
|
||||
include_once dirname(__FILE__, 3) . '/zen.php';
|
||||
$actionZen = new actionZen();
|
||||
|
||||
|
||||
// 调用测试方法
|
||||
$actionZen->processTrash($trash, $projectList, $productList, $executionList);
|
||||
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
|
||||
return $trash;
|
||||
}
|
||||
|
||||
@@ -2048,15 +2090,15 @@ class actionTest
|
||||
public function getReplaceNameAndCodeTest(string $name, string $code, string $table): array
|
||||
{
|
||||
global $tester;
|
||||
|
||||
|
||||
// 创建模拟的重复对象和原对象
|
||||
$repeatObject = new stdClass();
|
||||
$repeatObject->name = $name;
|
||||
$repeatObject->code = $code;
|
||||
|
||||
|
||||
$object = new stdClass();
|
||||
$object->code = $code;
|
||||
|
||||
|
||||
// 直接调用model层的方法来模拟zen层的逻辑
|
||||
$existNames = $this->objectModel->getLikeObject($table, 'name', 'name', $repeatObject->name . '_%');
|
||||
$replaceName = '';
|
||||
@@ -2065,7 +2107,7 @@ class actionTest
|
||||
$replaceName = $repeatObject->name . '_' . $i;
|
||||
if(!in_array($replaceName, $existNames)) break;
|
||||
}
|
||||
|
||||
|
||||
$replaceCode = '';
|
||||
if($object->code)
|
||||
{
|
||||
@@ -2076,9 +2118,9 @@ class actionTest
|
||||
if(!in_array($replaceCode, $existCodes)) break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
|
||||
return array($replaceName, $replaceCode);
|
||||
}
|
||||
|
||||
@@ -2113,27 +2155,27 @@ class actionTest
|
||||
public function getConfirmNoMessageTest(string $repeatName, string $replaceName, string $replaceCode, string $objectName, string $objectCode, string $testType): string
|
||||
{
|
||||
global $tester;
|
||||
|
||||
|
||||
// 加载action控制器基类
|
||||
if(!class_exists('action'))
|
||||
{
|
||||
include dirname(__FILE__, 3) . '/control.php';
|
||||
}
|
||||
|
||||
|
||||
// 包含zen文件并实例化
|
||||
include_once dirname(__FILE__, 3) . '/zen.php';
|
||||
$actionZen = new actionZen();
|
||||
|
||||
|
||||
// 创建模拟的重复对象
|
||||
$repeatObject = new stdClass();
|
||||
$repeatObject->name = $repeatName;
|
||||
$repeatObject->code = ($testType == 'both' && $replaceCode) ? substr($replaceCode, 0, -2) : (($testType == 'code' && $replaceCode) ? substr($replaceCode, 0, -2) : '');
|
||||
|
||||
|
||||
// 创建模拟的原对象
|
||||
$object = new stdClass();
|
||||
$object->name = $objectName;
|
||||
$object->code = $objectCode;
|
||||
|
||||
|
||||
// 创建模拟的旧Action对象
|
||||
$oldAction = new stdClass();
|
||||
switch($testType) {
|
||||
@@ -2153,12 +2195,12 @@ class actionTest
|
||||
$oldAction->objectType = 'bug';
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// 调用测试方法
|
||||
$result = $actionZen->getConfirmNoMessage($repeatObject, $object, $oldAction, $replaceName, $replaceCode);
|
||||
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
@@ -2176,43 +2218,43 @@ class actionTest
|
||||
public function recoverObjectTest(string $repeatName, string $repeatCode, string $replaceName, string $replaceCode, string $testType): object|string
|
||||
{
|
||||
global $tester;
|
||||
|
||||
|
||||
// 加载action控制器基类
|
||||
if(!class_exists('action'))
|
||||
{
|
||||
include dirname(__FILE__, 3) . '/control.php';
|
||||
}
|
||||
|
||||
|
||||
// 包含zen文件并实例化
|
||||
include_once dirname(__FILE__, 3) . '/zen.php';
|
||||
$actionZen = new actionZen();
|
||||
|
||||
|
||||
// 确保actionZen类有正确的action属性
|
||||
$actionZen->action = $this->objectModel;
|
||||
|
||||
|
||||
// 创建模拟的重复对象
|
||||
$repeatObject = new stdClass();
|
||||
$repeatObject->name = $repeatName;
|
||||
$repeatObject->code = $repeatCode;
|
||||
|
||||
|
||||
// 创建模拟的原对象
|
||||
$object = new stdClass();
|
||||
$object->name = $repeatName;
|
||||
$object->code = $repeatCode;
|
||||
|
||||
|
||||
// 创建模拟的旧Action对象
|
||||
$oldAction = new stdClass();
|
||||
$oldAction->objectID = 1;
|
||||
$oldAction->objectType = 'product';
|
||||
|
||||
|
||||
// 设置数据表
|
||||
$table = TABLE_PRODUCT;
|
||||
|
||||
|
||||
if($testType == 'empty' || ($testType == 'none'))
|
||||
{
|
||||
// 如果是测试无变化的情况,直接返回
|
||||
if(empty($replaceName) && empty($replaceCode)) return 'no_change';
|
||||
|
||||
|
||||
// 模拟无重复的情况,修改重复对象的名称和代码
|
||||
if($testType == 'none')
|
||||
{
|
||||
@@ -2220,17 +2262,17 @@ class actionTest
|
||||
$repeatObject->code = 'no_repeat';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 调用测试方法
|
||||
$actionZen->recoverObject($repeatObject, $object, $replaceName, $replaceCode, $table, $oldAction);
|
||||
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
|
||||
// 检查更新结果
|
||||
$updatedObject = $tester->dao->select('*')->from($table)->where('id')->eq($oldAction->objectID)->fetch();
|
||||
|
||||
|
||||
if(!$updatedObject) return 'no_object';
|
||||
|
||||
|
||||
// 根据测试类型返回相应的结果
|
||||
switch($testType) {
|
||||
case 'both':
|
||||
|
||||
@@ -11,7 +11,10 @@ cid=0
|
||||
- 执行actionTest模块的processActionForAPITest方法,参数是array 第0条的extra属性 @user2
|
||||
- 执行actionTest模块的processActionForAPITest方法,参数是array @0
|
||||
- 执行actionTest模块的processActionForAPITest方法,参数是array 第0条的actor属性 @admin
|
||||
- 执行actionTest模块的processActionForAPITest方法,参数是array 第0条的history:0:fieldName属性 @状态
|
||||
- 执行actionTest模块的processActionForAPIHistoryTest方法,参数是array @状态
|
||||
- 执行actionTest模块的processActionForAPITest方法,参数是array 第0条的actor属性 @user1
|
||||
- 执行actionTest模块的processActionForAPITest方法,参数是array 第0条的actor属性 @unknown
|
||||
- 执行actionTest模块的processActionForAPITest方法,参数是array @2
|
||||
|
||||
*/
|
||||
|
||||
@@ -22,8 +25,11 @@ su('admin');
|
||||
|
||||
$actionTest = new actionTest();
|
||||
|
||||
r($actionTest->processActionForAPITest(array((object)array('id' => 1, 'actor' => 'admin', 'action' => 'created', 'objectType' => 'task', 'objectID' => 1, 'date' => '2023-01-01 10:00:00', 'comment' => '', 'extra' => '', 'history' => false)), array('admin' => 'admin'), array())) && p() && e('1');
|
||||
r(count($actionTest->processActionForAPITest(array((object)array('id' => 1, 'actor' => 'admin', 'action' => 'created', 'objectType' => 'task', 'objectID' => 1, 'date' => '2023-01-01 10:00:00', 'comment' => '', 'extra' => '', 'history' => false)), array('admin' => 'admin'), array()))) && p() && e('1');
|
||||
r($actionTest->processActionForAPITest(array((object)array('id' => 2, 'actor' => 'user1', 'action' => 'assigned', 'objectType' => 'task', 'objectID' => 2, 'date' => '2023-01-02 10:00:00', 'comment' => '', 'extra' => 'user2', 'history' => false)), array('user1' => 'user1', 'user2' => 'user2'), array())) && p('0:extra') && e('user2');
|
||||
r($actionTest->processActionForAPITest(array(), array(), array())) && p() && e('0');
|
||||
r(count($actionTest->processActionForAPITest(array(), array(), array()))) && p() && e('0');
|
||||
r($actionTest->processActionForAPITest(array((object)array('id' => 3, 'actor' => 'admin', 'action' => 'assigned', 'objectType' => 'task', 'objectID' => 3, 'date' => '2023-01-03 10:00:00', 'comment' => '', 'extra' => 'user1', 'history' => false)), array('admin' => 'admin', 'user1' => 'user1'), array())) && p('0:actor') && e('admin');
|
||||
r($actionTest->processActionForAPITest(array((object)array('id' => 4, 'actor' => 'admin', 'action' => 'edited', 'objectType' => 'task', 'objectID' => 4, 'date' => '2023-01-04 10:00:00', 'comment' => '', 'extra' => '', 'history' => array((object)array('field' => 'status', 'old' => 'wait', 'new' => 'doing')))), array('admin' => 'admin'), array('status' => '状态'))) && p('0:history:0:fieldName') && e('状态');
|
||||
r($actionTest->processActionForAPIHistoryTest(array((object)array('id' => 4, 'actor' => 'admin', 'action' => 'edited', 'objectType' => 'task', 'objectID' => 4, 'date' => '2023-01-04 10:00:00', 'comment' => '', 'extra' => '', 'history' => array((object)array('field' => 'status', 'old' => 'wait', 'new' => 'doing')))), array('admin' => 'admin'), array('status' => '状态'))) && p() && e('状态');
|
||||
r($actionTest->processActionForAPITest(array((object)array('id' => 5, 'actor' => 'domain:user1', 'action' => 'created', 'objectType' => 'task', 'objectID' => 5, 'date' => '2023-01-05 10:00:00', 'comment' => '', 'extra' => '', 'history' => false)), array(), array())) && p('0:actor') && e('user1');
|
||||
r($actionTest->processActionForAPITest(array((object)array('id' => 6, 'actor' => 'unknown', 'action' => 'created', 'objectType' => 'task', 'objectID' => 6, 'date' => '2023-01-06 10:00:00', 'comment' => '', 'extra' => '', 'history' => false)), array(), array())) && p('0:actor') && e('unknown');
|
||||
r(count($actionTest->processActionForAPITest(array((object)array('id' => 7, 'actor' => 'admin', 'action' => 'created', 'objectType' => 'task', 'objectID' => 7, 'date' => '2023-01-07 10:00:00', 'comment' => '', 'extra' => '', 'history' => false), (object)array('id' => 8, 'actor' => 'user1', 'action' => 'edited', 'objectType' => 'bug', 'objectID' => 8, 'date' => '2023-01-08 10:00:00', 'comment' => '', 'extra' => '', 'history' => false)), array('admin' => 'admin', 'user1' => 'user1'), array()))) && p() && e('2');
|
||||
Reference in New Issue
Block a user