cypress-zapi-js
Version:
Lib for connection between Cypress and Zephyr, enabling execution update via API
237 lines (222 loc) • 9.26 kB
JavaScript
// include library
const Client = require("zapi_nodejs");
const fetch = require("node-fetch");
const path = require("path");
const utils = require("./utils/utils");
let cycleId;
let targetCycleId;
let executionId;
let issueId;
// Function to generate Jwt Client
function generateClient(baseUrl, accessKey, secretKey, accountId) {
// create client
const JwtClient = new Client(baseUrl, accessKey, secretKey, accountId);
return JwtClient;
}
// Function to Upload Files to Jira
// Modules
module.exports = {
createExecution(
baseUrl,
accessKey,
secretKey,
accountId,
projectId,
versionId,
issueKey,
currentCycleName,
testResult,
uploadAttachOnFailure,
copyTestsFromOtherCycle,
copyFromCycle,
copyFromVersionId,
packagePath
) {
cy.log("Starting updating Jira...")
const setupData = [""];
setupData.push(baseUrl, accessKey, secretKey, accountId);
/// //////////////////////// Get Current and Target CycleId ///////////////////////////
const apiUrlCycle = `${baseUrl}/public/rest/api/1.0/cycles/search?projectId=${projectId}&versionId=${versionId}`;
const tokenCycle = generateClient(
baseUrl,
accessKey,
secretKey,
accountId
).generateJWT("GET", apiUrlCycle, 3600);
// Perform get Current and target cycleId
fetch(apiUrlCycle, {
method: "GET",
headers: {
Authorization: `JWT ${tokenCycle}`,
zapiAccessKey: accessKey,
"Content-Type": "text/plain",
},
}).then((response) => {
response.text().then((result) => {
const arrayCycleNames = utils.getJsonValueArray(result, "[*].name");
for (let i = 0; i < arrayCycleNames.length; i++) {
if (copyTestsFromOtherCycle) {
if (arrayCycleNames[i] === copyFromCycle) {
targetCycleId = utils.getJsonValueString(
result,
`[${i}].cycleIndex`
);
}
}
if (arrayCycleNames[i] === currentCycleName) {
cycleId = utils.getJsonValueString(result, `[${i}].cycleIndex`);
setupData.push(cycleId);
if (copyTestsFromOtherCycle) {
/// //////////////////////// Copy all tests from another cycle ///////////////////////////
const apiCopyFromCycle = `${baseUrl}/public/rest/api/1.0/executions/add/cycle/${cycleId}`;
// generate token
const tokenCopyFromCycle = generateClient(
baseUrl,
accessKey,
secretKey,
accountId
).generateJWT("POST", apiCopyFromCycle, 3600);
const payloadCopyTests = {
fromCycleId: targetCycleId,
method: "3",
fromVersionId: parseInt(copyFromVersionId),
projectId: parseInt(projectId),
versionId: versionId, // Set project version Id,
};
// perform execution creation
fetch(apiCopyFromCycle, {
method: "POST",
headers: {
Authorization: `JWT ${tokenCopyFromCycle}`,
zapiAccessKey: accessKey,
"Content-Type": "application/json",
},
body: JSON.stringify(payloadCopyTests),
});
}
/// //////////////////////// Get issueId ///////////////////////////
const apiUrl = `${baseUrl}/public/rest/api/2.0/executions/search/cycle/${cycleId}?projectId=${projectId}&versionId=${versionId}`;
// generate token
const tokenIssue = generateClient(
baseUrl,
accessKey,
secretKey,
accountId
).generateJWT("GET", apiUrl, 3600);
// perform get issueId
fetch(apiUrl, {
method: "GET",
headers: {
Authorization: `JWT ${tokenIssue}`,
zapiAccessKey: accessKey,
"Content-Type": "text/plain",
"Access-Control-Allow-Origin": "localhost",
},
}).then((response) =>
response.text().then((result) => {
const arrayIssues = utils.getJsonValueArray(
result,
"searchResult.searchObjectList[*].issueKey"
);
for (let i = 0; i < arrayIssues.length; i++) {
if (arrayIssues[i] === issueKey) {
issueId = utils.getJsonValueString(
result,
`searchResult.searchObjectList[${i}].execution.issueId`
);
setupData.push(issueId);
/// //////////////////////// Create new execution ///////////////////////////
const apiUrlExecution = `${baseUrl}/public/rest/api/1.0/execution`;
// generate token
const tokenExecution = generateClient(
baseUrl,
accessKey,
secretKey,
accountId
).generateJWT("POST", apiUrlExecution, 3600);
const payloadCreate = {
status: { id: parseInt(-1) },
id: utils.createUUID(),
cycleId: setupData[5], // Set Cycle Id
issueId: parseInt(setupData[6]), // Set Issue Id
projectId: parseInt(projectId), // Set project Id
versionId: versionId, // Set project version Id
};
// perform execution creation
fetch(apiUrlExecution, {
method: "POST",
headers: {
Authorization: `JWT ${tokenExecution}`,
zapiAccessKey: accessKey,
"Content-Type": "application/json",
},
body: JSON.stringify(payloadCreate),
}).then((response) => {
response.text().then((result) => {
executionId = utils.getJsonValueString(
result,
"execution.id"
);
setupData.push(executionId, projectId, versionId);
/// ////////////////////// Update execution status ///////////////////////////
const apiUrlUpdate = `${baseUrl}/public/rest/api/1.0/execution/${executionId}`;
// generate token
const tokenUpdate = generateClient(
baseUrl,
accessKey,
secretKey,
accountId
).generateJWT("PUT", apiUrlUpdate, 3600);
const payloadUpdate = {
status: { id: parseInt(testResult) },
cycleId: setupData[5],
issueId: parseInt(setupData[6]),
projectId: parseInt(projectId),
versionId: versionId,
comment: `Executed by Cypress automation in ${utils.getDateNow()}`,
};
// perform update
fetch(apiUrlUpdate, {
method: "PUT",
headers: {
Authorization: `JWT ${tokenUpdate}`,
zapiAccessKey: accessKey,
"Content-Type": "application/json",
},
body: JSON.stringify(payloadUpdate),
});
/// //////////////////// Call upload attachment function ////////////////////////
if (testResult === "2") {
if (uploadAttachOnFailure) {
try {
cy.exec(
`node ${packagePath}${path.sep}utils${
path.sep
}uploadUtils.js evidencesUpload ${accessKey} ${secretKey} ${accountId} ${baseUrl} cypress/screenshots ${parseInt(
setupData[6]
)} ${versionId} ${
setupData[5]
} ${executionId} ${parseInt(
projectId
)} ${issueKey}`
);
} catch (error) {
console.error(
`Error to upload the attachments: ${error}`
);
}
}
}
});
});
}
}
})
);
}
}
});
});
cy.log("Jira Updated.")
},
};