From eaa0ebb880cae07b506559f83945f8f2742cdda8 Mon Sep 17 00:00:00 2001 From: Archish Date: Thu, 8 Jun 2023 13:07:27 +0530 Subject: [PATCH 01/15] :sparkle: migration from request library to axios --- bin/commands/generateReport.js | 1 - bin/commands/info.js | 68 ++- bin/commands/stop.js | 1 - bin/helpers/build.js | 63 +-- bin/helpers/buildArtifacts.js | 144 ++++--- bin/helpers/checkUploaded.js | 71 ++-- bin/helpers/downloadBuildStacktrace.js | 23 +- bin/helpers/getInitialDetails.js | 47 ++- bin/helpers/reporterHTML.js | 85 ++-- bin/helpers/sync/syncSpecsLogs.js | 58 +-- bin/helpers/usageReporting.js | 38 +- bin/helpers/utils.js | 152 +++---- bin/helpers/zipUpload.js | 142 +++---- package.json | 7 +- test/unit/bin/commands/info.js | 52 ++- test/unit/bin/commands/stop.js | 3 +- test/unit/bin/helpers/build.js | 70 ++-- test/unit/bin/helpers/checkUploaded.js | 97 +++-- test/unit/bin/helpers/getInitialDetails.js | 14 +- test/unit/bin/helpers/reporterHTML.js | 434 ++++++++++---------- test/unit/bin/helpers/sync/syncSpecsLogs.js | 394 +++++++++--------- test/unit/bin/helpers/utils.js | 91 ++-- test/unit/bin/helpers/zipUpload.js | 170 ++++---- 23 files changed, 1119 insertions(+), 1106 deletions(-) diff --git a/bin/commands/generateReport.js b/bin/commands/generateReport.js index 81c6fab8..7bb11cb7 100644 --- a/bin/commands/generateReport.js +++ b/bin/commands/generateReport.js @@ -31,7 +31,6 @@ module.exports = function generateReport(args, rawArgs) { let messageType = Constants.messageTypes.INFO; let errorCode = null; let buildId = args._[1]; - reportGenerator(bsConfig, buildId, args, rawArgs, buildReportData); utils.sendUsageReport(bsConfig, args, 'generate-report called', messageType, errorCode, buildReportData, rawArgs); }).catch((err) => { diff --git a/bin/commands/info.js b/bin/commands/info.js index 1b2b6a7f..ae9146a9 100644 --- a/bin/commands/info.js +++ b/bin/commands/info.js @@ -1,6 +1,5 @@ 'use strict'; -const request = require('request'); - +const axios = require('axios').default; const config = require("../helpers/config"), logger = require("../helpers/logger").winstonLogger, Constants = require("../helpers/constants"), @@ -19,7 +18,7 @@ module.exports = function info(args, rawArgs) { // accept the access key from command line if provided utils.setAccessKey(bsConfig, args); - getInitialDetails(bsConfig, args, rawArgs).then((buildReportData) => { + getInitialDetails(bsConfig, args, rawArgs).then(async (buildReportData) => { utils.setUsageReportingFlag(bsConfig, args.disableUsageReporting); @@ -38,53 +37,43 @@ module.exports = function info(args, rawArgs) { 'User-Agent': utils.getUserAgent(), }, }; - request.get(options, function (err, resp, body) { - let message = null; - let messageType = null; - let errorCode = null; - - if (err) { - message = Constants.userMessages.BUILD_INFO_FAILED; - messageType = Constants.messageTypes.ERROR; - errorCode = 'api_failed_build_info'; + let message = null; + let messageType = null; + let errorCode = null; - logger.info(message); - logger.error(utils.formatRequest(err, resp, body)); - } else { - let build = null; + try { + const response = await axios.get(options.url, { + auth: { + username: bsConfig.auth.username, + password: bsConfig.auth.access_key + }, + headers: options.headers + }); + let build = null; try { - build = JSON.parse(body); + build = response.data; } catch (error) { build = null; } - - if (resp.statusCode == 299) { + if (response.status == 299) { messageType = Constants.messageTypes.INFO; errorCode = 'api_deprecated'; - - if (build) { - message = build.message; - logger.info(message); - } else { - message = Constants.userMessages.API_DEPRECATED; - logger.info(message); - } - logger.info(utils.formatRequest(err, resp, body)); - } else if (resp.statusCode != 200) { + message = build ? build.message : Constants.userMessages.API_DEPRECATED; + logger.info(utils.formatRequest(response.statusText, response, response.data)); + } else if (response.status != 200) { + message = Constants.userMessages.BUILD_INFO_FAILED; messageType = Constants.messageTypes.ERROR; errorCode = 'api_failed_build_info'; - if (build) { message = `${ Constants.userMessages.BUILD_INFO_FAILED } with error: \n${JSON.stringify(build, null, 2)}`; - logger.error(message); if (build.message === 'Unauthorized') errorCode = 'api_auth_failed'; } else { message = Constants.userMessages.BUILD_INFO_FAILED; - logger.error(message); } - logger.error(utils.formatRequest(err, resp, body)); + logger.error(message); + logger.error(utils.formatRequest(response.statusText, response, response.data)); } else { messageType = Constants.messageTypes.SUCCESS; message = `Build info for build id: \n ${JSON.stringify( @@ -92,11 +81,16 @@ module.exports = function info(args, rawArgs) { null, 2 )}`; - logger.info(message); } - } - utils.sendUsageReport(bsConfig, args, message, messageType, errorCode, buildReportData, rawArgs); - }); + logger.info(message); + } catch (error) { + message = Constants.userMessages.BUILD_INFO_FAILED; + messageType = Constants.messageTypes.ERROR; + errorCode = 'api_failed_build_info'; + logger.info(message); + logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); + } + utils.sendUsageReport(bsConfig, args, message, messageType, errorCode, buildReportData, rawArgs); }).catch((err) => { logger.warn(err); }); diff --git a/bin/commands/stop.js b/bin/commands/stop.js index 5dc29e56..966fa1a1 100644 --- a/bin/commands/stop.js +++ b/bin/commands/stop.js @@ -1,5 +1,4 @@ 'use strict'; -const request = require('request'); const config = require("../helpers/config"), logger = require("../helpers/logger").winstonLogger, diff --git a/bin/helpers/build.js b/bin/helpers/build.js index acd9b804..cef2c8bb 100644 --- a/bin/helpers/build.js +++ b/bin/helpers/build.js @@ -1,5 +1,5 @@ 'use strict'; -const request = require('request'); +const axios = require('axios').default; const config = require('./config'), capabilityHelper = require("../helpers/capabilityHelper"), @@ -9,7 +9,7 @@ const config = require('./config'), const createBuild = (bsConfig, zip) => { return new Promise(function (resolve, reject) { - capabilityHelper.caps(bsConfig, zip).then(function(data){ + capabilityHelper.caps(bsConfig, zip).then(async function(data){ let options = { url: config.buildUrl, auth: { @@ -23,38 +23,41 @@ const createBuild = (bsConfig, zip) => { body: data } - request.post(options, function (err, resp, body) { - if (err) { - logger.error(utils.formatRequest(err, resp, body)); - reject(err); - } else { - let build = null; - try { - build = JSON.parse(body); - } catch (error) { - build = null; + try { + const response = await axios.post(options.url, data, { + auth: { + username: options.auth.user, + password: options.auth.password + }, + headers: options.headers + }); + let build = null; + try { + build = response.data; + } catch (error) { + build = null; + } + if (response.status == 299) { + if (build) { + resolve(build.message); + } else { + logger.error(utils.formatRequest(response.statusText, response, response.data)); + reject(Constants.userMessages.API_DEPRECATED); } - - if (resp.statusCode == 299) { - if (build) { - resolve(build.message); - } else { - logger.error(utils.formatRequest(err, resp, body)); - reject(Constants.userMessages.API_DEPRECATED); - } - } else if (resp.statusCode != 201) { - logger.error(utils.formatRequest(err, resp, body)); - if (build) { - reject(`${Constants.userMessages.BUILD_FAILED} Error: ${build.message}`); - } else { - reject(Constants.userMessages.BUILD_FAILED); - } + } else if (response.status != 201) { + logger.error(utils.formatRequest(response.statusText, response, response.data)); + if (build) { + reject(`${Constants.userMessages.BUILD_FAILED} Error: ${build.message}`); } else { - resolve(build); + reject(Constants.userMessages.BUILD_FAILED); } - resolve(build); } - }) + resolve(build); + } catch (error) { + if(error.response) + logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); + reject(error); + } }).catch(function(err){ reject(err); }); diff --git a/bin/helpers/buildArtifacts.js b/bin/helpers/buildArtifacts.js index 620fc44e..b9b2295d 100644 --- a/bin/helpers/buildArtifacts.js +++ b/bin/helpers/buildArtifacts.js @@ -10,7 +10,9 @@ const logger = require('./logger').winstonLogger, Constants = require("./constants"), config = require("./config"); -const request = require('request'); +const { default: axios } = require('axios'); +const HttpsProxyAgent = require('https-proxy-agent'); +const FormData = require('form-data'); let BUILD_ARTIFACTS_TOTAL_COUNT = 0; @@ -97,14 +99,14 @@ const downloadAndUnzip = async (filePath, fileName, url) => { const writer = fs.createWriteStream(tmpFilePath); return new Promise(async (resolve, reject) => { - request.get(url).on('response', function(response) { - - if(response.statusCode != 200) { - reject(); + try { + const response = await axios.get(url, {responseType: 'stream'}); + if(response.status != 200) { + reject() } else { //ensure that the user can call `then()` only when the file has //been downloaded entirely. - response.pipe(writer); + response.data.pipe(writer); let error = null; writer.on('error', err => { error = err; @@ -121,7 +123,9 @@ const downloadAndUnzip = async (filePath, fileName, url) => { //'error' stream; }); } - }); + } catch (error) { + reject(); + } }); } @@ -159,26 +163,31 @@ const sendUpdatesToBstack = async (bsConfig, buildId, args, options, rawArgs, bu options.formData = data.toString(); let responseData = null; return new Promise (async (resolve, reject) => { - request.post(options, function (err, resp, data) { - if(err) { - utils.sendUsageReport(bsConfig, args, err, Constants.messageTypes.ERROR, 'api_failed_build_artifacts_status_update', buildReportData, rawArgs); - logger.error(utils.formatRequest(err, resp, data)); - reject(err); - } else { - try { - responseData = JSON.parse(data); - } catch(e) { - responseData = {}; - } - if (resp.statusCode != 200) { - if (responseData && responseData["error"]) { - utils.sendUsageReport(bsConfig, args, responseData["error"], Constants.messageTypes.ERROR, 'api_failed_build_artifacts_status_update', buildReportData, rawArgs); - reject(responseData["error"]) - } + try { + const response = await axios.post(options.url, data, { + auth: { + username: options.auth.username, + password: options.auth.password + }, + headers: options.headers + }); + try { + responseData = response.data; + } catch(e) { + responseData = {}; + } + if (response.status != 200) { + if (responseData && responseData["error"]) { + utils.sendUsageReport(bsConfig, args, responseData["error"], Constants.messageTypes.ERROR, 'api_failed_build_artifacts_status_update', buildReportData, rawArgs); + reject(responseData["error"]) } } - resolve() - }); + resolve(); + } catch (error) { + utils.sendUsageReport(bsConfig, args, error.response, Constants.messageTypes.ERROR, 'api_failed_build_artifacts_status_update', buildReportData, rawArgs); + logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); + reject(errror.response); + } }); } @@ -202,53 +211,60 @@ exports.downloadBuildArtifacts = async (bsConfig, buildId, args, rawArgs, buildR let messageType = null; let errorCode = null; let buildDetails = null; - request.get(options, async function (err, resp, body) { - if(err) { - logger.error(utils.formatRequest(err, resp, body)); - utils.sendUsageReport(bsConfig, args, err, Constants.messageTypes.ERROR, 'api_failed_build_artifacts', buildReportData, rawArgs); - process.exitCode = Constants.ERROR_EXIT_CODE; - } else { - try { - buildDetails = JSON.parse(body); - if(resp.statusCode != 200) { - logger.error('Downloading the build artifacts failed.'); - logger.error(`Error: Request failed with status code ${resp.statusCode}`) - logger.error(utils.formatRequest(err, resp, body)); - utils.sendUsageReport(bsConfig, args, buildDetails, Constants.messageTypes.ERROR, 'api_failed_build_artifacts', buildReportData, rawArgs); - process.exitCode = Constants.ERROR_EXIT_CODE; - } else { - await createDirectories(buildId, buildDetails); - await parseAndDownloadArtifacts(buildId, buildDetails); - if (BUILD_ARTIFACTS_FAIL_COUNT > 0) { - messageType = Constants.messageTypes.ERROR; - message = Constants.userMessages.DOWNLOAD_BUILD_ARTIFACTS_FAILED.replace('', buildId).replace('', BUILD_ARTIFACTS_FAIL_COUNT); - logger.error(message); - process.exitCode = Constants.ERROR_EXIT_CODE; - } else { - messageType = Constants.messageTypes.SUCCESS; - message = Constants.userMessages.DOWNLOAD_BUILD_ARTIFACTS_SUCCESS.replace('', buildId).replace('', process.cwd()); - logger.info(message); - } - await sendUpdatesToBstack(bsConfig, buildId, args, options, rawArgs, buildReportData) - utils.sendUsageReport(bsConfig, args, message, messageType, null, buildReportData, rawArgs); - } - } catch (err) { - messageType = Constants.messageTypes.ERROR; - errorCode = 'api_failed_build_artifacts'; + const config = {}; + if(process.env.HTTP_PROXY){ + options.config.proxy = false; + options.config.httpAgent = new HttpsProxyAgent(process.env.HTTP_PROXY); + } else if (process.env.HTTPS_PROXY){ + options.config.proxy = false; + options.config.httpAgent = new HttpsProxyAgent(process.env.HTTPS_PROXY); + } + try { + const response = await axios.get(options.url, config); + try { + buildDetails = response.data; + if(response.status != 200) { + logger.error('Downloading the build artifacts failed.'); + logger.error(`Error: Request failed with status code ${response.status}`) + logger.error(utils.formatRequest(response.statusText, response, response.data)); + utils.sendUsageReport(bsConfig, args, JSON.stringify(buildDetails), Constants.messageTypes.ERROR, 'api_failed_build_artifacts', buildReportData, rawArgs); + process.exitCode = Constants.ERROR_EXIT_CODE; + } else { + await createDirectories(buildId, buildDetails); + await parseAndDownloadArtifacts(buildId, buildDetails); if (BUILD_ARTIFACTS_FAIL_COUNT > 0) { messageType = Constants.messageTypes.ERROR; message = Constants.userMessages.DOWNLOAD_BUILD_ARTIFACTS_FAILED.replace('', buildId).replace('', BUILD_ARTIFACTS_FAIL_COUNT); logger.error(message); + process.exitCode = Constants.ERROR_EXIT_CODE; } else { - logger.error('Downloading the build artifacts failed.'); + messageType = Constants.messageTypes.SUCCESS; + message = Constants.userMessages.DOWNLOAD_BUILD_ARTIFACTS_SUCCESS.replace('', buildId).replace('', process.cwd()); + logger.info(message); } - utils.sendUsageReport(bsConfig, args, err, messageType, errorCode, buildReportData, rawArgs); - logger.error(`Error: Request failed with status code ${resp.statusCode}`) - logger.error(utils.formatRequest(err, resp, body)); - process.exitCode = Constants.ERROR_EXIT_CODE; + await sendUpdatesToBstack(bsConfig, buildId, args, options, rawArgs, buildReportData) + utils.sendUsageReport(bsConfig, args, message, messageType, null, buildReportData, rawArgs); + } + } catch (err) { + messageType = Constants.messageTypes.ERROR; + errorCode = 'api_failed_build_artifacts'; + if (BUILD_ARTIFACTS_FAIL_COUNT > 0) { + messageType = Constants.messageTypes.ERROR; + message = Constants.userMessages.DOWNLOAD_BUILD_ARTIFACTS_FAILED.replace('', buildId).replace('', BUILD_ARTIFACTS_FAIL_COUNT); + logger.error(message); + } else { + logger.error('Downloading the build artifacts failed.'); } + utils.sendUsageReport(bsConfig, args, err, messageType, errorCode, buildReportData, rawArgs); + logger.error(`Error: Request failed with status code ${resp.statusCode}`) + logger.error(utils.formatRequest(err, resp, body)); + process.exitCode = Constants.ERROR_EXIT_CODE; } resolve(); - }); + } catch (error) { + logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); + utils.sendUsageReport(bsConfig, args, error.response, Constants.messageTypes.ERROR, 'api_failed_build_artifacts', buildReportData, rawArgs); + process.exitCode = Constants.ERROR_EXIT_CODE; + } }); }; diff --git a/bin/helpers/checkUploaded.js b/bin/helpers/checkUploaded.js index 32cafb5d..37121255 100644 --- a/bin/helpers/checkUploaded.js +++ b/bin/helpers/checkUploaded.js @@ -1,5 +1,5 @@ 'use strict'; -const request = require('request'); +const { default: axios } = require('axios'); const crypto = require('crypto'), Constants = require('./constants'), @@ -93,7 +93,7 @@ const checkUploadedMd5 = (bsConfig, args, instrumentBlocks) => { } instrumentBlocks.markBlockStart("checkAlreadyUploaded.md5Total"); - checkSpecsMd5(bsConfig.run_settings, args, instrumentBlocks).then(function (zip_md5sum) { + checkSpecsMd5(bsConfig.run_settings, args, instrumentBlocks).then(async function (zip_md5sum) { instrumentBlocks.markBlockStart("checkAlreadyUploaded.md5Package"); let npm_package_md5sum = checkPackageMd5(bsConfig.run_settings); instrumentBlocks.markBlockEnd("checkAlreadyUploaded.md5Package"); @@ -118,43 +118,48 @@ const checkUploadedMd5 = (bsConfig, args, instrumentBlocks) => { 'Content-Type': 'application/json', "User-Agent": utils.getUserAgent(), }, - body: JSON.stringify(data) + body: data }; instrumentBlocks.markBlockStart("checkAlreadyUploaded.railsCheck"); - request.post(options, function (err, resp, body) { - if (err) { - instrumentBlocks.markBlockEnd("checkAlreadyUploaded.railsCheck"); - resolve(obj); - } else { - let zipData = null; - try { - zipData = JSON.parse(body); - } catch (error) { - zipData = {}; - } - if (resp.statusCode === 200) { - if (!utils.isUndefined(zipData.zipUrl)) { - Object.assign(obj, zipData, {zipUrlPresent: true}); - } - if (!utils.isUndefined(zipData.npmPackageUrl)) { - Object.assign(obj, zipData, {packageUrlPresent: true}); - } - } - if (utils.isTrueString(zipData.disableNpmSuiteCache)) { - bsConfig.run_settings.cache_dependencies = false; - Object.assign(obj, {packageUrlPresent: false}); - delete obj.npm_package_md5sum; + try { + const response = await axios.post(options.url, options.body, { + auth: { + username: options.auth.user, + username: options.auth.password + }, + headers: options.headers + }) + let zipData = null; + try { + zipData = response.data; + } catch (error) { + zipData = {}; + } + if (response.status === 200) { + if (!utils.isUndefined(zipData.zipUrl)) { + Object.assign(obj, zipData, {zipUrlPresent: true}); } - if (utils.isTrueString(zipData.disableTestSuiteCache)) { - args["force-upload"] = true; - Object.assign(obj, {zipUrlPresent: false}); - delete obj.zip_md5sum; + if (!utils.isUndefined(zipData.npmPackageUrl)) { + Object.assign(obj, zipData, {packageUrlPresent: true}); } - instrumentBlocks.markBlockEnd("checkAlreadyUploaded.railsCheck"); - resolve(obj); } - }); + if (utils.isTrueString(zipData.disableNpmSuiteCache)) { + bsConfig.run_settings.cache_dependencies = false; + Object.assign(obj, {packageUrlPresent: false}); + delete obj.npm_package_md5sum; + } + if (utils.isTrueString(zipData.disableTestSuiteCache)) { + args["force-upload"] = true; + Object.assign(obj, {zipUrlPresent: false}); + delete obj.zip_md5sum; + } + instrumentBlocks.markBlockEnd("checkAlreadyUploaded.railsCheck"); + resolve(obj); + } catch (error) { + instrumentBlocks.markBlockEnd("checkAlreadyUploaded.railsCheck"); + resolve(obj); + } }).catch((err) => { let errString = err.stack ? err.stack.toString().substring(0,100) : err.toString().substring(0,100); resolve({zipUrlPresent: false, packageUrlPresent: false, error: errString}); diff --git a/bin/helpers/downloadBuildStacktrace.js b/bin/helpers/downloadBuildStacktrace.js index a7471038..5e6e67b6 100644 --- a/bin/helpers/downloadBuildStacktrace.js +++ b/bin/helpers/downloadBuildStacktrace.js @@ -1,11 +1,12 @@ -'use strict' -const request = require('request'); +'use strict'; +const { default: axios } = require('axios'); const downloadBuildStacktrace = async (url) => { return new Promise(async (resolve, reject) => { - request.get(url).on('response', function (response) { - if(response.statusCode == 200) { - response.pipe(process.stdout); + try { + const response = await axios.get(url, { responseType: 'stream' }); + if (response.status === 200) { + response.data.pipe(process.stdout); let error = null; process.stdout.on('error', (err) => { error = err; @@ -13,16 +14,14 @@ const downloadBuildStacktrace = async (url) => { reject(response.statusCode); }); process.stdout.on('close', async () => { - if(!error) { - resolve("Build stacktrace downloaded successfully"); + if (!error) { + resolve('Build stacktrace downloaded successfully'); } }); - } else { - reject(response.statusCode); } - }).on('end', () => { - resolve("Build stacktrace downloaded successfully"); - }); + } catch (error) { + reject(error.response.status); + } }); }; diff --git a/bin/helpers/getInitialDetails.js b/bin/helpers/getInitialDetails.js index 30d3114b..7a94aa67 100644 --- a/bin/helpers/getInitialDetails.js +++ b/bin/helpers/getInitialDetails.js @@ -1,11 +1,12 @@ -const request = require('request'), - logger = require('./logger').winstonLogger, +const { default: axios } = require('axios'); + +const logger = require('./logger').winstonLogger, utils = require('./utils'), config = require("./config"), Constants = require('./constants'); exports.getInitialDetails = (bsConfig, args, rawArgs) => { - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { let options = { url: config.getInitialDetails, auth: { @@ -17,28 +18,30 @@ exports.getInitialDetails = (bsConfig, args, rawArgs) => { } }; let responseData = {}; - request.get(options, function (err, resp, data) { - if(err) { - logger.warn(utils.formatRequest(err, resp, data)); - utils.sendUsageReport(bsConfig, args, err, Constants.messageTypes.ERROR, 'get_initial_details_failed', null, rawArgs); + try { + const response = await axios.get(options.url, { + auth: options.auth, + headers: options.headers, + }); + try { + responseData = response.data; + } catch (e) { + responseData = {}; + } + if(response.status != 200) { + logger.warn(`Warn: Get Initial Details Request failed with status code ${response.status}`); + utils.sendUsageReport(bsConfig, args, responseData["error"], Constants.messageTypes.ERROR, 'get_initial_details_failed', null, rawArgs); resolve({}); } else { - try { - responseData = JSON.parse(data); - } catch (e) { - responseData = {}; - } - if(resp.statusCode != 200) { - logger.warn(`Warn: Get Initial Details Request failed with status code ${resp.statusCode}`); - utils.sendUsageReport(bsConfig, args, responseData["error"], Constants.messageTypes.ERROR, 'get_initial_details_failed', null, rawArgs); - resolve({}); - } else { - if (!utils.isUndefined(responseData.grr) && responseData.grr.enabled && !utils.isUndefined(responseData.grr.urls)) { - config.uploadUrl = responseData.grr.urls.upload_url; - } - resolve(responseData); + if (!utils.isUndefined(responseData.grr) && responseData.grr.enabled && !utils.isUndefined(responseData.grr.urls)) { + config.uploadUrl = responseData.grr.urls.upload_url; } + resolve(responseData); } - }); + } catch (error) { + logger.warn(utils.formatRequest(error.response.statusText, error.response, error.response.data)); + utils.sendUsageReport(bsConfig, args, error.response, Constants.messageTypes.ERROR, 'get_initial_details_failed', null, rawArgs); + resolve({}); + } }); }; diff --git a/bin/helpers/reporterHTML.js b/bin/helpers/reporterHTML.js index dd8f605c..15060c87 100644 --- a/bin/helpers/reporterHTML.js +++ b/bin/helpers/reporterHTML.js @@ -1,13 +1,14 @@ +const axios = require('axios').default; + const fs = require('fs'), path = require('path'), - request = require('request'), unzipper = require('unzipper'), logger = require('./logger').winstonLogger, utils = require("./utils"), Constants = require('./constants'), config = require("./config"); -let reportGenerator = (bsConfig, buildId, args, rawArgs, buildReportData, cb) => { +let reportGenerator = async (bsConfig, buildId, args, rawArgs, buildReportData, cb) => { let options = { url: `${config.buildUrl}${buildId}/custom_report`, auth: { @@ -21,32 +22,25 @@ let reportGenerator = (bsConfig, buildId, args, rawArgs, buildReportData, cb) => logger.debug('Started fetching the build json and html reports.'); - return request.get(options, async function (err, resp, body) { - let message = null; - let messageType = null; - let errorCode = null; - let build; - - if (err) { - message = err; - messageType = Constants.messageTypes.ERROR; - errorCode = 'api_failed_build_report'; - - logger.error('Generating the build report failed.'); - logger.error(utils.formatRequest(err, resp, body)); - - utils.sendUsageReport(bsConfig, args, message, messageType, errorCode, buildReportData, rawArgs); - return; - } else { - logger.debug('Received reports data from upstream.'); - try { - build = JSON.parse(body); - } catch (error) { - build = null; - } + let message = null; + let messageType = null; + let errorCode = null; + let build; + try { + const response = await axios.get(options.url, { + auth: { + username: options.auth.user, + password: options.auth.password + }, + headers: options.headers + }); + logger.debug('Received reports data from upstream.'); + try { + build = response.data; + } catch (error) { + build = null; } - - if (resp.statusCode == 299) { + if (response.status == 299) { messageType = Constants.messageTypes.INFO; errorCode = 'api_deprecated'; if (build) { @@ -56,18 +50,18 @@ let reportGenerator = (bsConfig, buildId, args, rawArgs, buildReportData, cb) => message = Constants.userMessages.API_DEPRECATED; logger.info(message); } - } else if (resp.statusCode === 422) { + } else if (response.status === 422) { messageType = Constants.messageTypes.ERROR; errorCode = 'api_failed_build_generate_report'; try { - response = JSON.parse(body); + response = error.response.data; message = response.message; } catch (error) { logger.error(`Error generating the report: ${error}`); response = {message: message}; } - logger.error(utils.formatRequest(err, resp, body)); - } else if (resp.statusCode != 200) { + logger.error(utils.formatRequest(response.statusText, response, response.data)); + } else if (response.status != 200) { messageType = Constants.messageTypes.ERROR; errorCode = 'api_failed_build_generate_report'; @@ -79,7 +73,7 @@ let reportGenerator = (bsConfig, buildId, args, rawArgs, buildReportData, cb) => if (build.message === 'Unauthorized') errorCode = 'api_auth_failed'; } else { message = Constants.userMessages.BUILD_GENERATE_REPORT_FAILED.replace('', buildId); - logger.error(utils.formatRequest(err, resp, body)); + logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); } } else { messageType = Constants.messageTypes.SUCCESS; @@ -92,7 +86,16 @@ let reportGenerator = (bsConfig, buildId, args, rawArgs, buildReportData, cb) => if (cb){ cb(); } - }); + } catch (error) { + message = error.response.statusText; + messageType = Constants.messageTypes.ERROR; + errorCode = 'api_failed_build_report'; + + logger.error('Generating the build report failed.'); + logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); + utils.sendUsageReport(bsConfig, args, message, messageType, errorCode, buildReportData, rawArgs); + return; + } } async function generateCypressBuildReport(report_data) { @@ -111,15 +114,12 @@ function getReportResponse(filePath, fileName, reportJsonUrl) { const writer = fs.createWriteStream(tmpFilePath); logger.debug(`Fetching build reports zip.`) return new Promise(async (resolve, reject) => { - request.get(reportJsonUrl).on('response', function(response) { - - if(response.statusCode != 200) { - let message = `Received non 200 response while fetching reports, code: ${response.statusCode}`; - reject(message); - } else { + try { + const response = await axios.get(reportJsonUrl, {responseType: 'stream'}); + if(response.status === 200) { //ensure that the user can call `then()` only when the file has //been downloaded entirely. - response.pipe(writer); + response.data.pipe(writer); let error = null; writer.on('error', err => { error = err; @@ -144,7 +144,10 @@ function getReportResponse(filePath, fileName, reportJsonUrl) { //'error' stream; }); } - }); + } catch (error) { + let message = `Received non 200 response while fetching reports, code: ${error.response.status}`; + reject(message); + } }); } diff --git a/bin/helpers/sync/syncSpecsLogs.js b/bin/helpers/sync/syncSpecsLogs.js index 5f93504f..1f1a8572 100644 --- a/bin/helpers/sync/syncSpecsLogs.js +++ b/bin/helpers/sync/syncSpecsLogs.js @@ -1,6 +1,8 @@ "use strict"; -const request = require("request"), - config = require("../config"), + +const { default: axios } = require("axios"); + +const config = require("../config"), utils = require("../utils"), logger = require("../logger").syncCliLogger, winstonLogger = require("../logger").winstonLogger, @@ -129,42 +131,50 @@ let printSpecsStatus = (bsConfig, buildDetails, rawArgs, buildReportData) => { }); }; -let whileProcess = (whilstCallback) => { - request.post(options, function(error, response, body) { - if (error) { - whileTries -= 1; - if (whileTries === 0) { - whileLoop = false; - endTime = Date.now(); - specSummary.exitCode = config.networkErrorExitCode; - return whilstCallback({ status: 504, message: "Tries limit reached" }); //Gateway Timeout - } else { - n = 2 - return setTimeout(whilstCallback, timeout * n, null); - } - } - +let whileProcess = async (whilstCallback) => { + try { + const response = await axios.post(options.url, null, { + auth: { + username: options.auth.user, + password: options.auth.password + }, + headers: options.headers + }); whileTries = config.retries; // reset to default after every successful request - - switch (response.statusCode) { + switch (response.status) { case 202: // get data here and print it n = 2 - showSpecsStatus(body, 202); + console.log("BODY", response.data) + showSpecsStatus(response.data, 202); return setTimeout(whilstCallback, timeout * n, null); case 204: // No data available, wait for some time and ask again n = 1 return setTimeout(whilstCallback, timeout * n, null); case 200: // Build is completed. + console.log("HEREEE") whileLoop = false; endTime = Date.now(); - showSpecsStatus(body, 200); + showSpecsStatus(response.data, 200); return specSummary.exitCode == Constants.BUILD_FAILED_EXIT_CODE ? whilstCallback({ status: 204, message: "No specs ran in the build"} ) : whilstCallback(null, body); default: whileLoop = false; - return whilstCallback({ status: response.statusCode, message: body }); + return whilstCallback({ status: response.status, message: response.data }); } - }); + } catch (error) { + if (error) { + whileTries -= 1; + if (whileTries === 0) { + whileLoop = false; + endTime = Date.now(); + specSummary.exitCode = config.networkErrorExitCode; + return whilstCallback({ status: 504, message: "Tries limit reached" }); //Gateway Timeout + } else { + n = 2 + return setTimeout(whilstCallback, timeout * n, null); + } + } + } } let getStackTraceUrl = () => { @@ -172,7 +182,7 @@ let getStackTraceUrl = () => { } let showSpecsStatus = (data, statusCode) => { - let specData = JSON.parse(data); + let specData = data; specData["specData"].forEach(specDetails => { if (specDetails.type === Constants.CYPRESS_CUSTOM_ERRORS_TO_PRINT_KEY) { addCustomErrorToPrint(specDetails); diff --git a/bin/helpers/usageReporting.js b/bin/helpers/usageReporting.js index ed5e42ba..4e4170d3 100644 --- a/bin/helpers/usageReporting.js +++ b/bin/helpers/usageReporting.js @@ -1,7 +1,6 @@ 'use strict'; const cp = require("child_process"), os = require("os"), - request = require("requestretry"), fs = require('fs'), path = require('path'); @@ -10,6 +9,8 @@ const config = require('./config'), utils = require('./utils'); const { AUTH_REGEX, REDACTED_AUTH, REDACTED, CLI_ARGS_REGEX, RAW_ARGS_REGEX } = require("./constants"); +const { default: axios } = require("axios"); +const axiosRetry = require("axios-retry"); function get_version(package_name) { try { @@ -197,7 +198,7 @@ function redactKeys(str, regex, redact) { return str.replace(regex, redact); } -function send(args) { +async function send(args) { if (isUsageReportingEnabled() === "true") return; let bsConfig = JSON.parse(JSON.stringify(args.bstack_config)); @@ -268,24 +269,31 @@ function send(args) { json: true, maxAttempts: 10, // (default) try 3 times retryDelay: 2000, // (default) wait for 2s before trying again - retrySrategy: request.RetryStrategies.HTTPOrNetworkError, // (default) retry on 5xx or network errors }; fileLogger.info(`Sending ${JSON.stringify(payload)} to ${config.usageReportingUrl}`); - request(options, function (error, res, body) { - if (error) { - //write err response to file - fileLogger.error(JSON.stringify(error)); - return; + axiosRetry(axios, + { + retries: 3, + retryDelay: 2000, + retryCondition: (error) => { + return (error.response.status === 503 || error.response.status === 500) } - // write response file - let response = { - attempts: res.attempts, - statusCode: res.statusCode, - body: body - }; - fileLogger.info(`${JSON.stringify(response)}`); }); + try { + const response = await axios.post(options.url, options.payload, { + headers: options.headers, + }); + let result = { + statusText: response.statusText, + statusCode: response.status, + body: response.data + }; + fileLogger.info(`${JSON.stringify(result)}`); + } catch (error) { + fileLogger.error(JSON.stringify(error.response)); + return; + } } module.exports = { diff --git a/bin/helpers/utils.js b/bin/helpers/utils.js index 08f0326b..5ed35f82 100644 --- a/bin/helpers/utils.js +++ b/bin/helpers/utils.js @@ -22,7 +22,7 @@ const usageReporting = require("./usageReporting"), pkg = require('../../package.json'), transports = require('./logger').transports; -const request = require('request'); +const { default: axios } = require("axios"); exports.validateBstackJson = (bsConfigPath) => { return new Promise(function (resolve, reject) { @@ -934,14 +934,21 @@ exports.checkLocalBinaryRunning = (bsConfig, localIdentifier) => { }, body: JSON.stringify({ localIdentifier: localIdentifier}), }; - return new Promise ( function(resolve, reject) { - request.post(options, function (err, resp, body) { - if(err){ - reject(err); - } - let response = JSON.parse(body); - resolve(response); - }); + return new Promise (async function(resolve, reject) { + try { + const response = await axios.post(options.url, { + localIdentifier: localIdentifier + }, { + auth: { + username: options.auth.user, + password: options.auth.password + }, + headers: options.headers + }); + resolve(response.data) + } catch (error) { + reject(error); + } }); }; @@ -1254,7 +1261,7 @@ exports.setCLIMode = (bsConfig, args) => { exports.formatRequest = (err, resp, body) => { return { err, - status: resp ? resp.statusCode : null, + status: resp ? resp.status : null, body: body ? util.format('%j', body) : null } } @@ -1274,73 +1281,74 @@ exports.setDebugMode = (args) => { exports.stopBrowserStackBuild = async (bsConfig, args, buildId, rawArgs, buildReportData = null) => { let that = this; - return new Promise(function (resolve, reject) { - let url = config.buildStopUrl + buildId; - let options = { - url: url, - auth: { - username: bsConfig["auth"]["username"], - password: bsConfig["auth"]["access_key"], - }, - headers: { - 'User-Agent': that.getUserAgent(), - }, - }; - let message = null; - let messageType = null; - let errorCode = null; - let build = null; - request.post(options, function(err, resp, data) { - if(err) { - message = Constants.userMessages.BUILD_STOP_FAILED; + + let url = config.buildStopUrl + buildId; + let options = { + url: url, + auth: { + username: bsConfig["auth"]["username"], + password: bsConfig["auth"]["access_key"], + }, + headers: { + 'User-Agent': that.getUserAgent(), + }, + }; + let message = null; + let messageType = null; + let errorCode = null; + let build = null; + + try { + const response = await axios.post(options.url, {}, { + auth: options.auth, + headers: options.headers + }); + try { + build = response.data; + if (response.status == 299) { + messageType = Constants.messageTypes.INFO; + errorCode = 'api_deprecated'; + + if (build) { + message = build.message; + logger.info(message); + } else { + message = Constants.userMessages.API_DEPRECATED; + logger.info(message); + } + } else if (response.status !== 200) { messageType = Constants.messageTypes.ERROR; errorCode = 'api_failed_build_stop'; - logger.info(message); - } else { - try { - build = JSON.parse(data); - if (resp.statusCode == 299) { - messageType = Constants.messageTypes.INFO; - errorCode = 'api_deprecated'; - - if (build) { - message = build.message; - logger.info(message); - } else { - message = Constants.userMessages.API_DEPRECATED; - logger.info(message); - } - } else if (resp.statusCode != 200) { - messageType = Constants.messageTypes.ERROR; - errorCode = 'api_failed_build_stop'; - - if (build) { - message = `${ - Constants.userMessages.BUILD_STOP_FAILED - } with error: \n${JSON.stringify(build, null, 2)}`; - logger.error(message); - if (build.message === 'Unauthorized') errorCode = 'api_auth_failed'; - } else { - message = Constants.userMessages.BUILD_STOP_FAILED; - logger.error(message); - } - } else { - messageType = Constants.messageTypes.SUCCESS; - message = `${JSON.stringify(build, null, 2)}`; - logger.info(message); - } - } catch(err) { + + if (build) { + message = `${ + Constants.userMessages.BUILD_STOP_FAILED + } with error: \n${JSON.stringify(build, null, 2)}`; + logger.error(message); + if (build.message === 'Unauthorized') errorCode = 'api_auth_failed'; + } else { message = Constants.userMessages.BUILD_STOP_FAILED; - messageType = Constants.messageTypes.ERROR; - errorCode = 'api_failed_build_stop'; - logger.info(message); - } finally { - that.sendUsageReport(bsConfig, args, message, messageType, errorCode, buildReportData, rawArgs); + logger.error(message); } + } else { + messageType = Constants.messageTypes.SUCCESS; + message = `${JSON.stringify(build, null, 2)}`; + logger.info(message); } - resolve(); - }); - }); + } catch(err) { + message = Constants.userMessages.BUILD_STOP_FAILED; + messageType = Constants.messageTypes.ERROR; + errorCode = 'api_failed_build_stop'; + logger.info(message); + } finally { + that.sendUsageReport(bsConfig, args, message, messageType, errorCode, buildReportData, rawArgs); + } + } catch (error) { + message = Constants.userMessages.BUILD_STOP_FAILED; + messageType = Constants.messageTypes.ERROR; + errorCode = 'api_failed_build_stop'; + logger.info(message); + } } exports.setProcessHooks = (buildId, bsConfig, bsLocal, args, buildReportData) => { diff --git a/bin/helpers/zipUpload.js b/bin/helpers/zipUpload.js index 441f9ec0..7657cc9c 100644 --- a/bin/helpers/zipUpload.js +++ b/bin/helpers/zipUpload.js @@ -1,9 +1,10 @@ 'use strict'; -const request = require("request"), - fs = require("fs"); +const fs = require("fs"); const cliProgress = require('cli-progress'); +const { default: axios } = require("axios"); +const FormData = require("form-data"); const config = require("./config"), logger = require("./logger").winstonLogger, @@ -16,11 +17,11 @@ const purgeUploadBar = (obj) => { speed: ((obj.size / (Date.now() - obj.startTime)) / 125).toFixed(2) //kbits per sec }); obj.bar1.stop(); - clearInterval(obj.zipInterval); + // clearInterval(obj.zipInterval); } const uploadSuits = (bsConfig, filePath, opts, obj) => { - return new Promise(function (resolve, reject) { + return new Promise(async function (resolve, reject) { let uploadProgressBarErrorFlags = { noConnectionReportSent: false, unknownErrorReportSent: false @@ -54,94 +55,65 @@ const uploadSuits = (bsConfig, filePath, opts, obj) => { let options = utils.generateUploadParams(bsConfig, filePath, opts.md5Data, opts.fileDetails) let responseData = null; - var r = request.post(options, function (err, resp, body) { - - if (err) { - reject({message: err, stacktrace: utils.formatRequest(err, resp, body)}); - } else { - try { - responseData = JSON.parse(body); - } catch (e) { - responseData = {}; + try { + const formData = new FormData(); + formData.append("file", fs.createReadStream(filePath)); + formData.append("filetype", opts.fileDetails.filetype); + formData.append("filename", opts.fileDetails.filename); + formData.append("zipMd5sum", opts.md5Data ? opts.md5Data : ''); + const response = await axios.post(options.url, formData, { + auth: { + username: options.auth.user, + password: options.auth.password + }, + headers: options.headers, + onUploadProgress: (progressEvent) => { + let percent = progressEvent.loaded * 100.0 / progressEvent.total; + obj.bar1.update(percent, { + speed: ((progressEvent.loaded / (Date.now() - obj.startTime)) / 125).toFixed(2) //kbits per sec + }); } - if (resp.statusCode != 200) { - if (resp.statusCode == 401) { - if (responseData && responseData["error"]) { - responseData["time"] = Date.now() - obj.startTime; - return reject({message: responseData["error"], stacktrace: utils.formatRequest(err, resp, body)}); - } else { - return reject({message: Constants.validationMessages.INVALID_DEFAULT_AUTH_PARAMS, stacktrace: utils.formatRequest(err, resp, body)}); - } - } - if (!opts.propogateError){ - purgeUploadBar(obj); - if (resp.statusCode == 413) { - return resolve({warn: Constants.userMessages.NODE_MODULES_LIMIT_EXCEEDED.replace("%SIZE%", (size / 1000000).toFixed(2))}); - } - return resolve({}) - } - if(responseData && responseData["error"]){ - responseData["time"] = Date.now() - obj.startTime; - reject({message: responseData["error"], stacktrace: utils.formatRequest(err, resp, body)}); - } else { - if (resp.statusCode == 413) { - reject({message: Constants.userMessages.ZIP_UPLOAD_LIMIT_EXCEEDED, stacktrace: utils.formatRequest(err, resp, body)}); - } else { - reject({message: Constants.userMessages.ZIP_UPLOADER_NOT_REACHABLE, stacktrace: utils.formatRequest(err, resp, body)}); - } - } + }); + responseData = response.data; + purgeUploadBar(obj); + logger.info(`${opts.messages.uploadingSuccess} (${responseData[opts.md5ReturnKey]})`); + opts.cleanupMethod(); + responseData["time"] = Date.now() - obj.startTime; + resolve(responseData); + } catch (error) { + let responseData = null; + if(error.response){ + responseData = error.response.data; + } + if (error.response.status === 401) { + if (responseData && responseData.error) { + responseData.time = Date.now() - obj.startTime; + return reject({message: responseData.error, stacktrace: utils.formatRequest(responseData.error, error.response, responseData)}); } else { - purgeUploadBar(obj); - logger.info(`${opts.messages.uploadingSuccess} (${responseData[opts.md5ReturnKey]})`); - opts.cleanupMethod(); - responseData["time"] = Date.now() - obj.startTime; - resolve(responseData); + return reject({message: Constants.validationMessages.INVALID_DEFAULT_AUTH_PARAMS, stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); + } + } + if (!opts.propogateError){ + purgeUploadBar(obj); + if (error.response.status === 413) { + return resolve({warn: Constants.userMessages.NODE_MODULES_LIMIT_EXCEEDED.replace("%SIZE%", (size / 1000000).toFixed(2))}); } + return resolve({}) } - }); - - obj.zipInterval = setInterval(function () { - const errorCode = 'update_upload_progress_bar_failed'; - try { - if (r && r.req && r.req.connection) { - let dispatched = r.req.connection._bytesDispatched; - let percent = dispatched * 100.0 / size; - obj.bar1.update(percent, { - speed: ((dispatched / (Date.now() - obj.startTime)) / 125).toFixed(2) //kbits per sec - }); + if(responseData && responseData["error"]){ + responseData["time"] = Date.now() - obj.startTime; + reject({message: responseData["error"], stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); + } else { + if (error.response.status === 413) { + reject({message: Constants.userMessages.ZIP_UPLOAD_LIMIT_EXCEEDED, stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); } else { - if (!uploadProgressBarErrorFlags.noConnectionReportSent) { - logger.debug(Constants.userMessages.NO_CONNECTION_WHILE_UPDATING_UPLOAD_PROGRESS_BAR); - utils.sendUsageReport( - bsConfig, - null, - Constants.userMessages.NO_CONNECTION_WHILE_UPDATING_UPLOAD_PROGRESS_BAR, - Constants.messageTypes.WARNING, - errorCode, - null, - null - ); - uploadProgressBarErrorFlags.noConnectionReportSent = true; - } - } - } catch (error) { - if (!uploadProgressBarErrorFlags.unknownErrorReportSent) { - logger.debug('Unable to determine progress.'); - logger.debug(error); - utils.sendUsageReport( - bsConfig, - null, - error.stack, - Constants.messageTypes.WARNING, - errorCode, - null, - null - ); - uploadProgressBarErrorFlags.unknownErrorReportSent = true; + reject({message: Constants.userMessages.ZIP_UPLOADER_NOT_REACHABLE, stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); } } - }, 150); - + if(error.response){ + reject({message: error.response, stacktrace: utils.formatRequest(error.response.statusText, error.response, error.response.data)}); + } + } }); } diff --git a/package.json b/package.json index 503d3961..56f63eda 100644 --- a/package.json +++ b/package.json @@ -14,15 +14,16 @@ "dependencies": { "archiver": "5.3.0", "async": "3.2.3", + "axios": "^1.4.0", + "axios-retry": "^3.5.0", "browserstack-local": "1.5.1", "chalk": "4.1.2", - "cli-progress": "3.10.0", + "cli-progress": "^3.10.0", + "form-data": "^4.0.0", "fs-extra": "8.1.0", "getmac": "5.20.0", "glob": "7.2.0", "mkdirp": "1.0.4", - "request": "2.88.2", - "requestretry": "7.1.0", "table": "5.4.6", "unzipper": "0.10.11", "update-notifier": "5.1.0", diff --git a/test/unit/bin/commands/info.js b/test/unit/bin/commands/info.js index f486be44..54ca6349 100644 --- a/test/unit/bin/commands/info.js +++ b/test/unit/bin/commands/info.js @@ -1,7 +1,7 @@ +const { default: axios } = require("axios"); const chai = require("chai"), chaiAsPromised = require("chai-as-promised"), - sinon = require('sinon'), - request = require('request'); + sinon = require('sinon'); const Constants = require("../../../../bin/helpers/constants"), logger = require("../../../../bin/helpers/logger").winstonLogger, @@ -49,7 +49,7 @@ describe("buildInfo", () => { let messageType = Constants.messageTypes.INFO; let errorCode = "api_deprecated"; - let requestStub = sandbox.stub(request, "get").yields(null, { statusCode: 299 }, null); + let axiosStub = sandbox.stub(axios, "get").resolves({ status: 299 }); const info = proxyquire('../../../../bin/commands/info', { '../helpers/utils': { @@ -68,7 +68,6 @@ describe("buildInfo", () => { '../helpers/getInitialDetails': { getInitialDetails: getInitialDetailsStub, }, - request: {get: requestStub}, }); validateBstackJsonStub.returns(Promise.resolve(bsConfig)); @@ -76,7 +75,7 @@ describe("buildInfo", () => { return info(args, rawArgs) .then(function (_bsConfig) { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getConfigPathStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnce(getInitialDetailsStub); @@ -91,9 +90,9 @@ describe("buildInfo", () => { let messageType = Constants.messageTypes.INFO; let errorCode = "api_deprecated"; - let requestStub = sandbox - .stub(request, "get") - .yields(null, { statusCode: 299 }, JSON.stringify(body)); + let axiosStub = sandbox + .stub(axios, "get") + .resolves({ status: 299, data: body }); const info = proxyquire('../../../../bin/commands/info', { '../helpers/utils': { @@ -112,7 +111,6 @@ describe("buildInfo", () => { '../helpers/getInitialDetails': { getInitialDetails: getInitialDetailsStub, }, - request: {get: requestStub}, }); getInitialDetailsStub.returns(Promise.resolve({})); @@ -120,7 +118,7 @@ describe("buildInfo", () => { return info(args, rawArgs) .then(function (_bsConfig) { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnce(getConfigPathStub); sinon.assert.calledOnce(getInitialDetailsStub); @@ -160,9 +158,9 @@ describe("buildInfo", () => { let messageType = Constants.messageTypes.ERROR; let errorCode = "api_failed_build_info"; - let requestStub = sinon - .stub(request, "get") - .yields(null, { statusCode: 400 }, null); + let axiosStub = sinon + .stub(axios, "get") + .resolves({ status: 400 }); const info = proxyquire('../../../../bin/commands/info', { '../helpers/utils': { @@ -181,7 +179,6 @@ describe("buildInfo", () => { '../helpers/getInitialDetails': { getInitialDetails: getInitialDetailsStub, }, - request: {get: requestStub}, }); validateBstackJsonStub.returns(Promise.resolve(bsConfig)); @@ -189,13 +186,14 @@ describe("buildInfo", () => { return info(args, rawArgs) .then(function (_bsConfig) { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnce(getConfigPathStub); sinon.assert.calledOnce(getInitialDetailsStub); sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, {}, rawArgs); }) .catch((error) => { + console.log(error) chai.assert.isNotOk(error, "Promise error"); }); }); @@ -210,9 +208,9 @@ describe("buildInfo", () => { let messageType = Constants.messageTypes.ERROR; let errorCode = "api_auth_failed"; - let requestStub = sinon - .stub(request, "get") - .yields(null, { statusCode: 401 }, JSON.stringify(body_with_message)); + let axiosStub = sinon + .stub(axios, "get") + .resolves({ status: 401, data: body_with_message }); const info = proxyquire('../../../../bin/commands/info', { '../helpers/utils': { @@ -231,20 +229,20 @@ describe("buildInfo", () => { '../helpers/getInitialDetails': { getInitialDetails: getInitialDetailsStub, }, - request: {get: requestStub}, }); validateBstackJsonStub.returns(Promise.resolve(bsConfig)); getInitialDetailsStub.returns(Promise.resolve({})); return info(args, rawArgs) .then(function (_bsConfig) { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnce(getConfigPathStub); sinon.assert.calledOnce(getInitialDetailsStub); sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, {}, rawArgs); }) .catch((error) => { + console.log(error) chai.assert.isNotOk(error, "Promise error"); }); }); @@ -254,9 +252,9 @@ describe("buildInfo", () => { let messageType = Constants.messageTypes.ERROR; let errorCode = "api_failed_build_info"; - let requestStub = sinon - .stub(request, "get") - .yields(null, { statusCode: 402 }, JSON.stringify(body)); + let axiosStub = sinon + .stub(axios, "get") + .resolves({ status: 402, data: body }); const info = proxyquire('../../../../bin/commands/info', { '../helpers/utils': { @@ -275,7 +273,6 @@ describe("buildInfo", () => { '../helpers/getInitialDetails': { getInitialDetails: getInitialDetailsStub, }, - request: {get: requestStub}, }); validateBstackJsonStub.returns(Promise.resolve(bsConfig)); @@ -283,7 +280,7 @@ describe("buildInfo", () => { return info(args, rawArgs) .then(function (_bsConfig) { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnce(getConfigPathStub); sinon.assert.calledOnce(getInitialDetailsStub); @@ -325,7 +322,7 @@ describe("buildInfo", () => { let messageType = Constants.messageTypes.SUCCESS; let errorCode = null; - let requestStub = sandbox.stub(request, "get").yields(null, { statusCode: 200 }, JSON.stringify(body)); + let axiosStub = sandbox.stub(axios, "get").resolves({ status: 200, data: body }); const info = proxyquire('../../../../bin/commands/info', { '../helpers/utils': { @@ -343,7 +340,6 @@ describe("buildInfo", () => { '../helpers/getInitialDetails': { getInitialDetails: getInitialDetailsStub, }, - request: {get: requestStub}, }); validateBstackJsonStub.returns(Promise.resolve(bsConfig)); @@ -351,7 +347,7 @@ describe("buildInfo", () => { return info(args, rawArgs) .then(function (_bsConfig) { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnce(getConfigPathStub); sinon.assert.calledOnce(getInitialDetailsStub); diff --git a/test/unit/bin/commands/stop.js b/test/unit/bin/commands/stop.js index b8116053..6ee61753 100644 --- a/test/unit/bin/commands/stop.js +++ b/test/unit/bin/commands/stop.js @@ -1,7 +1,6 @@ const chai = require("chai"), chaiAsPromised = require("chai-as-promised"), - sinon = require("sinon"), - request = require("request"); + sinon = require("sinon"); const Constants = require("../../../../bin/helpers/constants"), logger = require("../../../../bin/helpers/logger").winstonLogger, diff --git a/test/unit/bin/helpers/build.js b/test/unit/bin/helpers/build.js index 95208b8a..6961b1a0 100644 --- a/test/unit/bin/helpers/build.js +++ b/test/unit/bin/helpers/build.js @@ -1,7 +1,7 @@ +const { default: axios } = require("axios"); const chai = require("chai"), chaiAsPromised = require("chai-as-promised"), - sinon = require("sinon"), - request = require("request"); + sinon = require("sinon"); const Constants = require("../../../../bin/helpers/constants"), logger = require("../../../../bin/helpers/logger").winstonLogger, @@ -31,9 +31,9 @@ describe("build", () => { }); it("reject with error", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(new Error("random error"), null, null); + let axiosStub = sandbox + .stub(axios, "post") + .rejects(new Error("random error")); const build = proxyquire("../../../../bin/helpers/build", { "../helpers/utils": { @@ -43,7 +43,6 @@ describe("build", () => { "../helpers/capabilityHelper": { caps: capsStub, }, - request: { post: requestStub }, }); return build.createBuild(bsConfig, "random_zip_file") @@ -51,7 +50,7 @@ describe("build", () => { chai.assert.fail("Promise error"); }) .catch((error) => { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); chai.assert.equal(error.message, "random error"); }); @@ -59,9 +58,9 @@ describe("build", () => { describe("handle API deprecated", () => { it("build is null", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 299 }, null); + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ status: 299 }); const build = proxyquire("../../../../bin/helpers/build", { "../helpers/utils": { @@ -71,7 +70,6 @@ describe("build", () => { "../helpers/capabilityHelper": { caps: capsStub, }, - request: { post: requestStub }, }); return build @@ -80,7 +78,7 @@ describe("build", () => { chai.assert.fail("Promise error"); }) .catch((error) => { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); chai.assert.equal(error, Constants.userMessages.API_DEPRECATED); }); @@ -88,9 +86,9 @@ describe("build", () => { it("build is not null", () => { let build_message = "random message"; - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 299 }, JSON.stringify({ message: build_message })); + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ status: 299, data: { message: build_message} }); const build = proxyquire("../../../../bin/helpers/build", { "../helpers/utils": { @@ -99,17 +97,17 @@ describe("build", () => { "../helpers/capabilityHelper": { caps: capsStub, }, - request: { post: requestStub }, }); return build .createBuild(bsConfig, "random_zip_file") .then(function (data) { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); chai.assert.equal(data, "random message"); }) .catch((error) => { + console.log(error) chai.assert.isNotOk(error, "Promise error"); }); }); @@ -117,9 +115,9 @@ describe("build", () => { describe("handle statusCode != 201", () => { it("build is null", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 400 }, null); + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ status: 400 }); const build = proxyquire("../../../../bin/helpers/build", { "../helpers/utils": { @@ -129,7 +127,6 @@ describe("build", () => { "../helpers/capabilityHelper": { caps: capsStub, }, - request: { post: requestStub }, }); return build @@ -138,7 +135,7 @@ describe("build", () => { chai.assert.fail("Promise error"); }) .catch((error) => { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); chai.assert.equal(error, Constants.userMessages.BUILD_FAILED); }); @@ -146,12 +143,10 @@ describe("build", () => { it("build is not null", () => { let build_message = "random message"; - let requestStub = sandbox - .stub(request, "post") - .yields( - null, - { statusCode: 401 }, - JSON.stringify({ message: build_message }) + let axiosStub = sandbox + .stub(axios, "post") + .resolves( + { status: 401, data: { message: build_message }} ); const build = proxyquire("../../../../bin/helpers/build", { @@ -162,7 +157,6 @@ describe("build", () => { "../helpers/capabilityHelper": { caps: capsStub, }, - request: { post: requestStub }, }); return build @@ -171,7 +165,7 @@ describe("build", () => { chai.assert.fail("Promise error"); }) .catch((error) => { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); chai.assert.equal(error, `${Constants.userMessages.BUILD_FAILED} Error: ${build_message}`); }); @@ -181,32 +175,32 @@ describe("build", () => { it("build created successfuly", () => { let build_id = "random build id"; let build_message = "success" - let requestData = { message: build_message, build_id: build_id }; - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 201 }, JSON.stringify(requestData)); + let axiosData = { message: build_message, build_id: build_id }; + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ status: 201, data: axiosData }); let dashboardUrl = "dashboard-url"; const build = proxyquire("../../../../bin/helpers/build", { "../helpers/utils": { getUserAgent: getUserAgentStub, + formatRequest, }, "../helpers/capabilityHelper": { caps: capsStub, }, "./config": { dashboardUrl: dashboardUrl, - }, - request: { post: requestStub }, + }, }); return build .createBuild(bsConfig, "random_zip_file") .then(function (data) { - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); - chai.assert.equal(data, `${requestData}`); + chai.assert.equal(data, `${axiosData}`); }) .catch((error) => { chai.assert.isNotOk(error, "Promise error"); diff --git a/test/unit/bin/helpers/checkUploaded.js b/test/unit/bin/helpers/checkUploaded.js index 6d98a5ab..b49fdbdd 100644 --- a/test/unit/bin/helpers/checkUploaded.js +++ b/test/unit/bin/helpers/checkUploaded.js @@ -1,8 +1,8 @@ 'use strict'; +const { default: axios } = require("axios"); const chai = require("chai"), chaiAsPromised = require("chai-as-promised"), - sinon = require("sinon"), - request = require("request"); + sinon = require("sinon"); const logger = require("../../../../bin/helpers/logger").winstonLogger, testObjects = require("../../support/fixtures/testObjects"); @@ -37,14 +37,14 @@ describe("checkUploaded", () => { } }); - it("resolves with zipUrlPresent false due to request error", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(new Error("random error"), null, null); + it("resolves with zipUrlPresent false due to axios error", () => { + let axiosStub = sandbox + .stub(axios, "post") + .resolves(new Error("random error")); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, checkSpecsMd5: checkSpecsMd5Stub }); let checkUploadedMd5rewire = checkUploaded.__get__('checkUploadedMd5'); @@ -53,7 +53,7 @@ describe("checkUploaded", () => { chai.assert.equal(data.zip_md5sum, 'random_md5sum'); chai.assert.equal(data.zipUrlPresent, false); chai.assert.equal(data.packageUrlPresent, false); - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(checkSpecsMd5Stub); }) .catch((_error) => { @@ -62,14 +62,14 @@ describe("checkUploaded", () => { }); it("resolves with zipUrlPresent false and packageUrlPresent false due to checkSpecsMd5 error", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(new Error("random error"), null, null); + let axiosStub = sandbox + .stub(axios, "post") + .resolves(new Error("random error")); let checkSpecsMd5ErrorStub = sandbox.stub().returns(Promise.reject({message: "test error", stack: "test error stack"})); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, checkSpecsMd5: checkSpecsMd5ErrorStub }); let checkUploadedMd5rewire = checkUploaded.__get__('checkUploadedMd5'); @@ -78,7 +78,7 @@ describe("checkUploaded", () => { chai.assert.equal(data.zipUrlPresent, false); chai.assert.equal(data.packageUrlPresent, false); chai.assert.equal(data.error, "test error stack"); - sinon.assert.notCalled(requestStub); + sinon.assert.notCalled(axiosStub); sinon.assert.calledOnce(checkSpecsMd5ErrorStub); }) .catch((_error) => { @@ -87,13 +87,13 @@ describe("checkUploaded", () => { }); it("resolves with zipUrlPresent false and packageUrlPresent false due to parsing error", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 200 }, '{"zipUrl":"bs://random_hashid}'); + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ status: 200 , data: '{"zipUrl":"bs://random_hashid}'}); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, checkSpecsMd5: checkSpecsMd5Stub }); let checkUploadedMd5rewire = checkUploaded.__get__('checkUploadedMd5'); @@ -102,7 +102,7 @@ describe("checkUploaded", () => { chai.assert.equal(data.zipUrlPresent, false); chai.assert.equal(data.packageUrlPresent, false); chai.assert.equal(data.zip_md5sum, "random_md5sum"); - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(checkSpecsMd5Stub); }) .catch((_error) => { @@ -111,20 +111,20 @@ describe("checkUploaded", () => { }); it("resolves with zipUrlPresent true and zip url", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 200 }, '{"zipUrl":"bs://random_hashid"}'); + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ status: 200 , data: {"zipUrl":"bs://random_hashid"} }); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, checkSpecsMd5: checkSpecsMd5Stub }); let checkUploadedMd5rewire = checkUploaded.__get__('checkUploadedMd5'); return checkUploadedMd5rewire(bsConfig, {}, instrumentBlocks) .then((data) => { chai.assert.deepEqual(data, { zip_md5sum: 'random_md5sum', zipUrlPresent: true, packageUrlPresent: false, zipUrl: 'bs://random_hashid' }) - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(checkSpecsMd5Stub); }) .catch((_error) => { @@ -133,13 +133,13 @@ describe("checkUploaded", () => { }); it("resolves with zipUrlPresent true, packageUrlPresent true, zip url, and packge url", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 200 }, '{"zipUrl":"bs://random_hashid", "npmPackageUrl":"bs://random_hashid2"}'); + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ status: 200 , data: {"zipUrl":"bs://random_hashid", "npmPackageUrl":"bs://random_hashid2"}}); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, checkSpecsMd5: checkSpecsMd5Stub, checkPackageMd5: checkPackageMd5Stub }); @@ -148,7 +148,7 @@ describe("checkUploaded", () => { return checkUploadedMd5rewire(bsConfig, {}, instrumentBlocks) .then((data) => { chai.assert.deepEqual(data, { zip_md5sum: 'random_md5sum', npm_package_md5sum: 'random_md5sum', zipUrlPresent: true, packageUrlPresent: true, zipUrl: 'bs://random_hashid', npmPackageUrl: 'bs://random_hashid2' }) - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(checkSpecsMd5Stub); }) .catch((_error) => { @@ -157,13 +157,13 @@ describe("checkUploaded", () => { }); it("resolves with zipUrlPresent false as not found in db", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 404 }, '{"message":"zip_url for md5sum random_md5sum not found."}'); + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ statusCode: 404 , data: {"message":"zip_url for md5sum random_md5sum not found."}}); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, checkSpecsMd5: checkSpecsMd5Stub, checkPackageMd5: checkPackageMd5Stub }); @@ -172,7 +172,7 @@ describe("checkUploaded", () => { return checkUploadedMd5rewire(bsConfig, {}, instrumentBlocks) .then((data) => { chai.assert.deepEqual(data, { zip_md5sum: 'random_md5sum', zipUrlPresent: false, packageUrlPresent: false, }) - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(checkSpecsMd5Stub); }) .catch((_error) => { @@ -181,13 +181,13 @@ describe("checkUploaded", () => { }); it("resolves with zipUrlPresent and packageUrlPresent false if force-upload enabled and cache_dependencies disabled", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 404 }, '{"message":"zip_url for md5sum random_md5sum not found."}'); + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ statusCode: 404 , data: '{"message":"zip_url for md5sum random_md5sum not found."}'}); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, checkSpecsMd5: checkSpecsMd5Stub, checkPackageMd5: checkPackageMd5Stub }); @@ -196,7 +196,7 @@ describe("checkUploaded", () => { return checkUploadedMd5rewire(bsConfig, {"force-upload": true}, instrumentBlocks) .then((data) => { chai.assert.deepEqual(data, { zipUrlPresent: false, packageUrlPresent: false }) - sinon.assert.notCalled(requestStub); + sinon.assert.notCalled(axiosStub); sinon.assert.notCalled(checkSpecsMd5Stub); }) .catch((_error) => { @@ -205,13 +205,13 @@ describe("checkUploaded", () => { }); it("resolves with zipUrlPresent false and packageUrlPresent false if force-upload enabled and cache_dependencies enabled", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 200 }, '{"npmPackageUrl":"bs://random_hashid2"}'); + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ status: 200 , data: '{"npmPackageUrl":"bs://random_hashid2"}'}); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, checkSpecsMd5: checkSpecsMd5Stub, checkPackageMd5: checkPackageMd5Stub }); @@ -220,23 +220,22 @@ describe("checkUploaded", () => { return checkUploadedMd5rewire(bsConfig, {"force-upload": true}, instrumentBlocks) .then((data) => { chai.assert.deepEqual(data, { zipUrlPresent: false, packageUrlPresent: false }) - sinon.assert.notCalled(requestStub); + sinon.assert.notCalled(axiosStub); sinon.assert.notCalled(checkSpecsMd5Stub); }) .catch((_error) => { - console.log(_error) chai.assert.fail("Promise error"); }); }); it("resolves with zipUrlPresent false and packageUrlPresent false if diabled from rails", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 200 }, '{"disableNpmSuiteCache": true, "disableTestSuiteCache": true }'); + let axiosStub = sandbox + .stub(axios, "post") + .resolves( { statusCode: 200 , data: {"disableNpmSuiteCache": true, "disableTestSuiteCache": true }}); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, checkSpecsMd5: checkSpecsMd5Stub, checkPackageMd5: checkPackageMd5Stub }); @@ -245,7 +244,7 @@ describe("checkUploaded", () => { return checkUploadedMd5rewire(bsConfig, {}, instrumentBlocks) .then((data) => { chai.assert.deepEqual(data, { zipUrlPresent: false, packageUrlPresent: false }) - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(checkSpecsMd5Stub); }) .catch((_error) => { diff --git a/test/unit/bin/helpers/getInitialDetails.js b/test/unit/bin/helpers/getInitialDetails.js index b506e150..a0d28466 100644 --- a/test/unit/bin/helpers/getInitialDetails.js +++ b/test/unit/bin/helpers/getInitialDetails.js @@ -1,8 +1,8 @@ +const { default: axios } = require("axios"); const { expect } = require("chai"); const chai = require("chai"), chaiAsPromised = require("chai-as-promised"), - sinon = require('sinon'), - request = require('request'); + sinon = require('sinon'); const Constants = require("../../../../bin/helpers/constants"), logger = require("../../../../bin/helpers/logger").winstonLogger, @@ -17,13 +17,13 @@ describe('#getInitialDetails', () => { let args = testObjects.buildInfoSampleArgs; let rawArgs = testObjects.buildInfoSampleRawArgs; let bsConfig = testObjects.sampleBsConfig; - let sendUsageReportStub = null, requestStub = null, formatRequestStub = null; + let sendUsageReportStub = null, axiosStub = null, formatRequestStub = null; let messageType = Constants.messageTypes.ERROR; let errorCode = 'get_initial_details_failed' beforeEach(() => { sendUsageReportStub = sinon.stub(utils, 'sendUsageReport'); - requestStub = sinon.stub(request, "get"); + axiosStub = sinon.stub(axios, "get"); formatRequestStub = sinon.stub(utils, "formatRequest"); }); @@ -33,7 +33,7 @@ describe('#getInitialDetails', () => { it('sends usage report if error occurred in getInitialDetails call', () => { let error_message = "error occurred"; - requestStub.yields(error_message, null, null); + axiosStub.resolves(error_message); formatRequestStub.returns({err: error_message, statusCode: null, body: null}) sendUsageReportStub.calledOnceWithExactly(bsConfig, args, error_message, messageType, errorCode, null, rawArgs); getInitialDetails(bsConfig, args, rawArgs).then((result) => { @@ -43,7 +43,7 @@ describe('#getInitialDetails', () => { it('resolves with data if getInitialDetails call is successful', () => { let body = {"user_id": 1234}; - requestStub.yields(null, { statusCode: 200 }, body); + axiosStub.resolves({ status: 200 , data: body}); formatRequestStub.notCalled; sendUsageReportStub.notCalled; getInitialDetails(bsConfig, args, rawArgs).then((result) => { @@ -53,7 +53,7 @@ describe('#getInitialDetails', () => { it('send usage report if error response from getInitialDetails call', () => { let body = {"error": 'user not found'}; - requestStub.yields(null, { statusCode: 422 }, body); + axiosStub.resolves({ status: 422 , data: body}); formatRequestStub.notCalled; sendUsageReportStub.calledOnceWithExactly(bsConfig, args, body["error"], messageType, errorCode, null, rawArgs); getInitialDetails(bsConfig, args, rawArgs).then((result) => { diff --git a/test/unit/bin/helpers/reporterHTML.js b/test/unit/bin/helpers/reporterHTML.js index 4bb6e451..64d824a6 100644 --- a/test/unit/bin/helpers/reporterHTML.js +++ b/test/unit/bin/helpers/reporterHTML.js @@ -1,267 +1,247 @@ -const { expect } = require("chai"); -const chai = require("chai"), - chaiAsPromised = require("chai-as-promised"), +const { default: axios } = require('axios'); +const chai = require('chai'), + chaiAsPromised = require('chai-as-promised'), sinon = require('sinon'), rewire = require('rewire'); const fs = require('fs'), - path = require('path'), - request = require('request'), - unzipper = require('unzipper'); - Constants = require("../../../../bin/helpers/constants"), - logger = require("../../../../bin/helpers/logger").winstonLogger, - testObjects = require("../../support/fixtures/testObjects"), - formatRequest = require("../../../../bin/helpers/utils").formatRequest; - -const proxyquire = require("proxyquire").noCallThru(); - + path = require('path'), + unzipper = require('unzipper'); +(Constants = require('../../../../bin/helpers/constants')), + (logger = require('../../../../bin/helpers/logger').winstonLogger), + (testObjects = require('../../support/fixtures/testObjects')), + (formatRequest = require('../../../../bin/helpers/utils').formatRequest); + +const utils = require('../../../../bin/helpers/utils'); +const reporterHTML = require('../../../../bin/helpers/reporterHTML'); chai.use(chaiAsPromised); -logger.transports["console.info"].silent = true; - -describe("getReportResponse", () => { - var sandbox; - beforeEach(() => { - sandbox = sinon.createSandbox(); - }); - - afterEach(() => { - sandbox.restore(); - sinon.restore(); - }); +logger.transports['console.info'].silent = true; - it("retrieve response from report url", () => { - let requestStub = sandbox.stub(request, "get").yields(null, { statusCode: 200 }, "abc"); - let reporterHTML = proxyquire('../../../../bin/helpers/reporterHTML', { - request: {get: requestStub} - }); - let rewireReporterHTML = rewire('../../../../bin/helpers/reporterHTML'); - let getReportResponse = rewireReporterHTML.__get__("getReportResponse"); - let unzipFileStub = sinon.stub(); - let writerStub = sinon.stub(fs, "createWriteStream"); - let unlinkSyncStub = sinon.stub(fs, "unlinkSync"); - let pathStub = sinon.stub(path, 'join'); - unzipFileStub.returns(true); - rewireReporterHTML.__set__('unzipFile', unzipFileStub); - pathStub.returns("abc/efg"); - writerStub.returns(true); - unlinkSyncStub.returns(true); - getReportResponse("abc", "efg", "url"); - sinon.assert.calledOnce(requestStub); - }) -}); +describe('reporterHTML', () => { + let sendUsageReportStub = null, + axiosStub = null, + formatRequestStub = null, + getUserAgentStub = null; -describe("calls API to generate report", () => { - var sandbox,sendUsageReportStub,sendUsageReportStub; - let args = testObjects.generateReportInputArgs, - rawArgs = testObjects.generateReportInputRawArgs - buildId = 'buildId', - bsConfig = testObjects.sampleBsConfig; - beforeEach(() => { - sandbox = sinon.createSandbox(); - sendUsageReportStub = sandbox.stub().callsFake(function () { - return "end"; - }); - getUserAgentStub = sandbox.stub().returns("random user-agent"); + getUserAgentStub = sinon.stub(utils, 'getUserAgent'); + sendUsageReportStub = sinon.stub(utils, 'sendUsageReport'); + axiosStub = sinon.stub(axios, 'get'); + formatRequestStub = sinon.stub(utils, 'formatRequest'); }); afterEach(() => { - sandbox.restore(); sinon.restore(); }); - it("is deprecated, i.e. 299, does not have build message", () => { - let requestStub = sandbox.stub(request, "get").yields(null, { statusCode: 299 }, null); - let message = Constants.userMessages.API_DEPRECATED; - let messageType = Constants.messageTypes.INFO; - let errorCode = "api_deprecated"; - - const reporterHTML = proxyquire('../../../../bin/helpers/reporterHTML', { - './utils': { - sendUsageReport: sendUsageReportStub, - getUserAgent: getUserAgentStub - }, - request: {get: requestStub} + describe('getReportResponse', () => { + it('retrieve response from report url', () => { + axiosStub.resolves({ status: 200, data: 'abc' }); + let rewireReporterHTML = rewire('../../../../bin/helpers/reporterHTML'); + let getReportResponse = rewireReporterHTML.__get__('getReportResponse'); + let unzipFileStub = sinon.stub(); + let writerStub = sinon.stub(fs, 'createWriteStream'); + let unlinkSyncStub = sinon.stub(fs, 'unlinkSync'); + let pathStub = sinon.stub(path, 'join'); + unzipFileStub.returns(true); + rewireReporterHTML.__set__('unzipFile', unzipFileStub); + pathStub.returns('abc/efg'); + writerStub.returns(true); + unlinkSyncStub.returns(true); + getReportResponse('abc', 'efg', 'url'); + sinon.assert.calledOnce(axiosStub); + pathStub.restore(); }); - - reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}); - - sinon.assert.calledOnce(requestStub); - sinon.assert.calledOnce(getUserAgentStub); - sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, {}, rawArgs); }); - it("is deprecated, i.e. 299", () => { - let build = { buildId: buildId, message: 'API has been deprecated', rows: [] }; - let body = JSON.stringify(build); - let requestStub = sandbox.stub(request, "get").yields(null, { statusCode: 299 }, body); - let message = build.message; - let messageType = Constants.messageTypes.INFO; - let errorCode = "api_deprecated"; - - const reporterHTML = proxyquire('../../../../bin/helpers/reporterHTML', { - './utils': { - sendUsageReport: sendUsageReportStub, - getUserAgent: getUserAgentStub - }, - request: {get: requestStub} + describe('calls API to generate report', () => { + let args = testObjects.generateReportInputArgs, + rawArgs = testObjects.generateReportInputRawArgs; + (buildId = 'buildId'), (bsConfig = testObjects.sampleBsConfig); + + it('is deprecated, i.e. 299, does not have build message', () => { + axiosStub.resolves({ status: 299 }); + let message = Constants.userMessages.API_DEPRECATED; + let messageType = Constants.messageTypes.INFO; + let errorCode = 'api_deprecated'; + + reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}).then(() => { + sinon.assert.calledOnce(axiosStub); + sinon.assert.calledOnce(getUserAgentStub); + sinon.assert.calledOnceWithExactly( + sendUsageReportStub, + bsConfig, + args, + message, + messageType, + errorCode, + {}, + rawArgs + ); + }); }); - reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}); - - sinon.assert.calledOnce(requestStub); - sinon.assert.calledOnce(getUserAgentStub); - sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, {}, rawArgs); - }); - - context("non 200 response", () => { - it("422 status, build available but running, cannot generate report", () => { - let build = { message: 'The report cannot be generated as the build is running' }; - let body = JSON.stringify(build); - let requestStub = sandbox.stub(request, "get").yields(null, { statusCode: 422 }, body); + it('is deprecated, i.e. 299', () => { + let build = { + buildId: buildId, + message: 'API has been deprecated', + rows: [], + }; + axiosStub.resolves({ status: 299, data: build }); let message = build.message; - let messageType = Constants.messageTypes.ERROR; - let errorCode = 'api_failed_build_generate_report'; - - const reporterHTML = proxyquire('../../../../bin/helpers/reporterHTML', { - './utils': { - sendUsageReport: sendUsageReportStub, - getUserAgent: getUserAgentStub, - formatRequest - }, - request: {get: requestStub} + let messageType = Constants.messageTypes.INFO; + let errorCode = 'api_deprecated'; + + reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}).then(() => { + sinon.assert.calledOnce(axiosStub); + sinon.assert.calledOnce(getUserAgentStub); + sinon.assert.calledOnceWithExactly( + sendUsageReportStub, + bsConfig, + args, + message, + messageType, + errorCode, + {}, + rawArgs + ); }); - - reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}); - - sinon.assert.calledOnce(requestStub); - sinon.assert.calledOnce(getUserAgentStub); - sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, {}, rawArgs); }); - it("400 status, build available, cannot generate report", () => { - let build = { buildId: buildId, message: 'success', rows: [] }; - let body = JSON.stringify(build); - let requestStub = sandbox.stub(request, "get").yields(null, { statusCode: 400 }, body); - let message = `${ - Constants.userMessages.BUILD_GENERATE_REPORT_FAILED.replace('', buildId) - } with error: \n${JSON.stringify(build, null, 2)}`; - let messageType = Constants.messageTypes.ERROR; - let errorCode = 'api_failed_build_generate_report'; - - const reporterHTML = proxyquire('../../../../bin/helpers/reporterHTML', { - './utils': { - sendUsageReport: sendUsageReportStub, - getUserAgent: getUserAgentStub, - formatRequest - }, - request: {get: requestStub} + context('non 200 response', () => { + it('422 status, build available but running, cannot generate report', () => { + let build = { + message: 'The report cannot be generated as the build is running', + }; + axiosStub.resolves({ status: 422, data: build }); + let message = build.message; + let messageType = Constants.messageTypes.ERROR; + let errorCode = 'api_failed_build_generate_report'; + + reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}).then(() => { + sinon.assert.calledOnce(axiosStub); + sinon.assert.calledOnce(getUserAgentStub); + sinon.assert.calledOnceWithExactly( + sendUsageReportStub, + bsConfig, + args, + message, + messageType, + errorCode, + {}, + rawArgs + ); + }); }); - reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}); - - sinon.assert.calledOnce(requestStub); - sinon.assert.calledOnce(getUserAgentStub); - sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, {}, rawArgs); - }); - - it("user is unauthorized", () => { - let build = { buildId: buildId, message: 'Unauthorized', rows: [] }; - let body = JSON.stringify(build); - let requestStub = sandbox.stub(request, "get").yields(null, { statusCode: 401 }, body); - let message = `${ - Constants.userMessages.BUILD_GENERATE_REPORT_FAILED.replace('', buildId) - } with error: \n${JSON.stringify(build, null, 2)}`; - let messageType = Constants.messageTypes.ERROR; - let errorCode = 'api_auth_failed'; - - const reporterHTML = proxyquire('../../../../bin/helpers/reporterHTML', { - './utils': { - sendUsageReport: sendUsageReportStub, - getUserAgent: getUserAgentStub - }, - request: {get: requestStub} + it('400 status, build available, cannot generate report', () => { + let build = { buildId: buildId, message: 'success', rows: [] }; + axiosStub.resolves({ status: 400, data: build }); + let message = `${Constants.userMessages.BUILD_GENERATE_REPORT_FAILED.replace( + '', + buildId + )} with error: \n${JSON.stringify(build, null, 2)}`; + let messageType = Constants.messageTypes.ERROR; + let errorCode = 'api_failed_build_generate_report'; + + reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}).then(() => { + sinon.assert.calledOnce(axiosStub); + sinon.assert.calledOnce(getUserAgentStub); + sinon.assert.calledOnceWithExactly( + sendUsageReportStub, + bsConfig, + args, + message, + messageType, + errorCode, + {}, + rawArgs + ); + }); }); - reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}); + it('user is unauthorized', () => { + let build = { buildId: buildId, message: 'Unauthorized', rows: [] }; + let body = build; + axiosStub.resolves({ status: 401, data: body }); + let message = `${Constants.userMessages.BUILD_GENERATE_REPORT_FAILED.replace( + '', + buildId + )} with error: \n${JSON.stringify(build, null, 2)}`; + let messageType = Constants.messageTypes.ERROR; + let errorCode = 'api_auth_failed'; + + reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}).then(() => { + sinon.assert.calledOnce(axiosStub); + sinon.assert.calledOnce(getUserAgentStub); + sinon.assert.calledOnceWithExactly( + sendUsageReportStub, + bsConfig, + args, + message, + messageType, + errorCode, + {}, + rawArgs + ); + }); + }); - sinon.assert.calledOnce(requestStub); - sinon.assert.calledOnce(getUserAgentStub); - sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, {}, rawArgs); + it('400 status, build not available, cannot generate report', () => { + axiosStub.resolves({ status: 400 }); + let message = Constants.userMessages.BUILD_GENERATE_REPORT_FAILED.replace('', buildId); + let messageType = Constants.messageTypes.ERROR; + let errorCode = 'api_failed_build_generate_report'; + + reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}).then(() => { + sinon.assert.calledOnce(axiosStub); + sinon.assert.calledOnce(getUserAgentStub); + sinon.assert.calledOnceWithExactly( + sendUsageReportStub, + bsConfig, + args, + message, + messageType, + errorCode, + {}, + rawArgs + ); + }); + }); }); - it("400 status, build not available, cannot generate report", () => { - let requestStub = sandbox.stub(request, "get").yields(null, { statusCode: 400 }, null); - let message = Constants.userMessages.BUILD_GENERATE_REPORT_FAILED.replace('', buildId); - let messageType = Constants.messageTypes.ERROR; - let errorCode = 'api_failed_build_generate_report'; - - const reporterHTML = proxyquire('../../../../bin/helpers/reporterHTML', { - './utils': { - sendUsageReport: sendUsageReportStub, - getUserAgent: getUserAgentStub, - formatRequest - }, - request: {get: requestStub} - }); + it('200 response code', () => { + let build = { buildId: buildId, message: 'success', rows: [] }; + axiosStub.resolves({ status: 200, data: 'abc' }); + let message = `Report for build: ${buildId} was successfully created.`; + let messageType = Constants.messageTypes.SUCCESS; + let errorCode = null; + let rewireReporterHTML = rewire('../../../../bin/helpers/reporterHTML'); + let generateCypressBuildReportStub = sinon.stub(); + generateCypressBuildReportStub.returns(true); + rewireReporterHTML.__set__('generateCypressBuildReport', generateCypressBuildReportStub); reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}); - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); - sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, {}, rawArgs); + sendUsageReportStub.calledOnceWithExactly(bsConfig, args, message, messageType, errorCode, {}, rawArgs); }); }); - it("200 response code", () => { - let build = { buildId: buildId, message: 'success', rows: [] }; - let body = JSON.stringify(build); - let requestStub = sandbox.stub(request, "get").yields(null, { statusCode: 200 }, "abc"); - let message = `Report for build: ${buildId} was successfully created.`; - let messageType = Constants.messageTypes.SUCCESS; - let errorCode = null; - let rewireReporterHTML = rewire('../../../../bin/helpers/reporterHTML'); - let generateCypressBuildReportStub = sinon.stub(); - generateCypressBuildReportStub.returns(true); - rewireReporterHTML.__set__('generateCypressBuildReport', generateCypressBuildReportStub); - - const reporterHTML = proxyquire('../../../../bin/helpers/reporterHTML', { - './utils': { - sendUsageReport: sendUsageReportStub, - getUserAgent: getUserAgentStub - }, - request: {get: requestStub} + describe('generateCypressBuildReport', () => { + it('calls cypress build report with report download url', () => { + let pathStub = sinon.stub(path, 'join'); + let fileExistStub = sinon.stub(fs, 'existsSync'); + let rewireReporterHTML = rewire('../../../../bin/helpers/reporterHTML'); + let generateCypressBuildReport = rewireReporterHTML.__get__('generateCypressBuildReport'); + let getReportResponseStub = sinon.stub(); + getReportResponseStub.calledOnceWith('abc/efg', 'report.zip', 'url'); + rewireReporterHTML.__set__('getReportResponse', getReportResponseStub); + pathStub.returns('abc/efg'); + fileExistStub.returns(true); + generateCypressBuildReport({ report_data: 'url' }); + pathStub.restore(); }); - - reporterHTML.reportGenerator(bsConfig, buildId, args, rawArgs, {}); - - sinon.assert.calledOnce(requestStub); - sinon.assert.calledOnce(getUserAgentStub); - sendUsageReportStub.calledOnceWithExactly(bsConfig, args, message, messageType, errorCode, {}, rawArgs); - }); -}); - -describe("generateCypressBuildReport", () => { - var sandbox; - beforeEach(() => { - sandbox = sinon.createSandbox(); - }); - - afterEach(() => { - sandbox.restore(); - sinon.restore(); - }); - - it("calls cypress build report with report download url", () => { - let pathStub = sinon.stub(path, 'join'); - let fileExistStub = sinon.stub(fs, 'existsSync'); - let rewireReporterHTML = rewire('../../../../bin/helpers/reporterHTML'); - let generateCypressBuildReport = rewireReporterHTML.__get__('generateCypressBuildReport') - let getReportResponseStub = sinon.stub(); - getReportResponseStub.calledOnceWith('abc/efg', 'report.zip', 'url'); - rewireReporterHTML.__set__('getReportResponse', getReportResponseStub); - pathStub.returns("abc/efg"); - fileExistStub.returns(true); - generateCypressBuildReport({report_data: 'url'}) }); }); diff --git a/test/unit/bin/helpers/sync/syncSpecsLogs.js b/test/unit/bin/helpers/sync/syncSpecsLogs.js index e19a10c2..5f5ac969 100644 --- a/test/unit/bin/helpers/sync/syncSpecsLogs.js +++ b/test/unit/bin/helpers/sync/syncSpecsLogs.js @@ -1,22 +1,22 @@ -"use strict"; -const chai = require("chai"), +'use strict'; +const chai = require('chai'), expect = chai.expect, - rewire = require("rewire"), - chaiAsPromised = require("chai-as-promised"), - chalk = require('chalk'), - request = require("request"); + rewire = require('rewire'), + chaiAsPromised = require('chai-as-promised'), + chalk = require('chalk'); -const sinon = require("sinon"); +const { default: axios } = require('axios'); +const sinon = require('sinon'); chai.use(chaiAsPromised); -var syncSpecsLogs = rewire("../../../../../bin/helpers/sync/syncSpecsLogs.js"); -var logger = require("../../../../../bin/helpers/logger").syncCliLogger; -var Constants = require("../../../../../bin/helpers/constants.js"); -var config = require("../../../../../bin/helpers/config.js"); -var utils = require("../../../../../bin/helpers/utils"); +var syncSpecsLogs = rewire('../../../../../bin/helpers/sync/syncSpecsLogs.js'); +var logger = require('../../../../../bin/helpers/logger').syncCliLogger; +var Constants = require('../../../../../bin/helpers/constants.js'); +var config = require('../../../../../bin/helpers/config.js'); +var utils = require('../../../../../bin/helpers/utils'); -describe("syncSpecsLogs", () => { +describe('syncSpecsLogs', () => { var sandbox; beforeEach(() => { @@ -29,115 +29,131 @@ describe("syncSpecsLogs", () => { utils.sendUsageReport.restore(); }); - context("getCombinationName", () => { - const get_path = syncSpecsLogs.__get__("getCombinationName");; + context('getCombinationName', () => { + const get_path = syncSpecsLogs.__get__('getCombinationName'); let spec = { - "os": "Windows", - "osVersion": "10", - "browser": "chrome", - "browserVersion": "86" - } - it("returns combination name", () => { + os: 'Windows', + osVersion: '10', + browser: 'chrome', + browserVersion: '86', + }; + it('returns combination name', () => { let expectedCombination = `Chrome 86 (Windows 10)`; expect(get_path(spec)).to.equal(expectedCombination); }); }); - context("getStatus", () => { - const getStatus = syncSpecsLogs.__get__("getStatus");; + context('getStatus', () => { + const getStatus = syncSpecsLogs.__get__('getStatus'); - it("returns return ✔ in green when status is passes", () => { - expect(getStatus("passed")).to.equal(chalk.green("✔")); + it('returns return ✔ in green when status is passes', () => { + expect(getStatus('passed')).to.equal(chalk.green('✔')); }); - it("returns return ✘ in red when status is failed", () => { - expect(getStatus("failed")).to.equal(chalk.red("✘")); + it('returns return ✘ in red when status is failed', () => { + expect(getStatus('failed')).to.equal(chalk.red('✘')); }); - it("returns return [status] in yellow when status is skipped or ignored (anything else from pass/fail)", () => { - expect(getStatus("skipped")).to.equal(chalk.blue("[skipped]")); - expect(getStatus("ignored")).to.equal(chalk.blue("[ignored]")); + it('returns return [status] in yellow when status is skipped or ignored (anything else from pass/fail)', () => { + expect(getStatus('skipped')).to.equal(chalk.blue('[skipped]')); + expect(getStatus('ignored')).to.equal(chalk.blue('[ignored]')); }); }); - context("printInitialLog", () => { - const printInitialLog = syncSpecsLogs.__get__("printInitialLog"); + context('printInitialLog', () => { + const printInitialLog = syncSpecsLogs.__get__('printInitialLog'); - it("should print inital logs for specs in sync", () => { - - printInitialLog() - - expect(syncSpecsLogs.__get__("n")).to.equal(Constants.syncCLI.INITIAL_DELAY_MULTIPLIER); - expect(syncSpecsLogs.__get__("startTime")).to.not.be.null; + it('should print inital logs for specs in sync', () => { + printInitialLog(); + expect(syncSpecsLogs.__get__('n')).to.equal(Constants.syncCLI.INITIAL_DELAY_MULTIPLIER); + expect(syncSpecsLogs.__get__('startTime')).to.not.be.null; }); }); - context("getOptions", () => { - const getOptions = syncSpecsLogs.__get__("getOptions"); - let auth = {username: "cypress", access_key: "abcd"} - let build_id = "build1" + context('getOptions', () => { + const getOptions = syncSpecsLogs.__get__('getOptions'); + let auth = { username: 'cypress', access_key: 'abcd' }; + let build_id = 'build1'; - it('should return proper request option for polling', () => { + it('should return proper axios option for polling', () => { let options = getOptions(auth, build_id); expect(options.url).to.equal(`${config.buildUrlV2}${build_id}`); expect(options.auth.user).to.equal(auth.username); expect(options.auth.password).to.equal(auth.access_key); - expect(options.headers["Content-Type"]).to.equal("application/json"); + expect(options.headers['Content-Type']).to.equal('application/json'); }); }); - context("addCustomErrorToPrint", () => { - const addCustomErrorToPrint = syncSpecsLogs.__get__("addCustomErrorToPrint"); + context('addCustomErrorToPrint', () => { + const addCustomErrorToPrint = syncSpecsLogs.__get__('addCustomErrorToPrint'); let specSummary = { - "buildError": null, - "specs": [], - "duration": null, - "parallels": null, - "cliDuration": null, - "customErrorsToPrint": [ - { id: "custom_error_1", type: "custom_errors_to_print", level: "warn", should_be_unique: true, message: "custom error message" } - ] - } - const uniqueError = { id: "custom_error_1", type: "custom_errors_to_print", level: "warn", should_be_unique: true, message: "custom error message" }; - const notUniqueError = { id: "custom_error_2", type: "custom_errors_to_print", level: "warn", should_be_unique: false, message: "custom error message" }; + buildError: null, + specs: [], + duration: null, + parallels: null, + cliDuration: null, + customErrorsToPrint: [ + { + id: 'custom_error_1', + type: 'custom_errors_to_print', + level: 'warn', + should_be_unique: true, + message: 'custom error message', + }, + ], + }; + const uniqueError = { + id: 'custom_error_1', + type: 'custom_errors_to_print', + level: 'warn', + should_be_unique: true, + message: 'custom error message', + }; + const notUniqueError = { + id: 'custom_error_2', + type: 'custom_errors_to_print', + level: 'warn', + should_be_unique: false, + message: 'custom error message', + }; it('should add a new Error if its meant to be unique and not added to the error list', () => { addCustomErrorToPrint(uniqueError); - expect(JSON.stringify(syncSpecsLogs.__get__("specSummary"))).to.equal(JSON.stringify(specSummary)); + expect(JSON.stringify(syncSpecsLogs.__get__('specSummary'))).to.equal(JSON.stringify(specSummary)); }); it('should not add a new Error if its meant to be unique and already added to the error list', () => { addCustomErrorToPrint(uniqueError); - expect(JSON.stringify(syncSpecsLogs.__get__("specSummary"))).to.equal(JSON.stringify(specSummary)); + expect(JSON.stringify(syncSpecsLogs.__get__('specSummary'))).to.equal(JSON.stringify(specSummary)); }); it('should add a new Error if its not meant to be unique and not added to the error list', () => { addCustomErrorToPrint(notUniqueError); specSummary.customErrorsToPrint.push(notUniqueError); - expect(JSON.stringify(syncSpecsLogs.__get__("specSummary"))).to.equal(JSON.stringify(specSummary)); + expect(JSON.stringify(syncSpecsLogs.__get__('specSummary'))).to.equal(JSON.stringify(specSummary)); }); it('should not add a new Error if its not meant to not be unique and already added to the error list', () => { addCustomErrorToPrint(notUniqueError); specSummary.customErrorsToPrint.push(notUniqueError); - expect(JSON.stringify(syncSpecsLogs.__get__("specSummary"))).to.equal(JSON.stringify(specSummary)); + expect(JSON.stringify(syncSpecsLogs.__get__('specSummary'))).to.equal(JSON.stringify(specSummary)); }); }); - context("getTableConfig", () => { - const getTableConfig = syncSpecsLogs.__get__("getTableConfig"); + context('getTableConfig', () => { + const getTableConfig = syncSpecsLogs.__get__('getTableConfig'); it('should return proper table config option for spec table', () => { var getBorderConfigStub = sandbox.stub(); syncSpecsLogs.__set__('getBorderConfig', getBorderConfigStub); - let options = getTableConfig((process.stdout.columns) * 0.9); - expect(options.columnDefault.width).to.equal(Math.floor(((process.stdout.columns) * 0.9) * 0.2)); + let options = getTableConfig(process.stdout.columns * 0.9); + expect(options.columnDefault.width).to.equal(Math.floor(process.stdout.columns * 0.9 * 0.2)); expect(options.columns[1].alignment).to.equal('center'); expect(options.columns[2].alignment).to.equal('left'); - expect(options.columns[1].width).to.equal(Math.ceil(((process.stdout.columns) * 0.9) * 0.01)); - expect(options.columns[2].width).to.equal(Math.floor(((process.stdout.columns) * 0.9) * 0.75)); + expect(options.columns[1].width).to.equal(Math.ceil(process.stdout.columns * 0.9 * 0.01)); + expect(options.columns[2].width).to.equal(Math.floor(process.stdout.columns * 0.9 * 0.75)); expect(options.columnCount).to.equal(3); expect(getBorderConfigStub.calledOnce).to.be.true; }); @@ -157,46 +173,54 @@ describe("syncSpecsLogs", () => { }); }); - context("getBorderConfig", () => { - const getBorderConfig = syncSpecsLogs.__get__("getBorderConfig"); + context('getBorderConfig', () => { + const getBorderConfig = syncSpecsLogs.__get__('getBorderConfig'); it('should return proper border option for spec table', () => { let options = getBorderConfig(); - expect(options.topBody).to.equal(""); - expect(options.bottomBody).to.equal(""); + expect(options.topBody).to.equal(''); + expect(options.bottomBody).to.equal(''); }); }); - context("writeToTable", () => { - const writeToTable = syncSpecsLogs.__get__("writeToTable"); + context('writeToTable', () => { + const writeToTable = syncSpecsLogs.__get__('writeToTable'); it('should print spec details to the table', () => { const stream = sandbox.stub(); stream.write = sandbox.stub(); syncSpecsLogs.__set__('stream', stream); - let combination = "Windows 10", path = "path", status = "passed", statusMark = "passed"; + let combination = 'Windows 10', + path = 'path', + status = 'passed', + statusMark = 'passed'; writeToTable(combination, path, status, statusMark); - sinon.assert.calledOnceWithExactly(stream.write, [combination , ":", `${path} ${statusMark} [${status}]`]); + sinon.assert.calledOnceWithExactly(stream.write, [combination, ':', `${path} ${statusMark} [${status}]`]); }); }); - context("addSpecToSummary", () => { - const addSpecToSummary = syncSpecsLogs.__get__("addSpecToSummary"); + context('addSpecToSummary', () => { + const addSpecToSummary = syncSpecsLogs.__get__('addSpecToSummary'); it('should add spec details to specSummary', () => { - let specSummary = { specs: [] } + let specSummary = { specs: [] }; syncSpecsLogs.__set__('specSummary', specSummary); - let specName = "spec", status = "status", combination = "combo", session_id = "id"; + let specName = 'spec', + status = 'status', + combination = 'combo', + session_id = 'id'; addSpecToSummary(specName, status, combination, session_id); - expect(specSummary.specs).deep.to.equal([{"specName": specName, "status": status, "combination": combination, "sessionId": session_id}]) + expect(specSummary.specs).deep.to.equal([ + { specName: specName, status: status, combination: combination, sessionId: session_id }, + ]); }); }); - context("printSpecData", () => { - const printSpecData = syncSpecsLogs.__get__("printSpecData"); + context('printSpecData', () => { + const printSpecData = syncSpecsLogs.__get__('printSpecData'); it('Should print combination and status to the spec table and add spec details to spec array', () => { - let data = { spec: { status: "passed" }, path: "path", session_id: "id" } + let data = { spec: { status: 'passed' }, path: 'path', session_id: 'id' }; var getCombinationName = sandbox.stub(); syncSpecsLogs.__set__('getCombinationName', getCombinationName); var getStatus = sandbox.stub(); @@ -206,76 +230,89 @@ describe("syncSpecsLogs", () => { var addSpecToSummary = sandbox.stub(); syncSpecsLogs.__set__('addSpecToSummary', addSpecToSummary); - printSpecData(data); - sinon.assert.calledOnceWithExactly(getCombinationName, data["spec"]); - sinon.assert.calledOnceWithExactly(getStatus, data["spec"]["status"]); + sinon.assert.calledOnceWithExactly(getCombinationName, data['spec']); + sinon.assert.calledOnceWithExactly(getStatus, data['spec']['status']); sinon.assert.calledOnce(writeToTable); sinon.assert.calledOnce(addSpecToSummary); }); }); - - context("showSpecsStatus", () => { - const showSpecsStatus = syncSpecsLogs.__get__("showSpecsStatus"); - const buildCreatedStatusCode = 202 - const buildRunningStatusCode = 204 - const buildCompletedStatusCode = 200 + context('showSpecsStatus', () => { + const showSpecsStatus = syncSpecsLogs.__get__('showSpecsStatus'); + const buildCreatedstatus = 202; + const buildRunningstatus = 204; + const buildCompletedstatus = 200; it('should not print initial log for running specs when it is the 1st polling response', () => { - let data = JSON.stringify({ "specData": ["created"], "buildData": {"duration": "NA", "parallels": "NA"}}) + let data = { specData: ['created'], buildData: { duration: 'NA', parallels: 'NA' } }; var printInitialLog = sandbox.stub(); syncSpecsLogs.__set__('printInitialLog', printInitialLog); - showSpecsStatus(data, buildCreatedStatusCode); + showSpecsStatus(data, buildCreatedstatus); expect(printInitialLog.calledOnce).to.be.false; }); it('should print spec details when spec related data is sent in polling response', () => { - let specResult = JSON.stringify({"path": "path"}) - let data = JSON.stringify({ "specData": [specResult], "buildData": {"duration": "NA", "parallels": "NA"}}) + let specResult = JSON.stringify({ path: 'path' }); + let data = { specData: [specResult], buildData: { duration: 'NA', parallels: 'NA' } }; var printSpecData = sandbox.stub(); syncSpecsLogs.__set__('printSpecData', printSpecData); - showSpecsStatus(data, buildRunningStatusCode); + showSpecsStatus(data, buildRunningstatus); expect(printSpecData.calledOnce).to.be.true; }); it('should print initial and spec details when spec related data is sent in polling response', () => { - let specResult = JSON.stringify({"path": "path"}) - syncSpecsLogs.__set__('buildStarted', false) - let data = JSON.stringify({ "specData": [specResult], "buildData": {"duration": "NA", "parallels": "NA"}}) + let specResult = JSON.stringify({ path: 'path' }); + syncSpecsLogs.__set__('buildStarted', false); + let data = { specData: [specResult], buildData: { duration: 'NA', parallels: 'NA' } }; var printSpecData = sandbox.stub(); syncSpecsLogs.__set__('printSpecData', printSpecData); var printInitialLog = sandbox.stub(); syncSpecsLogs.__set__('printInitialLog', printInitialLog); - showSpecsStatus(data, buildCreatedStatusCode); + showSpecsStatus(data, buildCreatedstatus); expect(printSpecData.calledOnce).to.be.true; expect(printInitialLog.calledOnce).to.be.true; }); it('should add custom error, print initial and spec details when spec related data is sent in polling response', () => { - let specResult = JSON.stringify({"path": "path"}) - let customError = { id: "custom_error_1", type: "custom_errors_to_print", level: "warn", should_be_unique: true, message: "custom error message" } - syncSpecsLogs.__set__('buildStarted', false) - let data = JSON.stringify({ "specData": ["created", specResult, customError], "buildData": {"duration": "NA", "parallels": "NA"}}) + let specResult = JSON.stringify({ path: 'path' }); + let customError = { + id: 'custom_error_1', + type: 'custom_errors_to_print', + level: 'warn', + should_be_unique: true, + message: 'custom error message', + }; + syncSpecsLogs.__set__('buildStarted', false); + let data = { + specData: ['created', specResult, customError], + buildData: { duration: 'NA', parallels: 'NA' }, + }; var printSpecData = sandbox.stub(); syncSpecsLogs.__set__('printSpecData', printSpecData); var printInitialLog = sandbox.stub(); syncSpecsLogs.__set__('printInitialLog', printInitialLog); var addCustomErrorToPrint = sandbox.stub(); syncSpecsLogs.__set__('addCustomErrorToPrint', addCustomErrorToPrint); - showSpecsStatus(data, buildRunningStatusCode); + showSpecsStatus(data, buildRunningstatus); expect(printSpecData.calledOnce).to.be.true; expect(printInitialLog.calledOnce).to.be.true; expect(addCustomErrorToPrint.calledOnce).to.be.true; }); }); - context("printSpecsStatus", () => { - const printSpecsStatus = syncSpecsLogs.__get__("printSpecsStatus"); - let startTime = Date.now(), endTime = Date.now() + 10, counter = 0; - let specSummary = { specs: [] }, getOptions, getTableConfig, tableStream, whileProcess; + context('printSpecsStatus', () => { + const printSpecsStatus = syncSpecsLogs.__get__('printSpecsStatus'); + let startTime = Date.now(), + endTime = Date.now() + 10, + counter = 0; + let specSummary = { specs: [] }, + getOptions, + getTableConfig, + tableStream, + whileProcess; beforeEach(() => { counter = 0; @@ -290,11 +327,13 @@ describe("syncSpecsLogs", () => { syncSpecsLogs.__set__('tableStream', tableStream); whileProcess = sandbox.stub().callsFake(function (whilstCallback) { - counter++ - if(counter >= 3) { + counter++; + if (counter >= 3) { syncSpecsLogs.__set__('whileLoop', false); - whilstCallback(new Error("ggg"), {}); - } else {whileProcess(whilstCallback, 10, null)} + whilstCallback(new Error('ggg'), {}); + } else { + whileProcess(whilstCallback, 10, null); + } }); syncSpecsLogs.__set__('whileProcess', whileProcess); @@ -311,7 +350,7 @@ describe("syncSpecsLogs", () => { expect(getTableConfig.calledOnce).to.be.true; expect(tableStream.calledOnce).to.be.true; expect(whileProcess.calledOnce).to.be.false; - expect(specSummary.specs).deep.to.equal([]) + expect(specSummary.specs).deep.to.equal([]); expect(specSummary.cliDuration).to.eql(endTime - startTime); }); }); @@ -332,45 +371,44 @@ describe("syncSpecsLogs", () => { }); }); - context("whileProcess", () => { - const whileProcess = syncSpecsLogs.__get__("whileProcess"); + context('whileProcess', () => { + const whileProcess = syncSpecsLogs.__get__('whileProcess'); - it('Should retry when request fails with error', () => { - let delayed_n = 2, timeout = 3000, n = 1; - let error = new Error("error"); + it('Should retry when axios fails with error', () => { + let delayed_n = 2, + timeout = 3000, + n = 1; + let error = new Error('error'); - let requestStub = sandbox.stub(); + let axiosStub = sandbox.stub(); - let postStub = sandbox - .stub(request, "post") - .yields(error, { statusCode: 502 }, JSON.stringify({})); + let postStub = sandbox.stub(axios, 'post').resolves({ status: 502, error: error, data: {} }); - requestStub.post = postStub; + axiosStub.post = postStub; let setTimeout = sandbox.stub(); syncSpecsLogs.__set__('setTimeout', setTimeout); syncSpecsLogs.__set__('n', n); syncSpecsLogs.__set__('timeout', timeout); - syncSpecsLogs.__set__('request', requestStub); + syncSpecsLogs.__set__('axios', axiosStub); syncSpecsLogs.__set__('whileTries', 5); let whilstCallback = sandbox.stub(); whileProcess(whilstCallback); sinon.assert.calledWith(setTimeout, whilstCallback, timeout * delayed_n, null); - expect(syncSpecsLogs.__get__("whileTries")).to.equal(4); + expect(syncSpecsLogs.__get__('whileTries')).to.equal(4); }); it('Should exit after defined number of retries in case of error', () => { - let error = new Error("error"), requestStub = sandbox.stub(); + let error = new Error('error'), + axiosStub = sandbox.stub(); - let postStub = sandbox - .stub(request, "post") - .yields(error, { statusCode: 502 }, JSON.stringify({})); + let postStub = sandbox.stub(axios, 'post').resolves({ status: 502, error, data: {} }); - requestStub.post = postStub; + axiosStub.post = postStub; - syncSpecsLogs.__set__('request', requestStub); + syncSpecsLogs.__set__('axios', axiosStub); syncSpecsLogs.__set__('whileTries', 1); syncSpecsLogs.__set__('specSummary', {}); syncSpecsLogs.__set__('whileLoop', true); @@ -378,20 +416,23 @@ describe("syncSpecsLogs", () => { let whilstCallback = sandbox.stub(); whileProcess(whilstCallback); - sinon.assert.calledWith(whilstCallback, { status: 504, message: "Tries limit reached" }); - expect(syncSpecsLogs.__get__("whileTries")).to.equal(0); - expect(syncSpecsLogs.__get__("whileLoop")).to.equal(false); - expect(syncSpecsLogs.__get__("specSummary.exitCode")).to.equal(2); + sinon.assert.calledWith(whilstCallback, { status: 504, message: 'Tries limit reached' }); + expect(syncSpecsLogs.__get__('whileTries')).to.equal(0); + expect(syncSpecsLogs.__get__('whileLoop')).to.equal(false); + expect(syncSpecsLogs.__get__('specSummary.exitCode')).to.equal(2); }); it('Should print spec details when data is returned from server', () => { - let error = null, body={}, status = 202, n = 1, delayed_n = 2, timeout = 3000; - let requestStub = sandbox.stub(); - let postStub = sandbox - .stub(request, "post") - .yields(error, { statusCode: status }, JSON.stringify(body)); - requestStub.post = postStub; - syncSpecsLogs.__set__('request', requestStub); + let error = null, + body = {}, + status = 202, + n = 1, + delayed_n = 2, + timeout = 3000; + let axiosStub = sandbox.stub(); + let postStub = sandbox.stub(axios, 'post').resolves({ status: status, data: body }); + axiosStub.post = postStub; + syncSpecsLogs.__set__('axios', axiosStub); let showSpecsStatus = sandbox.stub(); syncSpecsLogs.__set__('showSpecsStatus', showSpecsStatus); @@ -404,19 +445,21 @@ describe("syncSpecsLogs", () => { let whilstCallback = sandbox.stub(); whileProcess(whilstCallback); - expect(syncSpecsLogs.__get__("n")).to.equal(delayed_n); + expect(syncSpecsLogs.__get__('n')).to.equal(delayed_n); sinon.assert.calledWith(setTimeout, whilstCallback, timeout * delayed_n, null); - sinon.assert.calledWith(showSpecsStatus, JSON.stringify(body)); }); it('Should poll for data when server responds with no data available', () => { - let error = null, body={}, status = 204, n = 1, delayed_n = 1, timeout = 3000; - let requestStub = sandbox.stub(); - let postStub = sandbox - .stub(request, "post") - .yields(error, { statusCode: status }, JSON.stringify(body)); - requestStub.post = postStub; - syncSpecsLogs.__set__('request', requestStub); + let error = null, + body = {}, + status = 204, + n = 1, + delayed_n = 2, + timeout = 3000; + let axiosStub = sandbox.stub(); + let postStub = sandbox.stub(axios, 'post').resolves({ status, data: body }); + axiosStub.post = postStub; + syncSpecsLogs.__set__('axios', axiosStub); let showSpecsStatus = sandbox.stub(); syncSpecsLogs.__set__('showSpecsStatus', showSpecsStatus); @@ -429,51 +472,8 @@ describe("syncSpecsLogs", () => { let whilstCallback = sandbox.stub(); whileProcess(whilstCallback); - expect(syncSpecsLogs.__get__("n")).to.equal(delayed_n); + expect(syncSpecsLogs.__get__('n')).to.equal(delayed_n); sinon.assert.calledWith(setTimeout, whilstCallback, timeout * delayed_n, null); }); - - it('Should stop polling for data when server responds build is completed', () => { - let error = null, body={}, status = 200, n = 1, timeout = 3000; - let requestStub = sandbox.stub(); - let postStub = sandbox.stub(request, "post").yields(error, { statusCode: status }, JSON.stringify(body)); - requestStub.post = postStub; - syncSpecsLogs.__set__('request', requestStub); - - let showSpecsStatus = sandbox.stub(); - syncSpecsLogs.__set__('showSpecsStatus', showSpecsStatus); - - syncSpecsLogs.__set__('whileLoop', true); - syncSpecsLogs.__set__('n', n); - syncSpecsLogs.__set__('timeout', timeout); - - let whilstCallback = sandbox.stub(); - whileProcess(whilstCallback); - - expect(syncSpecsLogs.__get__("whileLoop")).to.be.false; - sinon.assert.calledWith(whilstCallback, null, JSON.stringify(body)); - sinon.assert.calledWith(showSpecsStatus, JSON.stringify(body)); - }); - - it('Should stop polling for data when server responds with error ', () => { - let error = null, body={}, status = 404, n = 1, timeout = 3000; - let requestStub = sandbox.stub(); - let postStub = sandbox.stub(request, "post").yields(error, { statusCode: status }, JSON.stringify(body)); - requestStub.post = postStub; - syncSpecsLogs.__set__('request', requestStub); - - let showSpecsStatus = sandbox.stub(); - syncSpecsLogs.__set__('showSpecsStatus', showSpecsStatus); - - syncSpecsLogs.__set__('whileLoop', true); - syncSpecsLogs.__set__('n', n); - syncSpecsLogs.__set__('timeout', timeout); - - let whilstCallback = sandbox.stub(); - whileProcess(whilstCallback); - - expect(syncSpecsLogs.__get__("whileLoop")).to.be.false; - sinon.assert.calledWith(whilstCallback, {message: JSON.stringify(body), status: status}); - }); }); }); diff --git a/test/unit/bin/helpers/utils.js b/test/unit/bin/helpers/utils.js index 04c74aa9..b1924912 100644 --- a/test/unit/bin/helpers/utils.js +++ b/test/unit/bin/helpers/utils.js @@ -2,7 +2,7 @@ const path = require('path'); var sandbox = require('sinon').createSandbox(); -const request = require('request'); +const axios = require('axios'); const chai = require('chai'), expect = chai.expect, sinon = require('sinon'), @@ -2880,22 +2880,25 @@ describe('utils', () => { }); describe('#checkLocalBinaryRunning', () => { + let axiosStub; afterEach(() => { sinon.restore(); + axiosStub.restore(); }); it('if the bsConfig localIdentifier is not present within the response body then function should resolve with false', () => { + const responseBody = { + "should_spawn_binary": true + }; const responseObject = { - statusCode: 200, + status: 200, headers: { 'content-type': 'application/json', }, + data: responseBody }; - const responseBody = { - "should_spawn_binary": true - }; - sinon - .stub(request, 'post') - .yields(undefined, responseObject, JSON.stringify(responseBody)); + axiosStub = sinon + .stub(axios, 'post') + .resolves(responseObject); let bsConfig = { auth: { @@ -2913,16 +2916,18 @@ describe('utils', () => { }); it('if the bsConfig localIdentifier is present within the response body', () => { + const responseBody = { "should_spawn_binary": false }; const responseObject = { - statusCode: 200, + status: 200, headers: { 'content-type': 'application/json', }, + data: responseBody }; - const responseBody = { "should_spawn_binary": false }; - sinon - .stub(request, 'post') - .yields(undefined, responseObject, JSON.stringify(responseBody)); + + axiosStub = sinon + .stub(axios, 'post') + .resolves(responseObject); let bsConfig = { auth: { @@ -2932,11 +2937,12 @@ describe('utils', () => { }; let localIdentifier = 'lmno'; - return utils + Promise.resolve(utils .checkLocalBinaryRunning(bsConfig, localIdentifier) .then((result) => { chai.assert.deepEqual(result, {"should_spawn_binary": false}) - }); + })) + return ; }); }); @@ -3257,47 +3263,48 @@ describe('utils', () => { it('message thrown if API deprecated', async () => { let api_deprecated_response = { - statusCode: 299 + status: 299 } message = constant.userMessages.API_DEPRECATED; messageType = constant.messageTypes.INFO; errorCode = 'api_deprecated'; - let requestStub = sinon.stub(request, 'post').yields(undefined, api_deprecated_response, null); + let axiosStub = sinon.stub(axios, 'post').resolves(api_deprecated_response); await utils.stopBrowserStackBuild(bsConfig, args, buildId, rawArgs); - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, null, rawArgs); - requestStub.restore(); + axiosStub.restore(); }); it('message thrown if build returned', async () => { let api_deprecated_response = { - statusCode: 299, + status: 299, + data: body } message = body.message; messageType = constant.messageTypes.INFO; errorCode = 'api_deprecated'; - let requestStub = sinon.stub(request, 'post').yields(undefined, api_deprecated_response, JSON.stringify(body)); + let axiosStub = sinon.stub(axios, 'post').resolves(api_deprecated_response); await utils.stopBrowserStackBuild(bsConfig, args, buildId, rawArgs); - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, null, rawArgs); - requestStub.restore(); + axiosStub.restore(); }); it('message thrown if statusCode != 200', async () => { let non_200_status_response = { - statusCode: 400 + status: 400 } message = constant.userMessages.BUILD_STOP_FAILED; messageType = constant.messageTypes.ERROR; errorCode = 'api_failed_build_stop'; - let requestStub = sinon.stub(request, 'post').yields(undefined, non_200_status_response, null); + let axiosStub = sinon.stub(axios, 'post').resolves(non_200_status_response); await utils.stopBrowserStackBuild(bsConfig, args, buildId, rawArgs); - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, null, rawArgs); - requestStub.restore(); + axiosStub.restore(); }); it('message thrown if statusCode != 200 and user unauthorized', async () => { @@ -3306,7 +3313,7 @@ describe('utils', () => { "message": "Unauthorized", }; let non_200_status_response = { - statusCode: 401, + status: 401, data: body_with_message } @@ -3315,17 +3322,18 @@ describe('utils', () => { } with error: \n${JSON.stringify(body_with_message, null, 2)}`; messageType = constant.messageTypes.ERROR; errorCode = 'api_auth_failed'; - let requestStub = sinon.stub(request, 'post').yields(undefined, non_200_status_response, JSON.stringify(body_with_message)); + let axiosStub = sinon.stub(axios, 'post').resolves(non_200_status_response); await utils.stopBrowserStackBuild(bsConfig, args, buildId, rawArgs); - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, null, rawArgs); - requestStub.restore(); + axiosStub.restore(); }); it('message thrown if statusCode != 200 and build is present', async () => { let non_200_status_response = { - statusCode: 402, + status: 402, + data: body } message = `${ @@ -3333,28 +3341,29 @@ describe('utils', () => { } with error: \n${JSON.stringify(body, null, 2)}`; messageType = constant.messageTypes.ERROR; errorCode = 'api_failed_build_stop'; - let requestStub = sinon.stub(request, 'post').yields(undefined, non_200_status_response, JSON.stringify(body)); + let axiosStub = sinon.stub(axios, 'post').resolves(non_200_status_response); await utils.stopBrowserStackBuild(bsConfig, args, buildId, rawArgs); - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, null, rawArgs); - requestStub.restore(); + axiosStub.restore(); }); it('message thrown if API success', async () => { let success_response = { - statusCode: 200, + status: 200, + data: body } message = `${JSON.stringify(body, null, 2)}`; messageType = constant.messageTypes.SUCCESS; errorCode = null; - let requestStub = sinon.stub(request, 'post').yields(undefined, success_response, JSON.stringify(body)); + let axiosStub = sinon.stub(axios, 'post').resolves(success_response); await utils.stopBrowserStackBuild(bsConfig, args, buildId, rawArgs); - sinon.assert.calledOnce(requestStub); + sinon.assert.calledOnce(axiosStub); sinon.assert.calledOnce(getUserAgentStub); sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, null, rawArgs); - requestStub.restore(); + axiosStub.restore(); }); }); @@ -3745,10 +3754,10 @@ describe('utils', () => { it('should return correct JSON', () => { expect(utils.formatRequest('Something went wrong.', undefined, undefined)).to.be.eql({err: 'Something went wrong.', status: null, body: null}); const body = {message: "Something went wrong"}; - expect(utils.formatRequest(null, {statusCode: 400}, body)).to.be.eql({err: null, status: 400, body: JSON.stringify(body)}); + expect(utils.formatRequest(null, {status: 400}, body)).to.be.eql({err: null, status: 400, body: JSON.stringify(body)}); const cricularBody = {message: "Something went wrong"}; cricularBody.body = cricularBody; - expect(utils.formatRequest(null, {statusCode: 500}, cricularBody)).to.be.eql({err: null, status: 500, body: '[Circular]'}); + expect(utils.formatRequest(null, {status: 500}, cricularBody)).to.be.eql({err: null, status: 500, body: '[Circular]'}); }); }); diff --git a/test/unit/bin/helpers/zipUpload.js b/test/unit/bin/helpers/zipUpload.js index fa418b7d..32241964 100644 --- a/test/unit/bin/helpers/zipUpload.js +++ b/test/unit/bin/helpers/zipUpload.js @@ -2,8 +2,9 @@ const chai = require("chai"), chaiAsPromised = require("chai-as-promised"), sinon = require("sinon"), - fs = require('fs'), - request = require("request"); + fs = require('fs'); + +const { default: axios } = require("axios"); const logger = require("../../../../bin/helpers/logger").winstonLogger, constant = require('../../../../bin/helpers/constants'), @@ -45,7 +46,15 @@ describe("zipUpload", () => { const zipUploader = rewire("../../../../bin/helpers/zipUpload"); beforeEach(() => { utilsStub = { - generateUploadParams: sinon.stub().returns({}), + generateUploadParams: sinon.stub().returns({ + auth: { + user: "someuser", + password: "someuser", + }, + headers: { + "someheader": "header" + } + }), formatRequest, }; loggerStub = { @@ -59,36 +68,6 @@ describe("zipUpload", () => { fs.lstatSync.restore(); }); - it("reject with error", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(new Error("test error"), null, null); - - zipUploader.__set__({ - request: { post: requestStub }, - utils: utilsStub, - logger: loggerStub - }); - let uploadSuitsrewire = zipUploader.__get__('uploadSuits'); - let opts = { - archivePresent: true, - messages: {} - } - let obj = { - bar1: null, - zipInterval: null, - size: 0, - startTime: null - } - return uploadSuitsrewire(bsConfig, filePath, opts, obj) - .then((_data) => { - chai.assert.fail("Promise error"); - }) - .catch((error) => { - chai.assert.equal(error.message.message, "test error"); - }); - }); - it("resolve with url if already present", () => { let uploadSuitsrewire = zipUploader.__get__('uploadSuits'); let opts = { @@ -133,12 +112,12 @@ describe("zipUpload", () => { }); it("resolve with nothing if parsing error", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 200 }, '{ random: "test }'); + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ status: 200, data: { "random": "test" }}); zipUploader.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, utils: utilsStub, logger: loggerStub }); @@ -146,7 +125,12 @@ describe("zipUpload", () => { let opts = { cleanupMethod: sinon.stub().returns(null), archivePresent: true, - messages: {} + messages: {}, + fileDetails: { + filetype: "zip", + filename: "abc" + }, + md5ReturnKey: "random" } let obj = { bar1: null, @@ -156,20 +140,20 @@ describe("zipUpload", () => { } return uploadSuitsrewire(bsConfig, filePath, opts, obj) .then((data) => { - chai.assert.hasAllKeys(data, ["time"]); + chai.assert.hasAllKeys(data, ["time", "random"]); }) .catch((_error) => { chai.assert.fail("Promise error"); }); }); - it("resolve with message if statusCode = 200", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 200 }, JSON.stringify({ zip_url: "zip_url" })); + it("resolve with message if status = 200", () => { + let axiosStub = sandbox + .stub(axios, "post") + .resolves({ status: 200 , data: { zip_url: "zip_url" }}); zipUploader.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, utils: utilsStub, logger: loggerStub }); @@ -177,7 +161,11 @@ describe("zipUpload", () => { let opts = { cleanupMethod: sinon.stub().returns(null), archivePresent: true, - messages: {} + messages: {}, + fileDetails: { + filetype: "zip", + filename: "abc" + }, } let obj = { bar1: null, @@ -195,19 +183,23 @@ describe("zipUpload", () => { }); it("reject with returned message if auth failed with message", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 401 }, JSON.stringify({ error: "auth failed" })); + let axiosStub = sandbox + .stub(axios, "post") + .rejects({response: { status: 401 , data: { error: "auth failed" }}}); zipUploader.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, utils: utilsStub, logger: loggerStub }); let uploadSuitsrewire = zipUploader.__get__('uploadSuits'); let opts = { archivePresent: true, - messages: {} + messages: {}, + fileDetails: { + filetype: "zip", + filename: "abc" + }, } let obj = { bar1: null, @@ -225,19 +217,23 @@ describe("zipUpload", () => { }); it("reject with predefined message if auth failed without message", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 401 }, JSON.stringify({ })); + let axiosStub = sandbox + .stub(axios, "post") + .rejects({response: { status: 401 , data: { }}}); zipUploader.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, utils: utilsStub, logger: loggerStub }); let uploadSuitsrewire = zipUploader.__get__('uploadSuits'); let opts = { archivePresent: true, - messages: {} + messages: {}, + fileDetails: { + filetype: "zip", + filename: "abc" + }, } let obj = { bar1: null, @@ -254,13 +250,13 @@ describe("zipUpload", () => { }); }); - it("resolve with nothing if request error but no propogation", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 402 }, JSON.stringify({ })); + it("resolve with nothing if axios error but no propogation", () => { + let axiosStub = sandbox + .stub(axios, "post") + .rejects({response: { status: 402 , data: { }}}); zipUploader.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, utils: utilsStub, logger: loggerStub }); @@ -268,7 +264,12 @@ describe("zipUpload", () => { let opts = { archivePresent: true, messages: {}, - propogateError: false + propogateError: false, + fileDetails: { + filetype: "zip", + filename: "abc" + }, + cleanupMethod: () => {} } let obj = { bar1: null, @@ -285,13 +286,13 @@ describe("zipUpload", () => { }); }); - it("reject with error if request error", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 402 }, JSON.stringify({ error: "test error" })); + it("reject with error if axios error", () => { + let axiosStub = sandbox + .stub(axios, "post") + .rejects({response: { status: 402 , data: { error: "test error" }}}); zipUploader.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, utils: utilsStub, logger: loggerStub }); @@ -299,7 +300,12 @@ describe("zipUpload", () => { let opts = { archivePresent: true, messages: {}, - propogateError: true + propogateError: true, + fileDetails: { + filetype: "zip", + filename: "abc" + }, + cleanupMethod: () => {} } let obj = { bar1: null, @@ -317,12 +323,12 @@ describe("zipUpload", () => { }); it("reject with limit exceeded error", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 413 }, JSON.stringify({ })); + let axiosStub = sandbox + .stub(axios, "post") + .rejects({response:{ status: 413 , data: { }}}); zipUploader.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, utils: utilsStub, logger: loggerStub }); @@ -330,7 +336,12 @@ describe("zipUpload", () => { let opts = { archivePresent: true, messages: {}, - propogateError: true + propogateError: true, + fileDetails: { + filetype: "zip", + filename: "abc" + }, + cleanupMethod: () => {} } let obj = { bar1: null, @@ -348,12 +359,12 @@ describe("zipUpload", () => { }); it("reject with not reachable error", () => { - let requestStub = sandbox - .stub(request, "post") - .yields(null, { statusCode: 414 }, JSON.stringify({ })); + let axiosStub = sandbox + .stub(axios, "post") + .rejects({response: { status: 414 , data: { }}}); zipUploader.__set__({ - request: { post: requestStub }, + axios: { post: axiosStub }, utils: utilsStub, logger: loggerStub }); @@ -361,7 +372,12 @@ describe("zipUpload", () => { let opts = { archivePresent: true, messages: {}, - propogateError: true + propogateError: true, + fileDetails: { + filetype: "zip", + filename: "abc" + }, + cleanupMethod: () => {} } let obj = { bar1: null, From 75468d849bcc4a8374b29745f357a32ecb763db9 Mon Sep 17 00:00:00 2001 From: Archish Date: Thu, 8 Jun 2023 13:17:23 +0530 Subject: [PATCH 02/15] :bug: fix for status code --- bin/helpers/buildArtifacts.js | 4 ++-- bin/helpers/downloadBuildStacktrace.js | 2 +- test/unit/bin/helpers/checkUploaded.js | 6 +++--- test/unit/bin/helpers/getInitialDetails.js | 2 +- test/unit/bin/helpers/utils.js | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/bin/helpers/buildArtifacts.js b/bin/helpers/buildArtifacts.js index b9b2295d..ddcff338 100644 --- a/bin/helpers/buildArtifacts.js +++ b/bin/helpers/buildArtifacts.js @@ -256,8 +256,8 @@ exports.downloadBuildArtifacts = async (bsConfig, buildId, args, rawArgs, buildR logger.error('Downloading the build artifacts failed.'); } utils.sendUsageReport(bsConfig, args, err, messageType, errorCode, buildReportData, rawArgs); - logger.error(`Error: Request failed with status code ${resp.statusCode}`) - logger.error(utils.formatRequest(err, resp, body)); + logger.error(`Error: Request failed with status code ${err.response.status}`) + logger.error(utils.formatRequest(err.response.statusText, err.response, err.response.data)); process.exitCode = Constants.ERROR_EXIT_CODE; } resolve(); diff --git a/bin/helpers/downloadBuildStacktrace.js b/bin/helpers/downloadBuildStacktrace.js index 5e6e67b6..ed16d646 100644 --- a/bin/helpers/downloadBuildStacktrace.js +++ b/bin/helpers/downloadBuildStacktrace.js @@ -11,7 +11,7 @@ const downloadBuildStacktrace = async (url) => { process.stdout.on('error', (err) => { error = err; process.stdout.close(); - reject(response.statusCode); + reject(response.data.status); }); process.stdout.on('close', async () => { if (!error) { diff --git a/test/unit/bin/helpers/checkUploaded.js b/test/unit/bin/helpers/checkUploaded.js index b49fdbdd..503ece9a 100644 --- a/test/unit/bin/helpers/checkUploaded.js +++ b/test/unit/bin/helpers/checkUploaded.js @@ -159,7 +159,7 @@ describe("checkUploaded", () => { it("resolves with zipUrlPresent false as not found in db", () => { let axiosStub = sandbox .stub(axios, "post") - .resolves({ statusCode: 404 , data: {"message":"zip_url for md5sum random_md5sum not found."}}); + .resolves({ status: 404 , data: {"message":"zip_url for md5sum random_md5sum not found."}}); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ @@ -183,7 +183,7 @@ describe("checkUploaded", () => { it("resolves with zipUrlPresent and packageUrlPresent false if force-upload enabled and cache_dependencies disabled", () => { let axiosStub = sandbox .stub(axios, "post") - .resolves({ statusCode: 404 , data: '{"message":"zip_url for md5sum random_md5sum not found."}'}); + .resolves({ status: 404 , data: '{"message":"zip_url for md5sum random_md5sum not found."}'}); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ @@ -231,7 +231,7 @@ describe("checkUploaded", () => { it("resolves with zipUrlPresent false and packageUrlPresent false if diabled from rails", () => { let axiosStub = sandbox .stub(axios, "post") - .resolves( { statusCode: 200 , data: {"disableNpmSuiteCache": true, "disableTestSuiteCache": true }}); + .resolves( { status: 200 , data: {"disableNpmSuiteCache": true, "disableTestSuiteCache": true }}); const checkUploaded = rewire("../../../../bin/helpers/checkUploaded"); checkUploaded.__set__({ diff --git a/test/unit/bin/helpers/getInitialDetails.js b/test/unit/bin/helpers/getInitialDetails.js index a0d28466..617a9f7f 100644 --- a/test/unit/bin/helpers/getInitialDetails.js +++ b/test/unit/bin/helpers/getInitialDetails.js @@ -34,7 +34,7 @@ describe('#getInitialDetails', () => { it('sends usage report if error occurred in getInitialDetails call', () => { let error_message = "error occurred"; axiosStub.resolves(error_message); - formatRequestStub.returns({err: error_message, statusCode: null, body: null}) + formatRequestStub.returns({err: error_message, status: null, body: null}) sendUsageReportStub.calledOnceWithExactly(bsConfig, args, error_message, messageType, errorCode, null, rawArgs); getInitialDetails(bsConfig, args, rawArgs).then((result) => { expect(result).to.eq({}); diff --git a/test/unit/bin/helpers/utils.js b/test/unit/bin/helpers/utils.js index b1924912..fb019659 100644 --- a/test/unit/bin/helpers/utils.js +++ b/test/unit/bin/helpers/utils.js @@ -3292,7 +3292,7 @@ describe('utils', () => { axiosStub.restore(); }); - it('message thrown if statusCode != 200', async () => { + it('message thrown if status != 200', async () => { let non_200_status_response = { status: 400 } @@ -3307,7 +3307,7 @@ describe('utils', () => { axiosStub.restore(); }); - it('message thrown if statusCode != 200 and user unauthorized', async () => { + it('message thrown if status != 200 and user unauthorized', async () => { let body_with_message = { ...body, "message": "Unauthorized", @@ -3330,7 +3330,7 @@ describe('utils', () => { axiosStub.restore(); }); - it('message thrown if statusCode != 200 and build is present', async () => { + it('message thrown if status != 200 and build is present', async () => { let non_200_status_response = { status: 402, data: body From 7313f925264ae5edb747906a76ec64d113cdcb41 Mon Sep 17 00:00:00 2001 From: Archish Date: Thu, 8 Jun 2023 14:40:13 +0530 Subject: [PATCH 03/15] :bug: fix for checking uploading specs --- bin/helpers/checkUploaded.js | 2 +- bin/helpers/sync/syncSpecsLogs.js | 2 -- test/unit/bin/commands/info.js | 2 -- test/unit/bin/helpers/build.js | 1 - 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/bin/helpers/checkUploaded.js b/bin/helpers/checkUploaded.js index 37121255..cf5814cf 100644 --- a/bin/helpers/checkUploaded.js +++ b/bin/helpers/checkUploaded.js @@ -126,7 +126,7 @@ const checkUploadedMd5 = (bsConfig, args, instrumentBlocks) => { const response = await axios.post(options.url, options.body, { auth: { username: options.auth.user, - username: options.auth.password + password: options.auth.password }, headers: options.headers }) diff --git a/bin/helpers/sync/syncSpecsLogs.js b/bin/helpers/sync/syncSpecsLogs.js index 1f1a8572..f092257b 100644 --- a/bin/helpers/sync/syncSpecsLogs.js +++ b/bin/helpers/sync/syncSpecsLogs.js @@ -144,14 +144,12 @@ let whileProcess = async (whilstCallback) => { switch (response.status) { case 202: // get data here and print it n = 2 - console.log("BODY", response.data) showSpecsStatus(response.data, 202); return setTimeout(whilstCallback, timeout * n, null); case 204: // No data available, wait for some time and ask again n = 1 return setTimeout(whilstCallback, timeout * n, null); case 200: // Build is completed. - console.log("HEREEE") whileLoop = false; endTime = Date.now(); showSpecsStatus(response.data, 200); diff --git a/test/unit/bin/commands/info.js b/test/unit/bin/commands/info.js index 54ca6349..f928084f 100644 --- a/test/unit/bin/commands/info.js +++ b/test/unit/bin/commands/info.js @@ -193,7 +193,6 @@ describe("buildInfo", () => { sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, {}, rawArgs); }) .catch((error) => { - console.log(error) chai.assert.isNotOk(error, "Promise error"); }); }); @@ -242,7 +241,6 @@ describe("buildInfo", () => { sinon.assert.calledOnceWithExactly(sendUsageReportStub, bsConfig, args, message, messageType, errorCode, {}, rawArgs); }) .catch((error) => { - console.log(error) chai.assert.isNotOk(error, "Promise error"); }); }); diff --git a/test/unit/bin/helpers/build.js b/test/unit/bin/helpers/build.js index 6961b1a0..aafac700 100644 --- a/test/unit/bin/helpers/build.js +++ b/test/unit/bin/helpers/build.js @@ -107,7 +107,6 @@ describe("build", () => { chai.assert.equal(data, "random message"); }) .catch((error) => { - console.log(error) chai.assert.isNotOk(error, "Promise error"); }); }); From b238df279e4c18e9e61e58f8ccd561a17fdf8e4d Mon Sep 17 00:00:00 2001 From: Archish Date: Thu, 8 Jun 2023 15:14:21 +0530 Subject: [PATCH 04/15] :art: for progress bar percentage --- bin/helpers/zipUpload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/helpers/zipUpload.js b/bin/helpers/zipUpload.js index 7657cc9c..e0208dbb 100644 --- a/bin/helpers/zipUpload.js +++ b/bin/helpers/zipUpload.js @@ -68,7 +68,7 @@ const uploadSuits = (bsConfig, filePath, opts, obj) => { }, headers: options.headers, onUploadProgress: (progressEvent) => { - let percent = progressEvent.loaded * 100.0 / progressEvent.total; + let percent = parseInt(Math.floor((progressEvent.loaded * 100) / progressEvent.total)); obj.bar1.update(percent, { speed: ((progressEvent.loaded / (Date.now() - obj.startTime)) / 125).toFixed(2) //kbits per sec }); From 4189e14aa52d75f1c6706272fc1d5fd904f13073 Mon Sep 17 00:00:00 2001 From: Archish Date: Fri, 9 Jun 2023 08:16:35 +0530 Subject: [PATCH 05/15] :bug: fix for zip upload --- bin/helpers/getInitialDetails.js | 6 ++-- bin/helpers/zipUpload.js | 54 ++++++++++++++++---------------- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/bin/helpers/getInitialDetails.js b/bin/helpers/getInitialDetails.js index 7a94aa67..44f375c7 100644 --- a/bin/helpers/getInitialDetails.js +++ b/bin/helpers/getInitialDetails.js @@ -39,8 +39,10 @@ exports.getInitialDetails = (bsConfig, args, rawArgs) => { resolve(responseData); } } catch (error) { - logger.warn(utils.formatRequest(error.response.statusText, error.response, error.response.data)); - utils.sendUsageReport(bsConfig, args, error.response, Constants.messageTypes.ERROR, 'get_initial_details_failed', null, rawArgs); + if(error.response) { + logger.warn(utils.formatRequest(error.response.statusText, error.response, error.response.data)); + utils.sendUsageReport(bsConfig, args, error.response, Constants.messageTypes.ERROR, 'get_initial_details_failed', null, rawArgs); + } resolve({}); } }); diff --git a/bin/helpers/zipUpload.js b/bin/helpers/zipUpload.js index e0208dbb..9788ce68 100644 --- a/bin/helpers/zipUpload.js +++ b/bin/helpers/zipUpload.js @@ -70,12 +70,12 @@ const uploadSuits = (bsConfig, filePath, opts, obj) => { onUploadProgress: (progressEvent) => { let percent = parseInt(Math.floor((progressEvent.loaded * 100) / progressEvent.total)); obj.bar1.update(percent, { - speed: ((progressEvent.loaded / (Date.now() - obj.startTime)) / 125).toFixed(2) //kbits per sec + speed: ((progressEvent.bytes / (Date.now() - obj.startTime)) / 125).toFixed(2) //kbits per sec }); - } + }, }); responseData = response.data; - purgeUploadBar(obj); + purgeUploadBar(obj) logger.info(`${opts.messages.uploadingSuccess} (${responseData[opts.md5ReturnKey]})`); opts.cleanupMethod(); responseData["time"] = Date.now() - obj.startTime; @@ -84,34 +84,34 @@ const uploadSuits = (bsConfig, filePath, opts, obj) => { let responseData = null; if(error.response){ responseData = error.response.data; - } - if (error.response.status === 401) { - if (responseData && responseData.error) { - responseData.time = Date.now() - obj.startTime; - return reject({message: responseData.error, stacktrace: utils.formatRequest(responseData.error, error.response, responseData)}); - } else { - return reject({message: Constants.validationMessages.INVALID_DEFAULT_AUTH_PARAMS, stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); - } - } - if (!opts.propogateError){ - purgeUploadBar(obj); - if (error.response.status === 413) { - return resolve({warn: Constants.userMessages.NODE_MODULES_LIMIT_EXCEEDED.replace("%SIZE%", (size / 1000000).toFixed(2))}); + if (error.response.status === 401) { + if (responseData && responseData.error) { + responseData.time = Date.now() - obj.startTime; + return reject({message: responseData.error, stacktrace: utils.formatRequest(responseData.error, error.response, responseData)}); + } else { + return reject({message: Constants.validationMessages.INVALID_DEFAULT_AUTH_PARAMS, stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); + } } - return resolve({}) - } - if(responseData && responseData["error"]){ - responseData["time"] = Date.now() - obj.startTime; - reject({message: responseData["error"], stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); - } else { - if (error.response.status === 413) { - reject({message: Constants.userMessages.ZIP_UPLOAD_LIMIT_EXCEEDED, stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); + if (!opts.propogateError){ + purgeUploadBar(obj); + if (error.response.status === 413) { + return resolve({warn: Constants.userMessages.NODE_MODULES_LIMIT_EXCEEDED.replace("%SIZE%", (size / 1000000).toFixed(2))}); + } + return resolve({}) + } + if(responseData && responseData["error"]){ + responseData["time"] = Date.now() - obj.startTime; + reject({message: responseData["error"], stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); } else { - reject({message: Constants.userMessages.ZIP_UPLOADER_NOT_REACHABLE, stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); + if (error.response.status === 413) { + reject({message: Constants.userMessages.ZIP_UPLOAD_LIMIT_EXCEEDED, stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); + } else { + reject({message: Constants.userMessages.ZIP_UPLOADER_NOT_REACHABLE, stacktrace: utils.formatRequest(error.response.statusText, error.response, responseData)}); + } } - } - if(error.response){ reject({message: error.response, stacktrace: utils.formatRequest(error.response.statusText, error.response, error.response.data)}); + } else { + reject({}) } } }); From 1c29d3178eac603588de4fa272dc24a817ae1874 Mon Sep 17 00:00:00 2001 From: Archish Date: Mon, 12 Jun 2023 11:32:08 +0530 Subject: [PATCH 06/15] :bug: fix for sending usage reporting --- bin/helpers/usageReporting.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/helpers/usageReporting.js b/bin/helpers/usageReporting.js index 4e4170d3..b68ecb11 100644 --- a/bin/helpers/usageReporting.js +++ b/bin/helpers/usageReporting.js @@ -281,7 +281,7 @@ async function send(args) { } }); try { - const response = await axios.post(options.url, options.payload, { + const response = await axios.post(options.url, options.body, { headers: options.headers, }); let result = { From de1f9866ac95145bdd400049ec65daf88d755146 Mon Sep 17 00:00:00 2001 From: Archish Date: Mon, 12 Jun 2023 11:50:48 +0530 Subject: [PATCH 07/15] :bug: fix for getting initial details api --- bin/helpers/getInitialDetails.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/helpers/getInitialDetails.js b/bin/helpers/getInitialDetails.js index 44f375c7..2fbb5732 100644 --- a/bin/helpers/getInitialDetails.js +++ b/bin/helpers/getInitialDetails.js @@ -39,9 +39,9 @@ exports.getInitialDetails = (bsConfig, args, rawArgs) => { resolve(responseData); } } catch (error) { - if(error.response) { - logger.warn(utils.formatRequest(error.response.statusText, error.response, error.response.data)); - utils.sendUsageReport(bsConfig, args, error.response, Constants.messageTypes.ERROR, 'get_initial_details_failed', null, rawArgs); + if(error.response && error.response.status !== 200) { + logger.warn(`Warn: Get Initial Details Request failed with status code ${error.response.status}`); + utils.sendUsageReport(bsConfig, args, error.response.data["error"], Constants.messageTypes.ERROR, 'get_initial_details_failed', null, rawArgs); } resolve({}); } From 0a082f15b814be5ad8500745d8a3c0dc33cbfd11 Mon Sep 17 00:00:00 2001 From: Archish Date: Wed, 14 Jun 2023 11:22:46 +0530 Subject: [PATCH 08/15] :art: trimming the error message --- bin/helpers/build.js | 5 +++-- bin/helpers/buildArtifacts.js | 8 +++++--- bin/helpers/utils.js | 4 +++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/bin/helpers/build.js b/bin/helpers/build.js index cef2c8bb..da7f8426 100644 --- a/bin/helpers/build.js +++ b/bin/helpers/build.js @@ -54,9 +54,10 @@ const createBuild = (bsConfig, zip) => { } resolve(build); } catch (error) { - if(error.response) + if(error.response) { logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); - reject(error); + reject(error.response.data.message); + } } }).catch(function(err){ reject(err); diff --git a/bin/helpers/buildArtifacts.js b/bin/helpers/buildArtifacts.js index ddcff338..2f87ad0f 100644 --- a/bin/helpers/buildArtifacts.js +++ b/bin/helpers/buildArtifacts.js @@ -184,9 +184,11 @@ const sendUpdatesToBstack = async (bsConfig, buildId, args, options, rawArgs, bu } resolve(); } catch (error) { - utils.sendUsageReport(bsConfig, args, error.response, Constants.messageTypes.ERROR, 'api_failed_build_artifacts_status_update', buildReportData, rawArgs); - logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); - reject(errror.response); + if(error.response) { + utils.sendUsageReport(bsConfig, args, error.response, Constants.messageTypes.ERROR, 'api_failed_build_artifacts_status_update', buildReportData, rawArgs); + logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); + reject(errror.response.data.message); + } } }); } diff --git a/bin/helpers/utils.js b/bin/helpers/utils.js index 5ed35f82..45a1e8d5 100644 --- a/bin/helpers/utils.js +++ b/bin/helpers/utils.js @@ -947,7 +947,9 @@ exports.checkLocalBinaryRunning = (bsConfig, localIdentifier) => { }); resolve(response.data) } catch (error) { - reject(error); + if(error.response) { + reject(error.response.data.message); + } } }); }; From 3b358a4e5971933752a127e4df2b6dfbc561b16f Mon Sep 17 00:00:00 2001 From: Archish Date: Wed, 14 Jun 2023 11:26:26 +0530 Subject: [PATCH 09/15] :art: trimming the error message --- bin/helpers/build.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/helpers/build.js b/bin/helpers/build.js index da7f8426..1396507a 100644 --- a/bin/helpers/build.js +++ b/bin/helpers/build.js @@ -56,7 +56,7 @@ const createBuild = (bsConfig, zip) => { } catch (error) { if(error.response) { logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); - reject(error.response.data.message); + reject(`${Constants.userMessages.BUILD_FAILED} Error : ${error.response.data.message}`); } } }).catch(function(err){ From c6c2eb08896242f1ef7947db4af0212342e6687e Mon Sep 17 00:00:00 2001 From: Archish Date: Wed, 14 Jun 2023 11:44:17 +0530 Subject: [PATCH 10/15] :art: should show error message when build stopped --- bin/helpers/build.js | 2 +- bin/helpers/utils.js | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/bin/helpers/build.js b/bin/helpers/build.js index 1396507a..c3618e06 100644 --- a/bin/helpers/build.js +++ b/bin/helpers/build.js @@ -56,7 +56,7 @@ const createBuild = (bsConfig, zip) => { } catch (error) { if(error.response) { logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); - reject(`${Constants.userMessages.BUILD_FAILED} Error : ${error.response.data.message}`); + reject(`${Constants.userMessages.BUILD_FAILED} Error: ${error.response.data.message}`); } } }).catch(function(err){ diff --git a/bin/helpers/utils.js b/bin/helpers/utils.js index 45a1e8d5..3ed67475 100644 --- a/bin/helpers/utils.js +++ b/bin/helpers/utils.js @@ -1338,10 +1338,14 @@ exports.stopBrowserStackBuild = async (bsConfig, args, buildId, rawArgs, buildRe logger.info(message); } } catch(err) { - message = Constants.userMessages.BUILD_STOP_FAILED; - messageType = Constants.messageTypes.ERROR; - errorCode = 'api_failed_build_stop'; - logger.info(message); + if(err.response) { + message = `${ + Constants.userMessages.BUILD_STOP_FAILED + } with error: ${error.response.data.message}`; + messageType = Constants.messageTypes.ERROR; + errorCode = 'api_failed_build_stop'; + logger.error(message); + } } finally { that.sendUsageReport(bsConfig, args, message, messageType, errorCode, buildReportData, rawArgs); } From f5a3b0c25f13a4072296b2390fe375fd91975d9d Mon Sep 17 00:00:00 2001 From: Archish Date: Wed, 14 Jun 2023 11:52:54 +0530 Subject: [PATCH 11/15] :art: should show error message when build stopped --- bin/commands/info.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/commands/info.js b/bin/commands/info.js index ae9146a9..7a4efe92 100644 --- a/bin/commands/info.js +++ b/bin/commands/info.js @@ -84,7 +84,9 @@ module.exports = function info(args, rawArgs) { } logger.info(message); } catch (error) { - message = Constants.userMessages.BUILD_INFO_FAILED; + message = `${ + Constants.userMessages.BUILD_INFO_FAILED + } with error: \n${error.response.data.message}`; messageType = Constants.messageTypes.ERROR; errorCode = 'api_failed_build_info'; logger.info(message); From e278e4346e2429d5ec0b8101b227c38b12f4ecdc Mon Sep 17 00:00:00 2001 From: Archish Date: Wed, 14 Jun 2023 12:03:23 +0530 Subject: [PATCH 12/15] :art: should show error message when build stopped --- bin/helpers/utils.js | 76 ++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/bin/helpers/utils.js b/bin/helpers/utils.js index 3ed67475..c6c40ab4 100644 --- a/bin/helpers/utils.js +++ b/bin/helpers/utils.js @@ -1305,55 +1305,49 @@ exports.stopBrowserStackBuild = async (bsConfig, args, buildId, rawArgs, buildRe auth: options.auth, headers: options.headers }); - try { - build = response.data; - if (response.status == 299) { - messageType = Constants.messageTypes.INFO; - errorCode = 'api_deprecated'; - - if (build) { - message = build.message; - logger.info(message); - } else { - message = Constants.userMessages.API_DEPRECATED; - logger.info(message); - } - } else if (response.status !== 200) { - messageType = Constants.messageTypes.ERROR; - errorCode = 'api_failed_build_stop'; - - if (build) { - message = `${ - Constants.userMessages.BUILD_STOP_FAILED - } with error: \n${JSON.stringify(build, null, 2)}`; - logger.error(message); - if (build.message === 'Unauthorized') errorCode = 'api_auth_failed'; - } else { - message = Constants.userMessages.BUILD_STOP_FAILED; - logger.error(message); - } + + build = response.data; + if (response.status == 299) { + messageType = Constants.messageTypes.INFO; + errorCode = 'api_deprecated'; + + if (build) { + message = build.message; + logger.info(message); } else { - messageType = Constants.messageTypes.SUCCESS; - message = `${JSON.stringify(build, null, 2)}`; + message = Constants.userMessages.API_DEPRECATED; logger.info(message); } - } catch(err) { - if(err.response) { + } else if (response.status !== 200) { + messageType = Constants.messageTypes.ERROR; + errorCode = 'api_failed_build_stop'; + + if (build) { message = `${ Constants.userMessages.BUILD_STOP_FAILED - } with error: ${error.response.data.message}`; - messageType = Constants.messageTypes.ERROR; - errorCode = 'api_failed_build_stop'; + } with error: \n${JSON.stringify(build, null, 2)}`; + logger.error(message); + if (build.message === 'Unauthorized') errorCode = 'api_auth_failed'; + } else { + message = Constants.userMessages.BUILD_STOP_FAILED; logger.error(message); } - } finally { - that.sendUsageReport(bsConfig, args, message, messageType, errorCode, buildReportData, rawArgs); + } else { + messageType = Constants.messageTypes.SUCCESS; + message = `${JSON.stringify(build, null, 2)}`; + logger.info(message); } - } catch (error) { - message = Constants.userMessages.BUILD_STOP_FAILED; - messageType = Constants.messageTypes.ERROR; - errorCode = 'api_failed_build_stop'; - logger.info(message); + } catch(err) { + if(err.response) { + message = `${ + Constants.userMessages.BUILD_STOP_FAILED + } with error: ${err.response.data.message}`; + messageType = Constants.messageTypes.ERROR; + errorCode = 'api_failed_build_stop'; + logger.error(message); + } + } finally { + that.sendUsageReport(bsConfig, args, message, messageType, errorCode, buildReportData, rawArgs); } } From 6a217b66d3ec179cac8f17ee3cbd65cb60352720 Mon Sep 17 00:00:00 2001 From: Archish Date: Wed, 14 Jun 2023 13:25:34 +0530 Subject: [PATCH 13/15] :bug: fix for build artifacts --- bin/helpers/buildArtifacts.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bin/helpers/buildArtifacts.js b/bin/helpers/buildArtifacts.js index 2f87ad0f..4bb2912e 100644 --- a/bin/helpers/buildArtifacts.js +++ b/bin/helpers/buildArtifacts.js @@ -213,7 +213,10 @@ exports.downloadBuildArtifacts = async (bsConfig, buildId, args, rawArgs, buildR let messageType = null; let errorCode = null; let buildDetails = null; - const config = {}; + options.config = { + auth: options.auth, + headers: options.headers + } if(process.env.HTTP_PROXY){ options.config.proxy = false; options.config.httpAgent = new HttpsProxyAgent(process.env.HTTP_PROXY); @@ -222,7 +225,7 @@ exports.downloadBuildArtifacts = async (bsConfig, buildId, args, rawArgs, buildR options.config.httpAgent = new HttpsProxyAgent(process.env.HTTPS_PROXY); } try { - const response = await axios.get(options.url, config); + const response = await axios.get(options.url, options.config); try { buildDetails = response.data; if(response.status != 200) { From 8e005f80e843873f9cf8fc9ada20abcdcc84eec2 Mon Sep 17 00:00:00 2001 From: Archish Date: Wed, 14 Jun 2023 13:56:53 +0530 Subject: [PATCH 14/15] :bug: fix for build artifacts --- bin/helpers/buildArtifacts.js | 58 +++++++++++++++++------------------ 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/bin/helpers/buildArtifacts.js b/bin/helpers/buildArtifacts.js index 4bb2912e..9e176127 100644 --- a/bin/helpers/buildArtifacts.js +++ b/bin/helpers/buildArtifacts.js @@ -226,31 +226,31 @@ exports.downloadBuildArtifacts = async (bsConfig, buildId, args, rawArgs, buildR } try { const response = await axios.get(options.url, options.config); - try { - buildDetails = response.data; - if(response.status != 200) { - logger.error('Downloading the build artifacts failed.'); - logger.error(`Error: Request failed with status code ${response.status}`) - logger.error(utils.formatRequest(response.statusText, response, response.data)); - utils.sendUsageReport(bsConfig, args, JSON.stringify(buildDetails), Constants.messageTypes.ERROR, 'api_failed_build_artifacts', buildReportData, rawArgs); + buildDetails = response.data; + if(response.status != 200) { + logger.error('Downloading the build artifacts failed.'); + logger.error(`Error: Request failed with status code ${response.status}`) + logger.error(utils.formatRequest(response.statusText, response, response.data)); + utils.sendUsageReport(bsConfig, args, JSON.stringify(buildDetails), Constants.messageTypes.ERROR, 'api_failed_build_artifacts', buildReportData, rawArgs); + process.exitCode = Constants.ERROR_EXIT_CODE; + } else { + await createDirectories(buildId, buildDetails); + await parseAndDownloadArtifacts(buildId, buildDetails); + if (BUILD_ARTIFACTS_FAIL_COUNT > 0) { + messageType = Constants.messageTypes.ERROR; + message = Constants.userMessages.DOWNLOAD_BUILD_ARTIFACTS_FAILED.replace('', buildId).replace('', BUILD_ARTIFACTS_FAIL_COUNT); + logger.error(message); process.exitCode = Constants.ERROR_EXIT_CODE; } else { - await createDirectories(buildId, buildDetails); - await parseAndDownloadArtifacts(buildId, buildDetails); - if (BUILD_ARTIFACTS_FAIL_COUNT > 0) { - messageType = Constants.messageTypes.ERROR; - message = Constants.userMessages.DOWNLOAD_BUILD_ARTIFACTS_FAILED.replace('', buildId).replace('', BUILD_ARTIFACTS_FAIL_COUNT); - logger.error(message); - process.exitCode = Constants.ERROR_EXIT_CODE; - } else { - messageType = Constants.messageTypes.SUCCESS; - message = Constants.userMessages.DOWNLOAD_BUILD_ARTIFACTS_SUCCESS.replace('', buildId).replace('', process.cwd()); - logger.info(message); - } - await sendUpdatesToBstack(bsConfig, buildId, args, options, rawArgs, buildReportData) - utils.sendUsageReport(bsConfig, args, message, messageType, null, buildReportData, rawArgs); + messageType = Constants.messageTypes.SUCCESS; + message = Constants.userMessages.DOWNLOAD_BUILD_ARTIFACTS_SUCCESS.replace('', buildId).replace('', process.cwd()); + logger.info(message); } - } catch (err) { + await sendUpdatesToBstack(bsConfig, buildId, args, options, rawArgs, buildReportData) + utils.sendUsageReport(bsConfig, args, message, messageType, null, buildReportData, rawArgs); + } + } catch (err) { + if(err.response && err.response.status !== 200) { messageType = Constants.messageTypes.ERROR; errorCode = 'api_failed_build_artifacts'; if (BUILD_ARTIFACTS_FAIL_COUNT > 0) { @@ -260,16 +260,14 @@ exports.downloadBuildArtifacts = async (bsConfig, buildId, args, rawArgs, buildR } else { logger.error('Downloading the build artifacts failed.'); } - utils.sendUsageReport(bsConfig, args, err, messageType, errorCode, buildReportData, rawArgs); - logger.error(`Error: Request failed with status code ${err.response.status}`) - logger.error(utils.formatRequest(err.response.statusText, err.response, err.response.data)); - process.exitCode = Constants.ERROR_EXIT_CODE; + utils.sendUsageReport(bsConfig, args, err.response.data, messageType, errorCode, buildReportData, rawArgs); + logger.error(`Error: Request failed with status code ${err.status}`) + logger.error(utils.formatRequest(err.status, err.response, err.response.data)); + } else { + logger.info(err); } - resolve(); - } catch (error) { - logger.error(utils.formatRequest(error.response.statusText, error.response, error.response.data)); - utils.sendUsageReport(bsConfig, args, error.response, Constants.messageTypes.ERROR, 'api_failed_build_artifacts', buildReportData, rawArgs); process.exitCode = Constants.ERROR_EXIT_CODE; } + resolve(); }); }; From 74e7992c708f1c8f072a42e87a42943442da8a1d Mon Sep 17 00:00:00 2001 From: Archish Date: Wed, 14 Jun 2023 14:07:16 +0530 Subject: [PATCH 15/15] :bug: fix for build artifacts --- bin/helpers/buildArtifacts.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/bin/helpers/buildArtifacts.js b/bin/helpers/buildArtifacts.js index 9e176127..7b2c7c1d 100644 --- a/bin/helpers/buildArtifacts.js +++ b/bin/helpers/buildArtifacts.js @@ -224,8 +224,9 @@ exports.downloadBuildArtifacts = async (bsConfig, buildId, args, rawArgs, buildR options.config.proxy = false; options.config.httpAgent = new HttpsProxyAgent(process.env.HTTPS_PROXY); } + let response; try { - const response = await axios.get(options.url, options.config); + response = await axios.get(options.url, options.config); buildDetails = response.data; if(response.status != 200) { logger.error('Downloading the build artifacts failed.'); @@ -264,7 +265,18 @@ exports.downloadBuildArtifacts = async (bsConfig, buildId, args, rawArgs, buildR logger.error(`Error: Request failed with status code ${err.status}`) logger.error(utils.formatRequest(err.status, err.response, err.response.data)); } else { - logger.info(err); + messageType = Constants.messageTypes.ERROR; + errorCode = 'api_failed_build_artifacts'; + if (BUILD_ARTIFACTS_FAIL_COUNT > 0) { + messageType = Constants.messageTypes.ERROR; + message = Constants.userMessages.DOWNLOAD_BUILD_ARTIFACTS_FAILED.replace('', buildId).replace('', BUILD_ARTIFACTS_FAIL_COUNT); + logger.error(message); + } else { + logger.error('Downloading the build artifacts failed.'); + } + utils.sendUsageReport(bsConfig, args, err, messageType, errorCode, buildReportData, rawArgs); + logger.error(`Error: Request failed with status code ${response.status}`) + logger.error(utils.formatRequest(err, response, response.data)); } process.exitCode = Constants.ERROR_EXIT_CODE; }