/**
* 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');
require('dotenv').config();
var build_num,testset,postOnlyTS;
if (process.env.build_no != undefined)
build_num = process.env.build_no;
else build_num = 1;
for (var arg = 0; arg < process.argv.length; arg++) {
var temp1 = process.argv[arg].split('=');
if (temp1[0] == "--params") {
var param = process.argv[arg];
var args = param.split('=');
var indiv = args[1].split(',');
var apikey = indiv[0];
apikey = apikey.split(':'); // apikey is: apikey[1]
}
}
var User_Story;
if (process.env.rallyworkspace != undefined)
var workspace = process.env.rallyworkspace;
else
workspace = ""; // default workspace
if (process.env.method != undefined)
var method = process.env.method;
else
var method = "Automated"; // default workspace
if (process.env.rallyProxy != undefined) {
var proxy = process.env.rallyProxy;
} else {
logger.info('No proxy defined - check .env file');
console.log('No proxy defined - check .env file');
callback();
}
var zsessionid;
if (apikey != undefined)
zsessionid = apikey[1];
else if ((apikey == undefined) && (process.env.apiKey != undefined))
zsessionid = process.env.apiKey;
else {
logger.info('No apiKey provided - check .env file or command line parameter');
console.log('No apiKey provided - check .env file or command line parameter');
callback();
}
var baseUrl = 'https://rally1.rallydev.com/slm/webservice/v2.0/';
/**
* Creates new RestHelper
* @class RestHelper
*/
var RallyHelper = function () {
return {
queryUserStory: function (user_story, json, i, j, test_case_name, test_case_description, glb_folder_id, line, duration, status, callbck) {
var user_story_id;
var request = require("request-promise");
var options = {
method: 'GET',
url: 'https://rally1.rallydev.com/slm/webservice/v2.0/hierarchicalrequirement?' +
'query=(FormattedID%20%3D%20' + user_story + ')&fetch=true',
headers: {zsessionid: zsessionid},
proxy: proxy
};
var to_return;
request(options)
.then(function (body,error) {
if (error) {
console.log('error: ' + error);
callbck(to_return);
} else {
//console.log('body US: ' + body);
var json_body = JSON.parse(body);
if (json_body.QueryResult.TotalResultCount > 0) {
user_story_id = json_body.QueryResult.Results[0].ObjectID;
} else {
user_story_id = '';
}
to_return = {
body: json_body,
user_story_id: user_story_id,
json: json,
i: i,
j: j,
test_case_name: test_case_name,
test_case_description: test_case_description,
glb_folder_id: glb_folder_id,
line: line,
duration: duration,
status: status
}
return callbck(to_return);
}
});
},
queryTestCases: function (test_case, json, i, j, user_story, glb_folder_id, callbck){
var last_run = false; var test_case_result_id = 0;
var request = require("request-promise");
var options = {
method: 'GET',
url: baseUrl + 'testcase?query=(Name%20%3D%20' + test_case + ')&fetch=true',
headers: {
zsessionid: zsessionid
},
proxy: proxy
};
var revision_history_ref;
request(options)
.then(function (body,error) {
var id = 0;
if (error) {
console.log("Rally error: " + error);
} else {
// console.log('else case:');
// console.log('query test case: ' + body);
var json_body = JSON.parse(body);
//console.log('last result is: ' + JSON.stringify(json_body.QueryResult.Results[0].LastResult));
if (json_body.QueryResult.TotalResultCount > 0) {
if (json_body.QueryResult.Results[0]._refObjectName == test_case) {
if(json_body.QueryResult.Results[0].LastResult == null) {
//console.log('no result');
last_run = false;
} else {
last_run = true;
test_case_result_id = json_body.QueryResult.Results[0].LastResult._ref;
test_case_result_id = test_case_result_id.split('/');
test_case_result_id = test_case_result_id[7];
//console.log('test case result id: ' + test_case_result_id);
}
id = json_body.QueryResult.Results[0].ObjectID;
//console.log('id in test case is: ' + id);
if(json_body.QueryResult.Results[0].RevisionHistory._ref != null)
revision_history_ref = json_body.QueryResult.Results[0].RevisionHistory._ref;
else
revision_history_ref = '';
found = true;
} else {
found = false;
last_run = false;
}
} else {
found = false;
last_run = false;
}
var to_return = {
found: found,
json: json,
i: i,
j: j,
id: id,
case_name: test_case,
user_story: user_story,
glb_folder_id: glb_folder_id,
last_run: last_run,
test_case_result_id:test_case_result_id,
revision_history_ref:revision_history_ref
};
callbck(to_return);
}
});
},
queryTestFolders: function (test_plan, json, i, j, folder_id, callbck) {
var request = require("request-promise");
var options = {
method: 'GET',
url: baseUrl + 'testfolder?query=(Name%20%3D%20' + test_plan + ')&fetch=true',
headers: {
zsessionid: zsessionid
},
proxy: proxy
};
request(options)
.then(function (body, error) {
var folderID = 0;
if (error) {
console.log("Rally error: " + error);
} else {
//console.log('query TF: ' + body);
var json_body = JSON.parse(body);
if (json_body.QueryResult.TotalResultCount > 0) {
if (json_body.QueryResult.Results[0]._refObjectName == test_plan) {
if ((folder_id == 0) || (json_body.QueryResult.Results[0].Parent != null)) {
folderID = json_body.QueryResult.Results[0].ObjectID;
found = true;
} else {
found = false
}
} else {
found = false;
}
} else {
found = false;
}
var to_return = {
found: found,
json: json,
i: i,
j: j,
folderID: folderID,
test_plan: test_plan
};
callbck(to_return);
}
});
},
queryTestSet: function(testset, status, duration, glb_test_case_id, glb_folder_id, json, i, j, k, callbck) {
if(testset==''){
to_return = {
test_set_id:'',
status:status,
duration:duration,
glb_test_case_id:glb_test_case_id,
glb_folder_id:glb_folder_id,
json:json,
i:i,
j:j,
k:k
}
callbck(to_return);
} else {
var request = require('request-promise');
var test_set_id;
var options = {
method: 'GET',
url: 'https://rally1.rallydev.com/slm/webservice/v2.0/testset?' +
'query=(FormattedID%20%3D%20' + testset + ')&fetch=true',
headers: {zsessionid: zsessionid},
proxy: proxy
};
var to_return;
request(options)
.then(function (body, error) {
//console.log('query test set: ' + body);
var json_body = JSON.parse(body);
if (json_body.QueryResult.TotalResultCount > 0) {
test_set_id = json_body.QueryResult.Results[0].ObjectID;
} else {
test_set_id = '';
}
to_return = {
test_set_id: test_set_id,
status: status,
duration: duration,
glb_test_case_id: glb_test_case_id,
glb_folder_id: glb_folder_id,
json: json,
i: i,
j: j,
k: k
}
callbck(to_return);
});
}
},
queryRevisionHistory: function(revision_history_ref, user_story, json, i, j, test_case_name, test_case_description, glb_folder_id, line, duration, status, callbck){
var request = require("request-promise");
var options = {
method: 'GET',
url: revision_history_ref + '/Revisions',
headers:
{ zsessionid:zsessionid},
proxy:proxy
};
var owner_url, owner;
request(options)
.then(function (body,error) {
if(error) {
console.log('Rally error: '+ error);
callbck();
}
else {
//console.log('revision history: ' + body);
var json_body = JSON.parse(body);
if(json_body.QueryResult.TotalResultCount > 0){
owner_url = json_body.QueryResult.Results[0].User._ref;
owner = owner_url.split('/');
var to_return = {
owner: owner[7],
user_story: user_story,
json:json,
i:i,
j:j,
test_case_name: test_case_name,
test_case_description:test_case_description,
glb_folder_id: glb_folder_id,
line:line,
duration:duration,
status:status
}
callbck(to_return);
}
}
});
},
createTestPlan: function (test_plan, test_plan_description, parent_folder, json, i, j, callbck) {
var body, folder_id;
if (parent_folder == 0) {
if (workspace != "") {
body = '{\n' +
' "testfolder":\n' +
' {\n' +
' "Name":"' + test_plan + '",\n' +
' "Workspace":"/Workspace/' + workspace + '"\n' +
' }\n' +
'}'
} else {
body = '{\n' +
' "testfolder":\n' +
' {\n' +
' "Name":"' + test_plan + '"\n' +
' }\n' +
'}'
}
} else {
if (workspace != "") {
body = '{\n' +
' "testfolder":\n' +
' {\n' +
' "Name":"' + test_plan + '" ,\n' +
' "Parent":"' + parent_folder + '"\n' +
' "Workspace":"/Workspace/' + workspace + '"\n' +
' }\n' +
'}'
} else {
body = '{\n' +
' "testfolder":\n' +
' {\n' +
' "Name":"' + test_plan + '" ,\n' +
' "Parent":"' + parent_folder + '"\n' +
' }\n' +
'}'
}
}
var to_return;
var request = require("request-promise");
var options = {
method: 'POST',
url: baseUrl + 'testfolder/create?fetch=true',
headers: {
zsessionid: zsessionid
},
body: body,
proxy: proxy
};
request(options)
.then(function (body,error) {
if (error) {
console.log("Rally error: " + error);
}
else {
//console.log('create test plan: ' + body);
var json_body = JSON.parse(body);
folder_id = json_body.CreateResult.Object.ObjectID;
to_return = {
json: json,
i: i,
j: j,
id: folder_id
}
}
return callbck(to_return);
});
},
createTestCaseResult: function (name, status, duration, test_case_id, glb_folder_id, json, i, j, k, testset, callbck) {
if (duration > 9999999999) {
duration = 9999999999;
}
if (status == 'passed') {
status = 'Pass';
} else if (status == "failed") {
status = 'Fail';
} else if (status == "skipped") {
status = 'Inconclusive';
duration = 0;
}
var d = new Date();
var date = d.toISOString();
var request = require("request-promise");
var options = {
method: 'POST',
url: baseUrl + 'testcaseresult/create',
headers: {
zsessionid: zsessionid
},
proxy: proxy,
body:
'{\n "testcaseresult":\n' +
' {\n' +
' "TestCase":"/testcase/' + test_case_id + '",\n' +
' "Build":"' + name + '",\n' +
' "Duration":"' + duration + '",\n' +
' "Verdict":"' + status + '",\n' +
' "Date":"' + date + '",\n' +
' "TestSet":"' + testset + '"\n' +
' }\n' +
'}'
};
var id=0;
request(options)
.then(function (body,error) {
if (error) {
console.log("Rally error: " + error);
} else {
//console.log('result created: ' + body);
body = JSON.parse(body);
var err = body.CreateResult.Errors;
if(err != '') {
//console.log('concurrency error: calling again should call again');
id=null;
//return callbck('concurrency');
}
else {
id = body.CreateResult.Object.ObjectID;
}
var to_return = {
json: json,
i: i,
j: j,
k: k,
id:id
};
return callbck(to_return);
}
});
},
createTestCase: function (test_case_name, test_case_description, folder_id, json, i, j, k, duration, line, status, user_story, callbck_create) {
//console.log('in create TC: ' + test_case_name);
var request = require('request-promise');
if (duration == undefined) {
duration = 0;
}
if (folder_id == null) {
folder_id = glb_subfolder_id;
}
var create_id = 0;
var to_ret, body;
if (test_case_description == "") {
test_case_description = "N/A";
}
if (workspace != "") {
if (User_Story != "") { // defined user story & workspace
body = '{\n' +
' "testcase":\n' +
' {\n' +
' "Name":"' + test_case_name + '",\n' +
' "Description":"' + test_case_description + '",\n' +
' "Method":"'+method+'",\n' +
' "TestFolder":"' + folder_id + '",\n' +
' "Workspace":"/Workspace/' + workspace + '",\n' +
' "WorkProduct":"' + user_story + '"\n' +
' }\n' +
'}'
} else { //no user story & defined workspace
body = '{\n' +
' "testcase":\n' +
' {\n' +
' "Name":"' + test_case_name + '",\n' +
' "Description":"' + test_case_description + '",\n' +
' "Method":"'+method+'",\n' +
' "TestFolder":"' + folder_id + '",\n' +
' "Workspace":"/Workspace/' + workspace + '"\n' +
' }\n' +
'}'
}
} else {
if (User_Story != "") { //no defined workspace / defined user story
body = '{\n' +
' "testcase":\n' +
' {\n' +
' "Name":"' + test_case_name + '",\n' +
' "Description":"' + test_case_description + '",\n' +
' "Method":"'+method+'",\n' +
' "TestFolder":"' + folder_id + '",\n' +
' "WorkProduct":"' + user_story + '"\n' +
' }\n' +
'}'
} else {
body = '{\n' +
' "testcase":\n' +
' {\n' +
' "Name":"' + test_case_name + '",\n' +
' "Description":"' + test_case_description + '",\n' +
' "Method":"'+method+'",\n' +
' "TestFolder":"' + folder_id + '"\n' +
' }\n' +
'}'
}
}
var options = {
method: 'POST',
url: baseUrl + 'testcase/create',
headers: {
zsessionid: zsessionid
},
proxy: proxy,
body: body
};
request(options)
.then( function (body,error) {
if (error) {
console.log('Rally error: ' + error);
to_ret = {
json: json,
i: i,
j: j,
k: k,
duration: duration,
line: line,
id: 'returned null',
status: status,
folder_id: folder_id,
user_story: user_story
};
return callbck_create(to_ret);
} else {
//console.log('create test case: ' + body);
body = JSON.parse(body);
if (body.CreateResult.Object != undefined) {
create_id = body.CreateResult.Object.ObjectID;
}
else {
create_id = 0;
}
to_ret = {
json: json,
i: i,
j: j,
k: k,
duration: duration,
line: line,
id: create_id,
status: status,
folder_id: folder_id,
user_story: user_story
};
return callbck_create(to_ret);
}
});
},
updateTestCaseResult: function (test_case_id, test_case_result_id, duration, name, status, user_story, i, j, k, testset, callbck) {
//console.log('update TCR fxn: ' + testset + ' tc: ' + test_case_id + ' tcrid ' + test_case_result_id);
if (duration == undefined) {
duration = 0;
}
if ((duration != undefined) && (duration > 9999999999)) {
duration = 9999999999;
}
if (status == 'passed') {
status = 'Pass';
} else if (status == "failed") {
status = 'Fail';
} else if (status == "skipped") {
status = 'Inconclusive';
duration = 0;
}
var d = new Date();
var date = d.toISOString();
var request = require("request-promise");
var to_return;
var options = {
method: 'POST',
url: baseUrl + 'testcaseresult/' + test_case_result_id,
headers: {
zsessionid: zsessionid
},
proxy: proxy,
body: '{\n' +
' "testcaseresult":\n' +
' {\n' +
' "Build":"' + name + '",\n' +
' "Duration":"' + duration + '",\n' +
' "Date":"' + date + '",\n' +
' "TestCase":"/testcase/' + test_case_id + '",\n' +
' "Verdict":"' + status + '",\n' +
' "TestSet":"' + testset + '"\n' +
' }\n' +
'}'
};
request(options)
.then(function (body,error) {
if (error) {
console.log("Rally error: " + error);
} else {
//console.log('update test case result: ' + body);
to_return = {
i: i,
j: j,
k: k
};
return callbck(to_return);
}
});
},
updateTestCase: function (test_case_id, user_story, i, j, body, json, test_case_name, test_case_description, glb_folder_id, line, duration, status, owner, testset, callbck) {
//console.log('in update TC fxn');
var request = require("request-promise");
var options = {
method: 'POST',
url: baseUrl + '/testcase/' + test_case_id,
headers: {zsessionid: zsessionid},
proxy: proxy,
body: '{\n' +
' "testcase":\n {\n' +
' "WorkProduct":"' + user_story + '",\n' +
' "Owner":"' + owner + '"\n' +
' "Method":"'+method+'",\n' +
' }\n' +
'}'
};
request(options)
.then(function (body,error) {
var to_return;
if (error) {
console.log('error occurred: ' + error);
callbck();
} else {
//console.log('updated test case: ' + body);
body = JSON.parse(body);
to_return = {
test_case_id: test_case_id,
user_story: user_story,
i: i,
j:j,
body:body,
json:json,
test_case_name: test_case_name,
test_case_description: test_case_description,
glb_folder_id:glb_folder_id,
line:line,
duration: duration,
status:status
};
callbck(to_return);
}
});
},
updateTestSet: function(testset, testcase, status, duration, glb_test_case_id, glb_folder_id, json, i, j, k, callbck){
//TODO: add error handling here - if testset is null, callback
//console.log('in update TS fxn');
if(testset == ''){
to_return = {
test_set_id:'',
status:status,
duration:duration,
glb_test_case_id:glb_test_case_id,
glb_folder_id:glb_folder_id,
json:json,
i:i,
j:j,
k:k
}
callbck(to_return);
} else {
var request = require("request-promise");
var options = {
method: 'POST',
url: 'https://rally1.rallydev.com/slm/webservice/v2.x/TestSet/' + testset + '/TestCases/add?fetch=true',
headers: {zsessionid: zsessionid},
proxy: proxy,
body: '{"CollectionItems":[{"_ref":"/testcase/' + testcase + '"}]}'
};
var to_return;
request(options)
.then(function (body, error) {
//console.log('updated test set: ' + body);
to_return = {
test_set_id: testset,
status: status,
duration: duration,
glb_test_case_id: glb_test_case_id,
glb_folder_id: glb_folder_id,
json: json,
i: i,
j: j,
k: k
}
callbck(to_return);
});
}
}
}
};
module.exports = new RallyHelper();
}());