PageRenderTime 46ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/testcases/testcaseCommands.class.php

https://bitbucket.org/pfernandez/testlink1.9.6
PHP | 698 lines | 437 code | 105 blank | 156 comment | 12 complexity | aa9dfc66a9974ef487c034650e0c1cd8 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, GPL-3.0
  1. <?php
  2. /**
  3. * TestLink Open Source Project - http://testlink.sourceforge.net/
  4. * This script is distributed under the GNU General Public License 2 or later.
  5. *
  6. * testcases commands
  7. *
  8. * @package TestLink
  9. * @author Francisco Mancardi - francisco.mancardi@gmail.com
  10. * @copyright 2007-2009, TestLink community
  11. * @version CVS: $Id: testcaseCommands.class.php,v 1.47 2010/08/08 10:42:25 franciscom Exp $
  12. * @link http://www.teamst.org/index.php
  13. *
  14. *
  15. * @internal revisions
  16. * 20100808 - franciscom - initGuiBean() - added steps key to remove error display from event viewer
  17. * 20100716 - eloff - BUGID 3610 - fixes missing steps_results_layout in $gui
  18. * 20100625 - asimon - refactoring for new filter features,
  19. * replaced refresh_tree and do_refresh by refreshTree,
  20. * also replaced refreshTree values yes and no by 1 and 0 to avoid problems
  21. * 20100605 - franciscom - BUGID 3377
  22. * 20100403 - Julian - BUGID 3441 - Removed Call-time pass-by-reference on function call
  23. * editStep() in function doUpdateStep()
  24. * 20100403 - franciscom - BUGID 3359 - doCopyStep
  25. * 20100327 - franciscom - improvements in goback logic
  26. * 20100326 - franciscom - BUGID 3326: Editing a test step: execution type always "Manual"
  27. * 20100123 - franciscom - added logic to check for step number existence
  28. * added missing method doDeleteStep()
  29. * 20100106 - franciscom - Multiple Test Case Steps Feature
  30. * 20090831 - franciscom - preconditions
  31. * BUGID 2364 - changes in show() calls
  32. * BUGID - doAdd2testplan() - added user id, con call to link_tcversions()
  33. **/
  34. class testcaseCommands
  35. {
  36. private $db;
  37. private $tcaseMgr;
  38. private $templateCfg;
  39. private $execution_types;
  40. private $grants;
  41. function __construct(&$db)
  42. {
  43. $this->db=$db;
  44. $this->tcaseMgr = new testcase($db);
  45. $this->execution_types = $this->tcaseMgr->get_execution_types();
  46. $this->grants=new stdClass();
  47. $this->grants->requirement_mgmt=has_rights($db,"mgt_modify_req");
  48. }
  49. function setTemplateCfg($cfg)
  50. {
  51. $this->templateCfg=$cfg;
  52. }
  53. /**
  54. *
  55. *
  56. */
  57. function initGuiBean(&$argsObj)
  58. {
  59. $obj = new stdClass();
  60. $obj->action = '';
  61. $obj->attachments = null;
  62. $obj->cleanUpWebEditor = false;
  63. $obj->containerID = '';
  64. $obj->direct_link = null;
  65. $obj->execution_types = $this->execution_types;
  66. $obj->grants = $this->grants;
  67. $obj->has_been_executed = false;
  68. $obj->initWebEditorFromTemplate = false;
  69. $obj->main_descr = '';
  70. $obj->name = '';
  71. $obj->refreshTree=0;
  72. $obj->sqlResult = '';
  73. $obj->step_id = -1;
  74. $obj->step_set = '';
  75. $obj->steps = '';
  76. $obj->tableColspan = 5;
  77. $obj->tcase_id = property_exists($argsObj,'tcase_id') ? $argsObj->tcase_id : -1;
  78. // BUGID 3493
  79. $p2check = 'goback_url';
  80. $obj->$p2check = '';
  81. if( property_exists($argsObj,$p2check) )
  82. {
  83. $obj->$p2check = !is_null($argsObj->$p2check) ? $argsObj->$p2check : '';
  84. }
  85. $p2check = 'show_mode';
  86. if( property_exists($argsObj,$p2check) )
  87. {
  88. $obj->$p2check = !is_null($argsObj->$p2check) ? $argsObj->$p2check : 'show';
  89. }
  90. // need to check where is used
  91. $obj->loadOnCancelURL = "archiveData.php?edit=testcase&show_mode={$obj->show_mode}&id=%s&version_id=%s";
  92. return $obj;
  93. }
  94. /**
  95. *
  96. *
  97. */
  98. function create(&$argsObj,&$otCfg,$oWebEditorKeys)
  99. {
  100. $guiObj = $this->initGuiBean($argsObj);
  101. $guiObj->initWebEditorFromTemplate = true;
  102. $importance_default = config_get('testcase_importance_default');
  103. $tc_default=array('id' => 0, 'name' => '', 'importance' => $importance_default,
  104. 'execution_type' => TESTCASE_EXECUTION_TYPE_MANUAL);
  105. $guiObj->containerID = $argsObj->container_id;
  106. if($argsObj->container_id > 0)
  107. {
  108. $pnode_info = $this->tcaseMgr->tree_manager->get_node_hierarchy_info($argsObj->container_id);
  109. $node_descr = array_flip($this->tcaseMgr->tree_manager->get_available_node_types());
  110. $guiObj->parent_info['name'] = $pnode_info['name'];
  111. $guiObj->parent_info['description'] = lang_get($node_descr[$pnode_info['node_type_id']]);
  112. }
  113. $sep_1 = config_get('gui_title_separator_1');
  114. $sep_2 = config_get('gui_title_separator_2');
  115. $guiObj->main_descr = $guiObj->parent_info['description'] . $sep_1 . $guiObj->parent_info['name'] .
  116. $sep_2 . lang_get('title_new_tc');
  117. $otCfg->to->map = array();
  118. keywords_opt_transf_cfg($otCfg,'');
  119. $cfPlaces = $this->tcaseMgr->buildCFLocationMap();
  120. foreach($cfPlaces as $locationKey => $locationFilter)
  121. {
  122. $guiObj->cf[$locationKey] =
  123. $this->tcaseMgr->html_table_of_custom_field_inputs(null,null,'design','',null,null,
  124. $argsObj->testproject_id,$locationFilter);
  125. }
  126. $guiObj->tc=$tc_default;
  127. $guiObj->opt_cfg=$otCfg;
  128. $templateCfg = templateConfiguration('tcNew');
  129. $guiObj->template=$templateCfg->default_template;
  130. return $guiObj;
  131. }
  132. /**
  133. *
  134. *
  135. */
  136. function doCreate(&$argsObj,&$otCfg,$oWebEditorKeys)
  137. {
  138. $guiObj = $this->create($argsObj,$otCfg,$oWebEditorKeys);
  139. // compute order
  140. $new_order = config_get('treemenu_default_testcase_order');
  141. $nt2exclude=array('testplan' => 'exclude_me','requirement_spec'=> 'exclude_me','requirement'=> 'exclude_me');
  142. $siblings = $this->tcaseMgr->tree_manager->get_children($argsObj->container_id,$nt2exclude);
  143. if( !is_null($siblings) )
  144. {
  145. $dummy = end($siblings);
  146. $new_order = $dummy['node_order']+1;
  147. }
  148. $options = array('check_duplicate_name' => config_get('check_names_for_duplicates'),
  149. 'action_on_duplicate_name' => 'block');
  150. $tcase = $this->tcaseMgr->create($argsObj->container_id,$argsObj->name,$argsObj->summary,$argsObj->preconditions,
  151. $argsObj->tcaseSteps,$argsObj->user_id,$argsObj->assigned_keywords_list,
  152. $new_order,testcase::AUTOMATIC_ID,
  153. $argsObj->exec_type,$argsObj->importance,$options);
  154. if($tcase['status_ok'])
  155. {
  156. $cf_map = $this->tcaseMgr->cfield_mgr->get_linked_cfields_at_design($argsObj->testproject_id,ENABLED,
  157. NO_FILTER_SHOW_ON_EXEC,'testcase') ;
  158. // BUGID 3162 - generated by not passing 3 argument
  159. $this->tcaseMgr->cfield_mgr->design_values_to_db($_REQUEST,$tcase['id'],$cf_map);
  160. $guiObj->user_feedback = sprintf(lang_get('tc_created'),$argsObj->name);
  161. $guiObj->sqlResult = 'ok';
  162. $guiObj->initWebEditorFromTemplate = true;
  163. $guiObj->cleanUpWebEditor = true;
  164. $opt_list = '';
  165. }
  166. elseif(isset($tcase['msg']))
  167. {
  168. $guiObj->user_feedback = lang_get('error_tc_add');
  169. $guiObj->user_feedback .= '' . $tcase['msg'];
  170. $guiObj->sqlResult = 'ko';
  171. $opt_list = $argsObj->assigned_keywords_list;
  172. $guiObj->initWebEditorFromTemplate = false;
  173. }
  174. keywords_opt_transf_cfg($otCfg, $opt_list);
  175. $guiObj->opt_cfg=$otCfg;
  176. $templateCfg = templateConfiguration('tcNew');
  177. $guiObj->template=$templateCfg->default_template;
  178. return $guiObj;
  179. }
  180. /*
  181. function: edit (Test Case)
  182. args:
  183. returns:
  184. */
  185. function edit(&$argsObj,&$otCfg,$oWebEditorKeys)
  186. {
  187. $guiObj = $this->initGuiBean($argsObj);
  188. $otCfg->to->map = $this->tcaseMgr->get_keywords_map($argsObj->tcase_id," ORDER BY keyword ASC ");
  189. keywords_opt_transf_cfg($otCfg, $argsObj->assigned_keywords_list);
  190. $tc_data = $this->tcaseMgr->get_by_id($argsObj->tcase_id,$argsObj->tcversion_id);
  191. foreach($oWebEditorKeys as $key)
  192. {
  193. $guiObj->$key = isset($tc_data[0][$key]) ? $tc_data[0][$key] : '';
  194. $argsObj->$key = $guiObj->$key;
  195. }
  196. $cf_smarty = null;
  197. $cfPlaces = $this->tcaseMgr->buildCFLocationMap();
  198. foreach($cfPlaces as $locationKey => $locationFilter)
  199. {
  200. $cf_smarty[$locationKey] =
  201. $this->tcaseMgr->html_table_of_custom_field_inputs($argsObj->tcase_id,null,'design','',
  202. null,null,null,$locationFilter);
  203. }
  204. $templateCfg = templateConfiguration('tcEdit');
  205. $guiObj->cf = $cf_smarty;
  206. $guiObj->tc=$tc_data[0];
  207. $guiObj->opt_cfg=$otCfg;
  208. $guiObj->template=$templateCfg->default_template;
  209. return $guiObj;
  210. }
  211. /*
  212. function: doUpdate
  213. args:
  214. returns:
  215. */
  216. function doUpdate(&$argsObj,$request)
  217. {
  218. $smartyObj = new TLSmarty();
  219. $viewer_args=array();
  220. $guiObj = $this->initGuiBean($argsObj);
  221. $guiObj->refreshTree=$argsObj->refreshTree ? 1 : 0;
  222. $guiObj->has_been_executed = $argsObj->has_been_executed;
  223. // BUGID 3610
  224. $guiObj->steps_results_layout = config_get('spec_cfg')->steps_results_layout;
  225. // to get the name before the user operation
  226. $tc_old = $this->tcaseMgr->get_by_id($argsObj->tcase_id,$argsObj->tcversion_id);
  227. $ret=$this->tcaseMgr->update($argsObj->tcase_id, $argsObj->tcversion_id, $argsObj->name,
  228. $argsObj->summary, $argsObj->preconditions, $argsObj->tcaseSteps,
  229. $argsObj->user_id,$argsObj->assigned_keywords_list,
  230. testcase::DEFAULT_ORDER, $argsObj->exec_type, $argsObj->importance);
  231. if($ret['status_ok'])
  232. {
  233. $guiObj->refreshTree=1;
  234. $guiObj->user_feedback = '';
  235. $ENABLED = 1;
  236. $NO_FILTERS = null;
  237. $cf_map = $this->tcaseMgr->cfield_mgr->get_linked_cfields_at_design($argsObj->testproject_id,
  238. $ENABLED,$NO_FILTERS,'testcase') ;
  239. // BUGID 3162 - generated by not passing 3 argument
  240. $this->tcaseMgr->cfield_mgr->design_values_to_db($request,$argsObj->tcase_id,$cf_map);
  241. $guiObj->attachments[$argsObj->tcase_id] = getAttachmentInfosFrom($this->tcaseMgr,$argsObj->tcase_id);
  242. }
  243. else
  244. {
  245. $guiObj->refreshTree=0;
  246. $guiObj->user_feedback = $ret['msg'];
  247. }
  248. $viewer_args['refreshTree'] = $guiObj->refreshTree;
  249. $viewer_args['user_feedback'] = $guiObj->user_feedback;
  250. $this->tcaseMgr->show($smartyObj,$guiObj, $this->templateCfg->template_dir,
  251. $argsObj->tcase_id,$argsObj->tcversion_id,$viewer_args,null,$argsObj->show_mode);
  252. return $guiObj;
  253. }
  254. /**
  255. * doAdd2testplan
  256. *
  257. */
  258. function doAdd2testplan(&$argsObj,$request)
  259. {
  260. $smartyObj = new TLSmarty();
  261. $smartyObj->assign('attachments',null);
  262. $guiObj = $this->initGuiBean($argsObj);
  263. $viewer_args=array();
  264. $tplan_mgr = new testplan($this->db);
  265. $guiObj->refreshTree = $argsObj->refreshTree? 1 : 0;
  266. $item2link = null;
  267. // $request['add2tplanid']
  268. // main key: testplan id
  269. // sec key : platform_id
  270. if( isset($request['add2tplanid']) )
  271. {
  272. foreach($request['add2tplanid'] as $tplan_id => $platformSet)
  273. {
  274. foreach($platformSet as $platform_id => $dummy)
  275. {
  276. $item2link = null;
  277. $item2link['tcversion'][$argsObj->tcase_id] = $argsObj->tcversion_id;
  278. $item2link['platform'][$platform_id] = $platform_id;
  279. $item2link['items'][$argsObj->tcase_id][$platform_id] = $argsObj->tcversion_id;
  280. $tplan_mgr->link_tcversions($tplan_id,$item2link,$argsObj->user_id);
  281. }
  282. }
  283. $this->tcaseMgr->show($smartyObj,$guiObj,$this->templateCfg->template_dir,
  284. $argsObj->tcase_id,$argsObj->tcversion_id,$viewer_args);
  285. }
  286. return $guiObj;
  287. }
  288. /**
  289. * add2testplan - is really needed???? 20090308 - franciscom - TO DO
  290. *
  291. */
  292. function add2testplan(&$argsObj,$request)
  293. {
  294. // $smartyObj = new TLSmarty();
  295. // $guiObj=new stdClass();
  296. // $viewer_args=array();
  297. // $tplan_mgr = new testplan($this->db);
  298. //
  299. // $guiObj->refresh_tree=$argsObj->do_refresh?"yes":"no";
  300. //
  301. // $item2link[$argsObj->tcase_id]=$argsObj->tcversion_id;
  302. // foreach($request['add2tplanid'] as $tplan_id => $value)
  303. // {
  304. // $tplan_mgr->link_tcversions($tplan_id,$item2link);
  305. // }
  306. // $this->tcaseMgr->show($smartyObj,$this->templateCfg->template_dir,
  307. // $argsObj->tcase_id,$argsObj->tcversion_id,$viewer_args);
  308. //
  309. // return $guiObj;
  310. }
  311. /**
  312. *
  313. *
  314. */
  315. function delete(&$argsObj,$request)
  316. {
  317. $guiObj = $this->initGuiBean($argsObj);
  318. $guiObj->delete_message = '';
  319. $cfg = config_get('testcase_cfg');
  320. $my_ret = $this->tcaseMgr->check_link_and_exec_status($argsObj->tcase_id);
  321. $guiObj->exec_status_quo = $this->tcaseMgr->get_exec_status($argsObj->tcase_id);
  322. // Need to be analysed seem wrong
  323. // switch($my_ret)
  324. // {
  325. // case "linked_and_executed":
  326. // $guiObj->exec_status_quo = lang_get('warning') . TITLE_SEP . lang_get('delete_linked_and_exec');
  327. // break;
  328. //
  329. // case "linked_but_not_executed":
  330. // $guiObj->exec_status_quo = lang_get('warning') . TITLE_SEP . lang_get('delete_linked');
  331. // break;
  332. // }
  333. $tcinfo = $this->tcaseMgr->get_by_id($argsObj->tcase_id);
  334. list($prefix,$root) = $this->tcaseMgr->getPrefix($argsObj->tcase_id,$argsObj->testproject_id);
  335. $prefix .= $cfg->glue_character;
  336. $external_id = $prefix . $tcinfo[0]['tc_external_id'];
  337. $guiObj->title = lang_get('title_del_tc');
  338. $guiObj->testcase_name = $tcinfo[0]['name'];
  339. $guiObj->testcase_id = $argsObj->tcase_id;
  340. $guiObj->tcversion_id = testcase::ALL_VERSIONS;
  341. $guiObj->refreshTree = 1;
  342. $guiObj->main_descr = lang_get('title_del_tc') . TITLE_SEP . $external_id . TITLE_SEP . $tcinfo[0]['name'];
  343. $templateCfg = templateConfiguration('tcDelete');
  344. $guiObj->template=$templateCfg->default_template;
  345. return $guiObj;
  346. }
  347. /**
  348. *
  349. *
  350. */
  351. function doDelete(&$argsObj,$request)
  352. {
  353. $cfg = config_get('testcase_cfg');
  354. $guiObj = $this->initGuiBean($argsObj);
  355. $guiObj->user_feedback = '';
  356. $guiObj->delete_message = '';
  357. $guiObj->action = 'deleted';
  358. $guiObj->sqlResult = 'ok';
  359. $tcinfo = $this->tcaseMgr->get_by_id($argsObj->tcase_id,$argsObj->tcversion_id);
  360. list($prefix,$root) = $this->tcaseMgr->getPrefix($argsObj->tcase_id,$argsObj->testproject_id);
  361. $prefix .= $cfg->glue_character;
  362. $external_id = $prefix . $tcinfo[0]['tc_external_id'];
  363. if (!$this->tcaseMgr->delete($argsObj->tcase_id,$argsObj->tcversion_id))
  364. {
  365. $guiObj->action = '';
  366. $guiObj->sqlResult = $this->tcaseMgr->db->error_msg();
  367. }
  368. else
  369. {
  370. $guiObj->user_feedback = sprintf(lang_get('tc_deleted'), ":" . $external_id . TITLE_SEP . $tcinfo[0]['name']);
  371. }
  372. $guiObj->main_descr = lang_get('title_del_tc') . ":" . $external_id . TITLE_SEP . htmlspecialchars($tcinfo[0]['name']);
  373. // 20080706 - refresh must be forced to avoid a wrong tree situation.
  374. // if tree is not refreshed and user click on deleted test case he/she
  375. // will get a SQL error
  376. // $refresh_tree = $cfg->spec->automatic_tree_refresh ? "yes" : "no";
  377. $guiObj->refreshTree = 1;
  378. // When deleting JUST one version, there is no need to refresh tree
  379. if($argsObj->tcversion_id != testcase::ALL_VERSIONS)
  380. {
  381. $guiObj->main_descr .= " " . lang_get('version') . " " . $tcinfo[0]['version'];
  382. $guiObj->refreshTree = 0;
  383. $guiObj->user_feedback = sprintf(lang_get('tc_version_deleted'),$tcinfo[0]['name'],$tcinfo[0]['version']);
  384. }
  385. $guiObj->testcase_name = $tcinfo[0]['name'];
  386. $guiObj->testcase_id = $argsObj->tcase_id;
  387. $templateCfg = templateConfiguration('tcDelete');
  388. $guiObj->template=$templateCfg->default_template;
  389. return $guiObj;
  390. }
  391. /**
  392. * createStep
  393. *
  394. */
  395. function createStep(&$argsObj,$request)
  396. {
  397. $guiObj = $this->initGuiBean($argsObj);
  398. $tcaseInfo = $this->tcaseMgr->get_basic_info($argsObj->tcase_id,$argsObj->tcversion_id);
  399. $external = $this->tcaseMgr->getExternalID($tcaseInfo[0]['id'],$argsObj->testproject_id);
  400. $guiObj->main_descr = sprintf(lang_get('create_step'), $external[0] . ':' . $tcaseInfo[0]['name'],
  401. $tcaseInfo[0]['version']);
  402. $max_step = $this->tcaseMgr->get_latest_step_number($argsObj->tcversion_id);
  403. $max_step++;;
  404. $guiObj->step_number = $max_step;
  405. $guiObj->step_exec_type = TESTCASE_EXECUTION_TYPE_MANUAL;
  406. $guiObj->tcversion_id = $argsObj->tcversion_id;
  407. $guiObj->step_set = $this->tcaseMgr->get_step_numbers($argsObj->tcversion_id);
  408. $guiObj->step_set = is_null($guiObj->step_set) ? '' : implode(",",array_keys($guiObj->step_set));
  409. $guiObj->loadOnCancelURL = sprintf($guiObj->loadOnCancelURL,$tcaseInfo[0]['id'],$argsObj->tcversion_id);
  410. // Get all existent steps
  411. $guiObj->tcaseSteps = $this->tcaseMgr->get_steps($argsObj->tcversion_id);
  412. $templateCfg = templateConfiguration('tcStepEdit');
  413. $guiObj->template=$templateCfg->default_template;
  414. $guiObj->action = __FUNCTION__;
  415. return $guiObj;
  416. }
  417. /**
  418. * doCreateStep
  419. *
  420. */
  421. function doCreateStep(&$argsObj,$request)
  422. {
  423. $guiObj = $this->initGuiBean($argsObj);
  424. $guiObj->user_feedback = '';
  425. $guiObj->step_exec_type = $argsObj->exec_type;
  426. $guiObj->tcversion_id = $argsObj->tcversion_id;
  427. $tcaseInfo = $this->tcaseMgr->get_basic_info($argsObj->tcase_id,$argsObj->tcversion_id);
  428. $external = $this->tcaseMgr->getExternalID($tcaseInfo[0]['id'],$argsObj->testproject_id);
  429. $guiObj->main_descr = sprintf(lang_get('create_step'), $external[0] . ':' . $tcaseInfo[0]['name'],
  430. $tcaseInfo[0]['version']);
  431. $new_step = $this->tcaseMgr->get_latest_step_number($argsObj->tcversion_id);
  432. $new_step++;
  433. $op = $this->tcaseMgr->create_step($argsObj->tcversion_id,$new_step,
  434. $argsObj->steps,$argsObj->expected_results,$argsObj->exec_type);
  435. if( $op['status_ok'] )
  436. {
  437. $guiObj->user_feedback = sprintf(lang_get('step_number_x_created'),$argsObj->step_number);
  438. $guiObj->step_exec_type = TESTCASE_EXECUTION_TYPE_MANUAL;
  439. $guiObj->cleanUpWebEditor = true;
  440. }
  441. $guiObj->action = __FUNCTION__;
  442. // Get all existent steps
  443. $guiObj->tcaseSteps = $this->tcaseMgr->get_steps($argsObj->tcversion_id);
  444. $max_step = $this->tcaseMgr->get_latest_step_number($argsObj->tcversion_id);
  445. $max_step++;;
  446. $guiObj->step_number = $max_step;
  447. $guiObj->step_set = $this->tcaseMgr->get_step_numbers($argsObj->tcversion_id);
  448. $guiObj->step_set = is_null($guiObj->step_set) ? '' : implode(",",array_keys($guiObj->step_set));
  449. $guiObj->loadOnCancelURL = sprintf($guiObj->loadOnCancelURL,$tcaseInfo[0]['id'],$argsObj->tcversion_id);
  450. $templateCfg = templateConfiguration('tcStepEdit');
  451. $guiObj->template=$templateCfg->default_template;
  452. return $guiObj;
  453. }
  454. /**
  455. * editStep
  456. *
  457. */
  458. function editStep(&$argsObj,$request)
  459. {
  460. $guiObj = $this->initGuiBean($argsObj);
  461. $guiObj->user_feedback = '';
  462. $tcaseInfo = $this->tcaseMgr->get_basic_info($argsObj->tcase_id,$argsObj->tcversion_id);
  463. $external = $this->tcaseMgr->getExternalID($argsObj->tcase_id,$argsObj->testproject_id);
  464. $stepInfo = $this->tcaseMgr->get_step_by_id($argsObj->step_id);
  465. $oWebEditorKeys = array('steps' => 'actions', 'expected_results' => 'expected_results');
  466. foreach($oWebEditorKeys as $key => $field)
  467. {
  468. $argsObj->$key = $stepInfo[$field];
  469. $guiObj->$key = $stepInfo[$field];
  470. }
  471. $guiObj->main_descr = sprintf(lang_get('edit_step_number_x'),$stepInfo['step_number'],
  472. $external[0] . ':' . $tcaseInfo[0]['name'], $tcaseInfo[0]['version']);
  473. $guiObj->tcase_id = $argsObj->tcase_id;
  474. $guiObj->tcversion_id = $argsObj->tcversion_id;
  475. $guiObj->step_id = $argsObj->step_id;
  476. $guiObj->step_exec_type = $stepInfo['execution_type'];
  477. $guiObj->step_number = $stepInfo['step_number']; // BUGID 3326: Editing a test step: execution type always "Manual"
  478. // Get all existent steps
  479. $guiObj->tcaseSteps = $this->tcaseMgr->get_steps($argsObj->tcversion_id);
  480. $guiObj->step_set = $this->tcaseMgr->get_step_numbers($argsObj->tcversion_id);
  481. $guiObj->step_set = is_null($guiObj->step_set) ? '' : implode(",",array_keys($guiObj->step_set));
  482. $templateCfg = templateConfiguration('tcStepEdit');
  483. $guiObj->template=$templateCfg->default_template;
  484. $guiObj->loadOnCancelURL = sprintf($guiObj->loadOnCancelURL,$argsObj->tcase_id,$argsObj->tcversion_id);
  485. return $guiObj;
  486. }
  487. /**
  488. * doUpdateStep
  489. *
  490. */
  491. function doUpdateStep(&$argsObj,$request)
  492. {
  493. $guiObj = $this->initGuiBean($argsObj);
  494. $guiObj->user_feedback = '';
  495. $tcaseInfo = $this->tcaseMgr->get_basic_info($argsObj->tcase_id,$argsObj->tcversion_id);
  496. $external = $this->tcaseMgr->getExternalID($argsObj->tcase_id,$argsObj->testproject_id);
  497. $stepInfo = $this->tcaseMgr->get_step_by_id($argsObj->step_id);
  498. $guiObj->main_descr = sprintf(lang_get('edit_step_number_x'),$stepInfo['step_number'],
  499. $external[0] . ':' . $tcaseInfo[0]['name'], $tcaseInfo[0]['version']);
  500. $op = $this->tcaseMgr->update_step($argsObj->step_id,$argsObj->step_number,$argsObj->steps,
  501. $argsObj->expected_results,$argsObj->exec_type);
  502. $guiObj->tcversion_id = $argsObj->tcversion_id;
  503. $guiObj->step_id = $argsObj->step_id;
  504. $guiObj->step_number = $stepInfo['step_number'];
  505. $guiObj->step_exec_type = $argsObj->exec_type;
  506. // 20100403
  507. // Want to remain on same screen till user choose to cancel => go away
  508. // BUGID 3441
  509. $guiObj = $this->editStep($argsObj,$request);
  510. return $guiObj;
  511. }
  512. /**
  513. * doReorderSteps
  514. *
  515. */
  516. function doReorderSteps(&$argsObj,$request)
  517. {
  518. $guiObj = $this->initGuiBean($argsObj);
  519. $tcaseInfo = $this->tcaseMgr->get_basic_info($argsObj->tcase_id,$argsObj->tcversion_id);
  520. $external = $this->tcaseMgr->getExternalID($argsObj->tcase_id,$argsObj->testproject_id);
  521. $guiObj->main_descr = lang_get('test_case');
  522. $this->tcaseMgr->set_step_number($argsObj->step_set);
  523. $guiObj->template="archiveData.php?version_id={$argsObj->tcversion_id}&" .
  524. "edit=testcase&id={$argsObj->tcase_id}&show_mode={$guiObj->show_mode}";
  525. return $guiObj;
  526. }
  527. /**
  528. * doDeleteStep
  529. *
  530. */
  531. function doDeleteStep(&$argsObj,$request)
  532. {
  533. $guiObj = $this->initGuiBean($argsObj); // BUGID 3493
  534. $viewer_args=array();
  535. $guiObj->refreshTree = 0;
  536. $step_node = $this->tcaseMgr->tree_manager->get_node_hierarchy_info($argsObj->step_id);
  537. $tcversion_node = $this->tcaseMgr->tree_manager->get_node_hierarchy_info($step_node['parent_id']);
  538. $tcversion_id = $step_node['parent_id'];
  539. $tcase_id = $tcversion_node['parent_id'];
  540. $guiObj->template="archiveData.php?version_id={$tcversion_id}&" .
  541. "edit=testcase&id={$tcase_id}&show_mode={$guiObj->show_mode}";
  542. $guiObj->user_feedback = '';
  543. $op = $this->tcaseMgr->delete_step_by_id($argsObj->step_id);
  544. return $guiObj;
  545. }
  546. /**
  547. * doCopyStep
  548. *
  549. */
  550. function doCopyStep(&$argsObj,$request)
  551. {
  552. $guiObj = $this->initGuiBean($argsObj);
  553. $guiObj->user_feedback = '';
  554. $guiObj->step_exec_type = $argsObj->exec_type;
  555. $guiObj->tcversion_id = $argsObj->tcversion_id;
  556. // need to document difference bewteen these two similar concepts
  557. $guiObj->action = __FUNCTION__;
  558. $guiObj->operation = 'doUpdateStep';
  559. $tcaseInfo = $this->tcaseMgr->get_basic_info($argsObj->tcase_id,$argsObj->tcversion_id);
  560. $external = $this->tcaseMgr->getExternalID($tcaseInfo[0]['id'],$argsObj->testproject_id);
  561. $guiObj->main_descr = sprintf(lang_get('edit_step_number_x'), $argsObj->step_number,
  562. $external[0] . ':' . $tcaseInfo[0]['name'], $tcaseInfo[0]['version']);
  563. $new_step = $this->tcaseMgr->get_latest_step_number($argsObj->tcversion_id);
  564. $new_step++;
  565. $source_info = $this->tcaseMgr->get_steps($argsObj->tcversion_id,$argsObj->step_number);
  566. $source_info = current($source_info);
  567. $op = $this->tcaseMgr->create_step($argsObj->tcversion_id,$new_step,$source_info['actions'],
  568. $source_info['expected_results'],$source_info['execution_type']);
  569. if( $op['status_ok'] )
  570. {
  571. $guiObj->user_feedback = sprintf(lang_get('step_number_x_created_as_copy'),$new_step,$argsObj->step_number);
  572. $guiObj->step_exec_type = TESTCASE_EXECUTION_TYPE_MANUAL;
  573. }
  574. // Get all existent steps
  575. $guiObj->tcaseSteps = $this->tcaseMgr->get_steps($argsObj->tcversion_id);
  576. // After copy I would like to return to target step in edit mode,
  577. // is enough to set $guiObj->step_number to target test step
  578. $guiObj->step_number = $argsObj->step_number;
  579. $guiObj->step_set = $this->tcaseMgr->get_step_numbers($argsObj->tcversion_id);
  580. $guiObj->step_set = is_null($guiObj->step_set) ? '' : implode(",",array_keys($guiObj->step_set));
  581. $guiObj->loadOnCancelURL = sprintf($guiObj->loadOnCancelURL,$tcaseInfo[0]['id'],$argsObj->tcversion_id);
  582. $templateCfg = templateConfiguration('tcStepEdit');
  583. $guiObj->template=$templateCfg->default_template;
  584. return $guiObj;
  585. }
  586. } // end class
  587. ?>