/**
* Created by 212571071 on 7/21/16.
*/
/**
* Copyright (c) 2013 - 2014 GE Global Research. All rights reserved.
* The copyright to the computer software herein is the property of
* GE Global Research. The software may be used and/or copied only
* with the written permission of GE Global Research or in accordance
* with the terms and conditions stipulated in the agreement/contract
* under which the software has been supplied.
*/
(function () {
var logger = require('./Logger.js');
var request = require('request-promise');
var RallyHelper = require('./RallyHelper.js');
var RallyLogger = require('./RallyLogger.js');
require('dotenv').config();
var build_num,postOnlyTS;
if (process.env.build_no != undefined)
build_num = process.env.build_no;
else build_num = 1;
var name, status, duration, keyword, description, glb_test_case_id, glb_test_result_id , test_case_name,
test_case_description, line, glb_j_length, glb_k_length, User_Story, json, i, error_message ='';
var stepsArray = [];
var RallyMethods = function () {
var stat; var duration1;
function queryUSTS(USTS, ws, proj,type, callbck) {
return new Promise(function (resolve, reject) {
RallyLogger.getUSTSRef(USTS, ws, proj, type, resolve)
});
}
function queryRH(type, obj, callbck) {
return new Promise(function (resolve, reject) {
RallyLogger.UserPermissions(type, obj, resolve)
});
}
function queryTC(type, test_case_name, project, ws, callbck) {
return new Promise(function (resolve, reject) {
RallyLogger.getObjectRef(type, test_case_name, project, ws, resolve)
});
}
function createTC(opts, ws, proj, callbck_create) {
return new Promise(function (resolve, reject) {
RallyLogger.createTestcase(opts, ws, proj, resolve)
});
}
function createTCR(opts, ws, proj, callbck) {
return new Promise(function (resolve, reject) {
RallyLogger.createTestcaseResult(opts, ws, proj, resolve)
});
}
function createTP(test_plan, ws, proj, callbck) {
return new Promise(function (resolve, reject) {
RallyLogger.createTestPlan(test_plan, ws, proj, resolve)
});
}
function updateTS(tcObj, resp, callbck) {
return new Promise(function (resolve, reject) {
RallyLogger.updateTestSet(tcObj, resp, resolve)
});
}
function updateTC(obj, ws, proj, callbck) {
return new Promise(function (resolve, reject) {
RallyLogger.updateTestCase(obj, ws, proj, resolve)
});
}
function updateTCR(opts, ws, proj, callbck) {
return new Promise(function (resolve, reject) {
RallyLogger.updateTestCaseResult(opts, ws, proj, resolve)
});
}
function TCR(tcObj, resp, callback) {
return new Promise(function (resolve, reject) {
require('./RallyMethods.js').TestCaseResult(tcObj, resp, resolve)
});
}
var k_loop = function(resp,callbck) {
duration1 = 0; stepsArray = []; var failure = false; var statUndefined = false;
for (k = 0; k < resp.resp.json[resp.i].elements[resp.j].steps.length; k++) {
glb_k_length = resp.resp.json[resp.i].elements[resp.j].steps.length;
if ((resp.resp.json[resp.i].elements[resp.j].steps[k].result.duration != undefined) && (resp.resp.json[resp.i].elements[resp.j].steps[k].result.duration != 'undefined')) {
duration1 = duration1 + resp.resp.json[resp.i].elements[resp.j].steps[k].result.duration;
} else {
duration1 = duration1 + 0;
}
keyword = resp.resp.json[resp.i].elements[resp.j].steps[k].keyword;
if(resp.resp.json[resp.i].elements[resp.j].description != undefined) {
description = resp.resp.json[resp.i].elements[resp.j].description;
} else {
description = "";
}
if(resp.resp.json[resp.i].elements[resp.j].steps[k].result.error_message != undefined) {
error_message = resp.resp.json[resp.i].elements[resp.j].steps[k].result.error_message;
error_message = error_message.substring(0,400);
} else {
error_message = "";
}
if ((resp.resp.json[resp.i].elements[resp.j].steps[k].match != undefined))
line = resp.resp.json[resp.i].elements[resp.j].steps[k].match.location;
else
line = 0;
if ((resp.resp.json[resp.i].elements[resp.j].steps[k].keyword != "Before") || (resp.resp.json[resp.i].elements[resp.j].steps[k].keyword != "After")) {
name = resp.resp.json[resp.i].elements[resp.j].steps[k].name;
if (name != undefined) {
stepsArray.push('<br>' + parseInt(k+1) + '. ' + name);
//name = name.split(' ').join('_');
} else {
break;
}
}
if(resp.resp.json[resp.i].elements[resp.j].steps[k].result.status == undefined ||
resp.resp.json[resp.i].elements[resp.j].steps[k].result.status == 'undefined'){
statUndefined=true;
} else {
stat = resp.resp.json[resp.i].elements[resp.j].steps[k].result.status;
}
if (stat == 'failed') {
failure=true;
//break;
}
}
if((k == resp.resp.json[resp.i].elements[resp.j].steps.length-1) ) {
if(k == 0) {
duration1 = ((duration1) / 1000000000.0).toFixed(2);
if(failure) stat='failed';
else if (statUndefined) stat=undefined;
} else {
duration1 = ((duration1 / k) / 1000000000.0).toFixed(2);
if(failure) stat='failed';
else if (statUndefined) stat=undefined;
}
return callbck(resp);
}
}
function kloop(resp, callbck) {
return new Promise(function (resolve, reject) {
k_loop(resp, resolve)
});
}
var test_case_array = [];
return {
/**
* Query Revision History, User Story, TestSet, calls methods TestCaseResult
* @param tcObj object w/ User_Story, resp, j, test_case_name, test_case_description, glb_folder_id,
* build_num, testset, glb_test_case_id, glb_test_result_id, last_run, glb_i_length, glb_j_length
* @param callback callback on error or when reach end of j loop ( test cases )
*/
TestCaseFound: function(tcObj, callback) {
var owner_url = tcObj.resp.revision_history_ref;
var duration, status;
queryRH('', '')
.then(function (resp) {
var owner = resp.owner_id;
kloop(tcObj)
.then(function (response) {
tcObj.stepsArray = stepsArray
if(process.env.overwrite_US != undefined && process.env.overwrite_US == "true"){
tcObj.User_Story = process.env.user_story;
}
queryUSTS(tcObj.User_Story, tcObj.ws, tcObj.proj, 'hierarchicalrequirement')
.then(function (resp) {
updateTC({resp: resp, owner:owner, tcObj:tcObj, error:error_message}, tcObj.ws, tcObj.proj)
.then(function (resp) {
queryUSTS(tcObj.testset, tcObj.ws, tcObj.proj, 'testset')
.then(function (resp) {
resp.status = stat;resp.duration = duration1;resp.i = i;
resp.j = tcObj.j; resp.json = json;
updateTS(tcObj, resp)
.then(function (resp) {
TCR(tcObj, resp)
.then( function(resp) {
if (resp == 'step i')
return callback('step i');
else if (resp == 'step j')
return callback('step j');
else
return callback('callback');
});
}).catch(function(error){
callback('callback');
});
}).catch(function(error){
callback('callback');
});
}).catch(function(error){
callback('callback');
});
}).catch(function(error){
callback('callback');
});
}).catch(function (error) {
callback('callback');
});
});
},
/**
* Query User Story, create TestCase, query TestSet, update TestSet, create TestCaseResult
* @param tcObj object w/ User_Story, resp, j, test_case_name, test_case_description,
* glb_folder_id, build_num, testset, glb_test_case_id, glb_test_result_id, last_run, glb_i_length, glb_j_length
* @param kObj object w/ duration, status, and response from create test plan
* @param callback callback on error or when reach end of j loop ( test cases )
*/
noTestCaseFound: function(tcObj, kObj, callback) {
if(process.env.overwrite_US != undefined && process.env.overwrite_US == "true"){
tcObj.User_Story = process.env.user_story;
}
queryUSTS(tcObj.User_Story, tcObj.ws, tcObj.proj, 'hierarchicalrequirement')
.then(function (resp) {
tcObj.User_Story = resp.id;
queryRH('', '')
.then(function(resp) {
tcObj.owner = resp.owner_id;
var obj = {tcObj:tcObj, kObj: kObj, error:error_message};
createTC(obj, tcObj.ws, tcObj.proj)
.then(function (response) {
glb_test_case_id = response.id;
response.json = json;response.i=i; response.j = tcObj.j;
response.duration = kObj.duration; response.status = kObj.status;
tcObj.glb_test_case_id = response.id;
queryUSTS(tcObj.testset, tcObj.ws, tcObj.proj, 'testset')
.then(function (resp) {
resp.status = stat;
resp.duration = duration1;
resp.i = i; resp.j = tcObj.j; resp.json = json;
updateTS(tcObj, resp)
.then(function (response) {
tcObj.last_run = false;
var RallyMethods = require('./RallyMethods.js');
TCR(tcObj, response)
.then( function(resp) {
if (resp == 'step i')
callback('step i');
else if (resp == 'step j')
callback('step j');
else
callback('callback');
});
}).catch(function(error){
callback('callback');
});
}).catch(function(error){
callback('callback');
});
}).catch(function(error){
callback('callback');
});
});
}).catch(function(error){
callback('callback');
});
},
/**
* Query Test Cases - contains method to call TestCaseFound and noTestCaseFound
* @param tpObj object with TestSet, and length of json file
* @param response Response from Query Test Folders (found, json, i,folderID, test_plan)
* @param callback callback on error or when reach end of j loop ( test cases )
*/
TestFolderFound: function(tpObj, response, callback) {
json = response.json;
i = response.i;
glb_folder_id = response.id;
var step2 = function (j, done) {
if (j < response.json[response.i].elements.length) {
glb_j_length = response.json[response.i].elements.length;
test_case_name = response.json[response.i].elements[j].name;
temp = test_case_name.split(':');
if ((temp[1] != undefined)) {
User_Story = temp[0];
test_case_name = temp[1];
} else {
if (process.env.user_story != undefined)
User_Story = process.env.user_story;
else User_Story = '';
//test_case_name = test_case_name.split(' ').join('_');
}
test_case_description = response.json[response.i].elements[j].description;
var test_case_line = response.json[response.i].elements[j].line;
var loop2 = function (j, done) {
var temp = 0;
queryTC('testcase', test_case_name, tpObj.proj, tpObj.ws)
.then(function (resp) {
glb_test_case_id = resp.id;
var last_run = resp.last_run;
glb_test_result_id = resp.test_case_result_id;
if (resp != 'NOT_FOUND') { // found test case
resp.json = json; resp.i = i; resp.j = j;
var tcObj = { User_Story: User_Story, resp: resp, j:j, test_case_name: test_case_name,
test_case_description: test_case_description, glb_folder_id: glb_folder_id,
build_num: build_num, testset: tpObj.testset, glb_test_case_id: glb_test_case_id,
glb_test_result_id: glb_test_result_id, last_run: last_run, glb_i_length: tpObj.glb_i_length,
glb_j_length: glb_j_length, i: i, ws:tpObj.ws, proj:tpObj.proj,
testset_defined_env:tpObj.testset_defined_env, stepsArray:stepsArray };
require('./RallyMethods.js').TestCaseFound(tcObj, function(response) {
if(response == 'step i')
callback('step i');
else if (response == 'step j')
step2(j + 1, done);
else
callback('callback');
});
} else { // did not find test case
resp = { json:json, i: i, j: j };
var tcObj = { User_Story: User_Story, resp: resp, j:j, test_case_name: test_case_name,
test_case_description: test_case_description, glb_folder_id: glb_folder_id,
build_num: build_num, testset: tpObj.testset, glb_test_case_id: glb_test_case_id,
glb_test_result_id: glb_test_result_id, last_run: last_run, glb_i_length: tpObj.glb_i_length,
glb_j_length: glb_j_length, i: i, ws:tpObj.ws, proj:tpObj.proj,
testset_defined_env:tpObj.testset_defined_env};
kloop(tcObj)
.then(function (response) {
var kObj = { duration: duration, status: stat, response:response, stepsArray:stepsArray };
tcObj.stepsArray = stepsArray;
require('./RallyMethods.js').noTestCaseFound(tcObj, kObj, function (response) {
if(response == 'step i')
callback('step i');
else if (response == 'step j')
step2(j + 1, done);
else
callback('callback');
});
});
}
}).catch(function (error) {
console.log('error: ' + error);
callback();
});
};
loop2(j, done);
}
}
step2(0);
},
/**
* Create Test Folder, Test Case, & Test Case Result
* @param tpObj object with TestSet, and length of json file
* @param response Response from Query Test Folders (found, json, i,folderID, test_plan)
* @param callback callback on error or when reach end of j loop ( test cases )
*/
noTestFolderFound: function(tpObj, response, callback) {
//console.log('no test folder found - creating');
json = response.json;
i = response.i;
var test_plan = response.test_plan;
var test_plan_description = response.json[response.i].description;
//test_plan = test_plan.split(' ').join('_');
createTP(test_plan, tpObj.ws, tpObj.proj)
.then(function (resp) {
resp.json = json; resp.i=i;
var step3 = function (j, done) {
if (j < resp.json[resp.i].elements.length) {
glb_j_length = resp.json[resp.i].elements.length;
glb_folder_id = resp.id;
test_case_name = resp.json[resp.i].elements[j].name;
temp = test_case_name.split(':');
if ((temp[1] != undefined)) {
User_Story = temp[0];
test_case_name = temp[1];
} else {
if (process.env.user_story != undefined)
User_Story = process.env.user_story;
else User_Story = '';
//test_case_name = test_case_name.split(' ').join('_');
}
test_case_description = json[resp.i].elements[j].description;
var test_case_line = json[resp.i].elements[j].line;
var tcObj = {User_Story: User_Story, test_case_name: test_case_name,
test_case_description: test_case_description, glb_folder_id: resp.id, resp:resp,
build_num: build_num, testset: tpObj.testset, glb_i_length: tpObj.glb_i_length,
glb_j_length: glb_j_length, j:j, i:i, ws:tpObj.ws, proj:tpObj.proj,
testset_defined_env:tpObj.testset_defined_env, stepsArray:stepsArray };
var loop3 = function (j, done) {
resp.j = j;
kloop(tcObj)
.then(function (resp1) {
tcObj.stepsArray = stepsArray;
var RallyMethods = require('./RallyMethods.js');
var kObj = { duration: duration1, status: stat, response: resp1, stepsArray:stepsArray };
RallyMethods.noTestCaseFound(tcObj, kObj, function (response) {
if (response == 'step i')
callback('step i');
else if (response == 'step j')
step3(j + 1, done);
else
callback('callback');
});
});
};
loop3(j, done);
}
};
step3(0);
});
},
/**
* Update Test Case Result, Create Test Case Result, or EOF
* @param tcObj object w/ User_Story, resp, j, test_case_name, test_case_description, glb_folder_id,
* build_num, testset, glb_test_case_id, glb_test_result_id, last_run, glb_i_length, glb_j_length
* @param callback callback on error or when reach end of j loop ( test cases )
*/
TestCaseResult: function(tcObj, resp, callback) {
if ((resp.status == undefined) || (resp.status == "undefined")) {
if ((resp.i == tcObj.glb_i_length - 1) && (resp.j == tcObj.glb_j_length - 1)) {
logger.info('Rally Results Posted');
console.log('Rally Results Posted');
callback('callback');
} else if ((resp.j == tcObj.glb_j_length - 1)) {
callback('step i');
} else {
callback('step j');
}
} else if ((tcObj.last_run == true)) {
//console.log('update test case result');
resp.duration = duration1; resp.status = stat;
var opts = {tcObj:tcObj, resp:resp};
updateTCR(opts, tcObj.ws, tcObj.proj)
.then(function (resp) {
if ((i == tcObj.glb_i_length - 1) && (tcObj.j == tcObj.glb_j_length - 1)) {
logger.info('Rally Results Posted');
console.log('Rally Results Posted');
return callback('callback');
} else if ((tcObj.j == tcObj.glb_j_length - 1)) {
callback('step i');
} else {
callback('step j');
}
}).catch(function(error){
callback('callback');
});
} else {
//console.log('going to create test case result');
var opts = {tcObj:tcObj, resp:resp};
createTCR(opts, tcObj.ws, tcObj.proj)
.then(function (resp) {
resp.i = i; resp.j = tcObj.j;
if ((resp.i == tcObj.glb_i_length - 1) && (resp.j == tcObj.glb_j_length - 1)) {
logger.info('Rally Results Posted');
console.log('Rally Results Posted');
return callback('callback');
} else if ((resp.j == tcObj.glb_j_length - 1)) {
return callback('step i');
} else {
return callback('step j');
}
}).catch(function (error) {
console.log('error: ' + error);
callback('callback'); //TODO: check if callback or continue iterating j
});
}
}
}
};
module.exports = new RallyMethods();
}());