function remote_exec_testcase_set(&$db, $parent_id, $msg) { $cfield_manager = new cfield_mgr($db); $tree_manager = new tree($db); $xmlResponse = null; $executionResults = array(); $node_type = $tree_manager->get_available_node_types(); $subtree_list = $tree_manager->get_subtree($parent_id); foreach ($subtree_list as $_key => $_value) { if (is_array($_value)) { if ($_value['node_type_id'] == $node_type['testcase']) { $executionResults[$_value['id']] = executeTestCase($_value['id'], $tree_manager, $cfield_manager); } else { //Can add some logic here. If required. continue; } } } if ($executionResults) { foreach ($executionResults as $key => $value) { $node_info = $tree_manager->get_node_hierarchy_info($key); $xmlResponse .= '<tr><th colspan="2">' . lang_get('tcexec_results_for') . $node_info['name'] . "</th></tr>"; $serverTest = 1; foreach ($value as $_key => $_value) { if ($_value != -1) { $xmlResponse .= "<tr><td>" . $_key . ":</td><td>" . $_value . "</td></tr>"; } else { $serverTest = $serverTest + 1; } } if ($serverTest != 1) { $xmlResponse .= $xmlResponse .= $msg['check_server_setting']; } } } return $xmlResponse; }
* @version CVS: $Id: checkTCaseDuplicateName.php,v 1.3 2010/10/10 13:41:13 franciscom Exp $ * * @internal Revisions: * 20101010 - franciscom - added testsuite_id as parameter, needed to do checks when creating test case * 20100225 - eloff - initial commit * **/ require_once '../../config.inc.php'; require_once 'common.php'; testlinkInitPage($db); $data = array('success' => true, 'message' => ''); $iParams = array("name" => array(tlInputParameter::STRING_N, 0, 100), "testcase_id" => array(tlInputParameter::INT), "testsuite_id" => array(tlInputParameter::INT)); $args = G_PARAMS($iParams); if (has_rights($db, 'mgt_view_tc')) { $tree_manager = new tree($db); $node_types_descr_id = $tree_manager->get_available_node_types(); // To allow name check when creating a NEW test case => we do not have test case id $args['testcase_id'] = $args['testcase_id'] > 0 ? $args['testcase_id'] : null; $args['testsuite_id'] = $args['testsuite_id'] > 0 ? $args['testsuite_id'] : null; // for debug - // $xx = "\$args['testcase_id']:{$args['testcase_id']} - \$args['name']:{$args['name']}" . // " - \$args['testsuite_id']:{$args['testsuite_id']}"; // file_put_contents('c:\checkTCaseDuplicateName.php.ajax', $xx); $check = $tree_manager->nodeNameExists($args['name'], $node_types_descr_id['testcase'], $args['testcase_id'], $args['testsuite_id']); $data['success'] = !$check['status']; $data['message'] = $check['msg']; } else { tLog('User has not right needed to do requested action - checkTCaseDuplicateName.php', 'ERROR'); $data['success'] = false; $data['message'] = lang_get('user_has_no_right_for_action'); }
* * * * rev : */ require_once '../../../config.inc.php'; require_once 'common.php'; require_once 'tree.class.php'; testlinkInitPage($db); echo "<pre> tree - constructor - tree(&\$db)"; echo "</pre>"; $tree_mgr = new tree($db); new dBug($tree_mgr); echo "<pre> tree - get_available_node_types()"; echo "</pre>"; $available_node_types = $tree_mgr->get_available_node_types(); new dBug($available_node_types); echo "<pre> tree - get_node_hierarchy_info(\$node_id)"; echo "</pre>"; $node_id = 1; echo "<pre> get_node_hierarchy_info({$node_id})"; echo "</pre>"; $node_hierachy_info = $tree_mgr->get_node_hierarchy_info($node_id); new dBug($node_hierachy_info); echo "<pre> tree - get_subtree(\$node_id)"; echo "</pre>"; echo "<pre> get_subtree({$node_id})"; echo "</pre>"; $subtree = $tree_mgr->get_subtree($node_id); new dBug($subtree); echo "<pre> tree - get_subtree(\$node_id,\$exclude_node_types=null," . "<br>" . " \$exclude_children_of=null,\$exclude_branches=null," . "<br>" . " \$and_not_in_clause='',\$bRecursive = false)";
function display_children($dbHandler, $root_node, $parent, $filter_node, $show_children = ON, $operation = 'manage', $mode = 'reqspec') { $tables = tlObjectWithDB::getDBTables(array('requirements', 'nodes_hierarchy', 'node_types', 'req_specs')); $cfg = config_get('req_cfg'); $forbidden_parent['testproject'] = 'none'; $forbidden_parent['requirement'] = 'testproject'; $forbidden_parent['requirement_spec'] = 'requirement_spec'; if ($cfg->child_requirements_mgmt) { $forbidden_parent['requirement_spec'] = 'none'; } $fn = array(); $fn['print']['reqspec'] = array('testproject' => 'TPROJECT_PTP_RS', 'requirement_spec' => 'TPROJECT_PRS', 'requirement' => 'openLinkedReqWindow'); $fn['manage']['reqspec'] = array('testproject' => 'TPROJECT_REQ_SPEC_MGMT', 'requirement_spec' => 'REQ_SPEC_MGMT', 'requirement' => 'REQ_MGMT'); $fn['print']['addtc'] = array('testproject' => 'TPROJECT_PTP', 'requirement_spec' => 'TPROJECT_PRS', 'requirement' => 'TPROJECT_PRS'); $fn['manage']['addtc'] = array('testproject' => 'EP', 'requirement_spec' => 'ERS', 'requirement' => 'ER'); switch ($operation) { case 'print': case 'manage': $js_function = $fn[$operation][$mode]; break; default: $js_function = $fn['manage'][$mode]; break; } $nodes = null; $filter_node_type = $show_children ? '' : ",'requirement'"; $sql = " SELECT NHA.*, NT.description AS node_type, RSPEC.doc_id " . " FROM {$tables['nodes_hierarchy']} NHA JOIN {$tables['node_types']} NT " . " ON NHA.node_type_id=NT.id " . " AND NT.description NOT IN " . " ('testcase','testsuite','testcase_version','testplan','requirement_spec_revision' {$filter_node_type}) " . " LEFT OUTER JOIN {$tables['req_specs']} RSPEC " . " ON RSPEC.id = NHA.id " . " WHERE NHA.parent_id = " . intval($parent); if (!is_null($filter_node) && $filter_node > 0 && $parent == $root_node) { $sql .= " AND NHA.id = " . intval($filter_node); } $sql .= " ORDER BY NHA.node_order "; $nodeSet = $dbHandler->get_recordset($sql); if (!is_null($nodeSet)) { $sql = " SELECT DISTINCT req_doc_id AS doc_id,NHA.id" . " FROM {$tables['requirements']} REQ JOIN {$tables['nodes_hierarchy']} NHA ON NHA.id = REQ.id " . " JOIN {$tables['nodes_hierarchy']} NHB ON NHA.parent_id = NHB.id " . " JOIN {$tables['node_types']} NT ON NT.id = NHA.node_type_id " . " WHERE NHB.id = " . intval($parent) . " AND NT.description = 'requirement'"; $requirements = $dbHandler->fetchRowsIntoMap($sql, 'id'); $treeMgr = new tree($dbHandler); $ntypes = $treeMgr->get_available_node_types(); $peerTypes = array('target' => $ntypes['requirement'], 'container' => $ntypes['requirement_spec']); foreach ($nodeSet as $key => $row) { $path['text'] = htmlspecialchars($row['name']); $path['id'] = $row['id']; // this attribute/property is used on custom code on drag and drop $path['position'] = $row['node_order']; $path['leaf'] = false; $path['cls'] = 'folder'; // Important: // We can add custom keys, and will be able to access it using // public property 'attributes' of object of Class Ext.tree.TreeNode // $path['testlink_node_type'] = $row['node_type']; $path['testlink_node_name'] = $path['text']; // already htmlspecialchars() done $path['forbidden_parent'] = 'none'; switch ($row['node_type']) { case 'testproject': $path['href'] = "javascript:EP({$path['id']})"; $path['forbidden_parent'] = $forbidden_parent[$row['node_type']]; break; case 'requirement_spec': $req_list = array(); $treeMgr->getAllItemsID($row['id'], $req_list, $peerTypes); $path['href'] = "javascript:" . $js_function[$row['node_type']] . "({$path['id']})"; $path['text'] = htmlspecialchars($row['doc_id'] . ":") . $path['text']; $path['forbidden_parent'] = $forbidden_parent[$row['node_type']]; if (!is_null($req_list)) { $item_qty = count($req_list); $path['text'] .= " ({$item_qty})"; } break; case 'requirement': $path['href'] = "javascript:" . $js_function[$row['node_type']] . "({$path['id']})"; $path['text'] = htmlspecialchars($requirements[$row['id']]['doc_id'] . ":") . $path['text']; $path['leaf'] = true; $path['forbidden_parent'] = $forbidden_parent[$row['node_type']]; break; } $nodes[] = $path; } // foreach } return $nodes; }
/** * Migrate custom field values AT DESIGN TIME, for test cases and requirements, * to point to item version instead of item: * test case version instead of test case * requirement version instead of requirement * * @author Francisco Mancardi * @param database $dbHandler * @param array $tableSet */ function migrate_cfield_links(&$dbHandler, $tableSet) { $treeMgr = new tree($dbHandler); $nodeTypes = $treeMgr->get_available_node_types(); unset($treeMgr); $sql = " SELECT CFDV.*, NHITEM.node_type_id, NHVERSION.id AS version_node_id" . " FROM {$tableSet['cfield_design_values']} CFDV " . " JOIN {$tableSet['nodes_hierarchy']} NHITEM ON NHITEM.id = CFDV.node_id " . " JOIN {$tableSet['nodes_hierarchy']} NHVERSION ON NHVERSION.parent_id = NHITEM.id " . " WHERE NHITEM.node_type_id IN ({$nodeTypes['testcase']},{$nodeTypes['requirement']}) "; $workingSet = $dbHandler->get_recordset($sql); echo 'Step - Custom Fields (DESIGN TIME) Migration - STARTED <br> '; if (!is_null($workingSet)) { echo "Working - Custom Fields Migration - Records to process:" . count($workingSet) . "<br>"; foreach ($workingSet as $target) { // $values[] = "( {$target['field_id']}, {$target['version_node_id']}, '{$target['value']}' )"; $victims[$target['node_id']] = $target['node_type_id']; // Ay!, I've forgot to escape target value $sql = " INSERT INTO {$tableSet['cfield_design_values']} (field_id,node_id,value) VALUES " . "( {$target['field_id']}, {$target['version_node_id']}," . "'" . $dbHandler->prepare_string($target['value']) . "' )"; $dbHandler->exec_query($sql); } // depending amount of data on db this can create an statement with too many characters // and can fail. // change to slower but safer strategy: one by one insert // $sql = " INSERT INTO {$tableSet['cfield_design_values']} (field_id,node_id,value) VALUES "; // $vSet = implode(',',$values); // $sql .= $vSet; // $dbHandler->exec_query($sql); foreach ($victims as $node_id => $node_type_id) { $sql = " DELETE FROM {$tableSet['cfield_design_values']} WHERE node_id = {$node_id} "; $dbHandler->exec_query($sql); } } echo 'Step - Custom Fields (DESIGN TIME) Migration - Finished !! <br><br> '; }
* @version $Revision: 1.4 $ * @modified $Date: 2010/09/17 18:26:09 $ $Author: franciscom $ * @author Francisco Mancardi - francisco.mancardi@gmail.com * * Migrate Custom field data from item to item version (1.9 RC1 and up) */ require_once "../../config.inc.php"; require_once "common.php"; testlinkInitPage($db); // Check if user has right role to execute if (!($_SESSION['currentUser']->globalRole->name == 'admin')) { echo 'You need to have admin role in order to use this page <b> '; die; } $treeMgr = new tree($db); $nodeTypes = $treeMgr->get_available_node_types(); unset($treeMgr); $tprojectMgr = new testproject($db); $tables = $tprojectMgr->getDBTables(array('nodes_hierarchy', 'cfield_design_values')); unset($tprojectSet); $sql = " SELECT CFDV.*, NHITEM.node_type_id, NHVERSION.id AS version_node_id" . " FROM {$tables['cfield_design_values']} CFDV " . " JOIN {$tables['nodes_hierarchy']} NHITEM ON NHITEM.id = CFDV.node_id " . " JOIN {$tables['nodes_hierarchy']} NHVERSION ON NHVERSION.parent_id = NHITEM.id " . " WHERE NHITEM.node_type_id IN ({$nodeTypes['testcase']},{$nodeTypes['requirement']}) "; $workingSet = $db->get_recordset($sql); echo 'Records to process: ' . count($workingSet) . '<br>'; if (!is_null($workingSet)) { foreach ($workingSet as $target) { $values[] = "( {$target['field_id']}, {$target['version_node_id']}, '{$target['value']}' )"; $victims[$target['node_id']] = $target['node_type_id']; } $sql = " INSERT INTO {$tables['cfield_design_values']} (field_id,node_id,value) VALUES "; $vSet = implode(',', $values); $sql .= $vSet;
/** * Migrate custom field values AT DESIGN TIME, for test cases and requirements, * to point to item version instead of item: * test case version instead of test case * requirement version instead of requirement * * @author Francisco Mancardi * @param database $dbHandler * @param array $tableSet */ function migrate_cfield_links(&$dbHandler, $tableSet) { $treeMgr = new tree($dbHandler); $nodeTypes = $treeMgr->get_available_node_types(); echo $nodesTypes['testcase']; unset($treeMgr); $sql = " SELECT CFDV.*, NHITEM.node_type_id, NHVERSION.id AS version_node_id" . " FROM {$tableSet['cfield_design_values']} CFDV " . " JOIN {$tableSet['nodes_hierarchy']} NHITEM ON NHITEM.id = CFDV.node_id " . " JOIN {$tableSet['nodes_hierarchy']} NHVERSION ON NHVERSION.parent_id = NHITEM.id " . " WHERE NHITEM.node_type_id IN ({$nodeTypes['testcase']},{$nodeTypes['requirement']}) "; $workingSet = $dbHandler->get_recordset($sql); echo 'Records to process: count($workingSet)<br>'; if (!is_null($workingSet)) { foreach ($workingSet as $target) { $values[] = "( {$target['field_id']}, {$target['version_node_id']}, '{$target['value']}' )"; $victims[$target['node_id']] = $target['node_type_id']; } $sql = " INSERT INTO {$tableSet['cfield_design_values']} (field_id,node_id,value) VALUES "; $vSet = implode(',', $values); $sql .= $vSet; $dbHandler->exec_query($sql); foreach ($victims as $node_id => $node_type_id) { $sql = " DELETE FROM {$tableSet['cfield_design_values']} WHERE node_id = {$node_id} "; $dbHandler->exec_query($sql); } } }
/** * migrate_testcases */ function migrate_testcases(&$dbHandler, $tableSet) { // TL 1.8 // -- // -- Table structure for table "tcversions" // -- // CREATE TABLE "tcversions" ( // "id" BIGINT NOT NULL DEFAULT '0' REFERENCES nodes_hierarchy (id), // "tc_external_id" INT NULL, // "version" INTEGER NOT NULL DEFAULT '1', // "summary" TEXT NULL DEFAULT NULL, // "steps" TEXT NULL DEFAULT NULL, // "expected_results" TEXT NULL DEFAULT NULL, // "importance" INT2 NOT NULL DEFAULT '2', // "author_id" BIGINT NULL DEFAULT NULL REFERENCES users (id), // "creation_ts" TIMESTAMP NOT NULL DEFAULT now(), // "updater_id" BIGINT NULL DEFAULT NULL REFERENCES users (id), // "modification_ts" TIMESTAMP NULL, // "active" INT2 NOT NULL DEFAULT '1', // "is_open" INT2 NOT NULL DEFAULT '1', // "execution_type" INT2 NOT NULL DEFAULT '1', // PRIMARY KEY ("id") // ); // TL 1.9 // -- // -- Table structure for table "tcversions" // -- // CREATE TABLE /*prefix*/tcversions( // "id" BIGINT NOT NULL DEFAULT '0' REFERENCES /*prefix*/nodes_hierarchy (id), // "tc_external_id" INT NULL, // "version" INTEGER NOT NULL DEFAULT '1', // "layout" INTEGER NOT NULL DEFAULT '1', // "summary" TEXT NULL DEFAULT NULL, // "preconditions" TEXT NULL DEFAULT NULL, // "importance" INT2 NOT NULL DEFAULT '2', // "author_id" BIGINT NULL DEFAULT NULL REFERENCES /*prefix*/users (id), // "creation_ts" TIMESTAMP NOT NULL DEFAULT now(), // "updater_id" BIGINT NULL DEFAULT NULL REFERENCES /*prefix*/users (id), // "modification_ts" TIMESTAMP NULL, // "active" INT2 NOT NULL DEFAULT '1', // "is_open" INT2 NOT NULL DEFAULT '1', // "execution_type" INT2 NOT NULL DEFAULT '1', // PRIMARY KEY ("id") // ); // // // -- // -- Table structure for table "tcsteps" // -- // CREATE TABLE /*prefix*/tcsteps ( // "id" BIGINT NOT NULL DEFAULT '0' REFERENCES /*prefix*/nodes_hierarchy (id), // "step_number" INT NOT NULL DEFAULT '1', // "actions" TEXT NULL DEFAULT NULL, // "expected_results" TEXT NULL DEFAULT NULL, // "active" INT2 NOT NULL DEFAULT '1', // "execution_type" INT2 NOT NULL DEFAULT '1', // PRIMARY KEY ("id") // ); echo __FUNCTION__; // do test cases exist? $sql = "SELECT id FROM {$tableSet['tcversions']}"; $itemSet = $dbHandler->get_recordset($sql); if (!is_null($itemSet) && count($itemSet) > 0) { $tree_mgr = new tree($dbHandler); $node_types_descr_id = $tree_mgr->get_available_node_types(); $node_types_id_descr = array_flip($node_types_descr_id); // STEP 1 - Populate in bulk mode tcsteps table. // // ALL FIELDS - tcversions 1.8 // 1.8 id,tc_external_id,version,summary,steps,expected_results,importance,author_id,creation_ts,updater_id,modification_ts,active,is_open,execution_type, // 1.9 id,tc_external_id,version,summary,importance,author_id,creation_ts,updater_id,modification_ts,active,is_open,execution_type, // // 1.9 tcsteps // id,step_number,actions,expected_results,active,execution_type // // NEEDED FIELDS $sql = " INSERT INTO {$tableSet['tcsteps']} " . " (id,actions,expected_results,active,execution_type) " . " SELECT id,steps,expected_results,active,execution_type " . " FROM {$tableSet['tcversions']}"; $dbHandler->exec_query($sql); // STEP 2 - Create nodes for tcsteps on nodes_hierarchy table foreach ($itemSet as $dummy => $item_info) { $item_id = $tree_mgr->new_node($item_info['id'], $node_types_descr_id['testcase_step']); $sql = " UPDATE {$tableSet['tcsteps']} " . " SET id = {$item_id} WHERE id={$item_info['id']}"; $dbHandler->exec_query($sql); } // STEP 3 - Remove fields from tcversions $sql = "ALTER TABLE {$tableSet['tcversions']} " . "DROP steps, DROP expected_results "; $dbHandler->exec_query($sql); } }