Comparing version 3.2.3 to 3.2.4
@@ -9,4 +9,4 @@ import './polyfills'; | ||
runTestPlan(testPlan: Loadmill.TestPlanDef, params: Loadmill.Params): Promise<Loadmill.TestDef | undefined>; | ||
junitReport(testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, path?: string | undefined): Promise<void>; | ||
mochawesomeReport(testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, path?: string | undefined): Promise<void>; | ||
junitReport(testResult: Loadmill.TestResult, path?: string | undefined): Promise<void>; | ||
mochawesomeReport(testResult: Loadmill.TestResult, path?: string | undefined): Promise<void>; | ||
}; | ||
@@ -19,3 +19,3 @@ declare namespace Loadmill { | ||
id: string; | ||
type: string; | ||
type: TYPES; | ||
} | ||
@@ -22,0 +22,0 @@ interface TestSuiteDef { |
import * as Loadmill from "./index"; | ||
export declare const junitReport: (testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, token: string, path?: string | undefined) => Promise<void>; | ||
export declare const mochawesomeReport: (testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, token: string, path?: string | undefined) => Promise<void>; | ||
export declare const junitReport: (testResult: Loadmill.TestResult, token: string, path?: string | undefined) => Promise<void>; | ||
export declare const mochawesomeReport: (testResult: Loadmill.TestResult, token: string, path?: string | undefined) => Promise<void>; |
@@ -7,3 +7,2 @@ "use strict"; | ||
var path = require("path"); | ||
var xml = require("xml"); | ||
var superagent = require("superagent"); | ||
@@ -17,88 +16,72 @@ var pLimit = require('p-limit'); | ||
var utils_1 = require("./utils"); | ||
var generateJunitJsonReport = function (testResult, token) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { | ||
var flowResult, suiteResult, suites, limit, jsonResults, _a, _b; | ||
var _c; | ||
return tslib_1.__generator(this, function (_d) { | ||
switch (_d.label) { | ||
var testingServer = "https://" + utils_1.TESTING_HOST; | ||
var POLLING_INTERVAL_MS = 5000; | ||
var MAX_POLLING = 36; // 3 minutes | ||
var generateJunitReport = function (testId, runType, token) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { | ||
var junitReportId, err_1; | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
flowResult = function (f) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { | ||
var url, flowRunDetails, flowRun; | ||
var _a; | ||
return tslib_1.__generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
url = getFlowRunAPI(f); | ||
return [4 /*yield*/, superagent.get(url).auth(token, '')]; | ||
case 1: | ||
flowRunDetails = (_b.sent()).body; | ||
flowRun = { | ||
'testcase': [{ | ||
_attr: { | ||
name: f.description, | ||
status: f.status, | ||
time: ((+flowRunDetails.endTime - +flowRunDetails.startTime) || 0) / 1000 | ||
} | ||
}] | ||
}; | ||
if (f.status === "FAILED") { | ||
(_a = flowRun.testcase).push.apply(_a, toFailedJUnitFlowRunReport(flowRunDetails)); | ||
} | ||
return [2 /*return*/, flowRun]; | ||
} | ||
}); | ||
}); }; | ||
suiteResult = function (suite) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { | ||
var _a, flowRuns, failures, limit, _b, _c; | ||
var _d; | ||
return tslib_1.__generator(this, function (_e) { | ||
switch (_e.label) { | ||
case 0: | ||
_a = suite.flowRuns, flowRuns = _a === void 0 ? [] : _a; | ||
failures = flowRuns.filter(function (f) { return f.status !== 'PASSED'; }).length; | ||
limit = pLimit(3); | ||
_d = {}; | ||
_b = 'testsuite'; | ||
_c = [[{ | ||
_attr: { | ||
name: suite.description, | ||
errors: failures, | ||
failures: failures, | ||
timestamp: (new Date()).toISOString().slice(0, -5), | ||
tests: flowRuns.length, | ||
url: suite.url | ||
} | ||
}]]; | ||
return [4 /*yield*/, Promise.all(flowRuns.map(function (f) { return limit(function () { return flowResult(f); }); }))]; | ||
case 1: return [2 /*return*/, (_d[_b] = tslib_1.__spreadArray.apply(void 0, _c.concat([_e.sent()])), | ||
_d)]; | ||
} | ||
}); | ||
}); }; | ||
if (!Array.isArray(testResult)) { | ||
if (Array.isArray(testResult.testSuitesRuns)) { // testplan | ||
suites = testResult.testSuitesRuns; | ||
} | ||
else { | ||
suites = [testResult]; // single run | ||
} | ||
_a.trys.push([0, 2, , 3]); | ||
return [4 /*yield*/, superagent.post(junitReportAPI) | ||
.send({ testId: testId, runType: runType }) | ||
.auth(token, '')]; | ||
case 1: | ||
junitReportId = (_a.sent()).body.junitReportId; | ||
return [2 /*return*/, junitReportId]; | ||
case 2: | ||
err_1 = _a.sent(); | ||
handleJunitFailed(err_1.message); | ||
return [3 /*break*/, 3]; | ||
case 3: return [2 /*return*/]; | ||
} | ||
}); | ||
}); }; | ||
var waitForAndSaveJunitReport = function (reportId, token, path) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { | ||
var polling_count, junitReport_1, err_2; | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
polling_count = 0; | ||
_a.label = 1; | ||
case 1: | ||
if (!(polling_count < MAX_POLLING)) return [3 /*break*/, 7]; | ||
_a.label = 2; | ||
case 2: | ||
_a.trys.push([2, 4, , 5]); | ||
return [4 /*yield*/, superagent.get(junitReportAPI + "/" + reportId) | ||
.auth(token, '')]; | ||
case 3: | ||
junitReport_1 = (_a.sent()).body.junitReport; | ||
saveJunitReport(junitReport_1, path); | ||
return [3 /*break*/, 7]; | ||
case 4: | ||
err_2 = _a.sent(); | ||
if (err_2.status !== 404) { | ||
handleJunitFailed(err_2.message); | ||
return [3 /*break*/, 7]; | ||
} | ||
else { | ||
suites = testResult; // multiple suites | ||
return [3 /*break*/, 5]; | ||
case 5: | ||
polling_count++; | ||
return [4 /*yield*/, utils_1.sleep(POLLING_INTERVAL_MS)]; | ||
case 6: | ||
_a.sent(); | ||
return [3 /*break*/, 1]; | ||
case 7: | ||
if (polling_count === MAX_POLLING) { | ||
handleJunitFailed('Generating report took too long. Please contact support'); | ||
} | ||
limit = pLimit(3); | ||
_c = {}; | ||
_a = 'testsuites'; | ||
_b = [[{ | ||
_attr: { | ||
name: 'Loadmill suites run' | ||
} | ||
}]]; | ||
return [4 /*yield*/, Promise.all(suites.map(function (s) { return limit(function () { return suiteResult(s); }); }))]; | ||
case 1: | ||
jsonResults = (_c[_a] = tslib_1.__spreadArray.apply(void 0, _b.concat([_d.sent()])), | ||
_c); | ||
return [2 /*return*/, jsonResults]; | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }; | ||
var saveJunitReport = function (junitReport, path) { | ||
var resolvedPath = resolvePath(path ? path : './test-results', 'xml'); | ||
ensureDirectoryExistence(resolvedPath); | ||
fs.writeFileSync(resolvedPath, junitReport); | ||
}; | ||
var handleJunitFailed = function (errMsg) { | ||
console.log("Failed to generate JUnit report" + (errMsg ? ": " + errMsg : '')); | ||
}; | ||
var ensureDirectoryExistence = function (filePath) { | ||
@@ -118,28 +101,25 @@ var dirname = path.dirname(filePath); | ||
}; | ||
var toFailedJUnitFlowRunReport = function (flowRun) { | ||
var errs = toFailedFlowRunReport(flowRun, function (check, operation, value, actual) { | ||
var text = ''; | ||
if (actual != null) { | ||
text += "Expected: " + check + " " + operation + " " + (value != null ? value : '') + " "; | ||
text += "Actual: " + (actual !== 'null' ? actual : 'null') + " "; | ||
} | ||
return text; | ||
}); | ||
return errs.map(function (e) { return ({ | ||
'failure': [{ | ||
_attr: { | ||
message: e.desc + " " + (e.ass ? e.ass : ''), | ||
type: 'ERROR' | ||
} | ||
}] | ||
}); }); | ||
}; | ||
// TODO this all flow should come from @loadmill package | ||
var toFailedFlowRunReport = function (flowRun, formater) { | ||
var errs = []; | ||
var _a = flowRun.result, resolvedRequests = _a.resolvedRequests, failures = _a.failures, err = _a.err; | ||
var result = flowRun.result, redactableResult = flowRun.redactableResult; | ||
if (result.flow) { | ||
var flow = result.flow, afterEach = result.afterEach; | ||
appendFlowRunFailures(errs, formater, flow, redactableResult.flow); | ||
if (afterEach) { | ||
appendFlowRunFailures(errs, formater, afterEach, redactableResult.afterEach, flow.resolvedRequests.length); | ||
} | ||
} | ||
else { | ||
appendFlowRunFailures(errs, formater, result, redactableResult); | ||
} | ||
return errs; | ||
}; | ||
var appendFlowRunFailures = function (errs, formater, result, redactableResult, offset) { | ||
if (offset === void 0) { offset = 0; } | ||
var _a = result, resolvedRequests = _a.resolvedRequests, failures = _a.failures, err = _a.err; | ||
if (Array.isArray(resolvedRequests) && resolvedRequests.length > 0) { | ||
resolvedRequests.map(function (req, i) { | ||
var description = req.description, method = req.method, url = req.url, _a = req.assert, assert = _a === void 0 ? [] : _a; | ||
var postParameters = flowRun.redactableResult && flowRun.redactableResult[i].postParameters; | ||
var postParameters = redactableResult && redactableResult[i].postParameters; | ||
var reqFailures = failures && failures[i]; | ||
@@ -150,3 +130,3 @@ var numSuccesses = 1; | ||
if (numFailures > 0) { | ||
var flowFailedText_1 = genReqDesc(i) + " " + (description ? genReqDesc(i, description) : '') + " " + method + " " + url + " =>"; | ||
var flowFailedText_1 = genReqDesc(i + offset) + " " + (description ? genReqDesc(i + offset, description) : '') + " " + method + " " + url + " =>"; | ||
var assertionNames_1 = Object.keys(assert); | ||
@@ -157,2 +137,3 @@ var requestErrorNames = Object.keys(histogram).filter(function (name) { return !includes(assertionNames_1, name); }); | ||
}); | ||
errs.push(flowFailedText_1); | ||
var flatPostParameters_1 = flatMap(postParameters); | ||
@@ -166,9 +147,6 @@ var assertionItems = getItems(assertionNames_1, histogram, totalNumRequests); | ||
var assErr = generateAssertionName(assert[assertion.name], actual, formater); | ||
errs.push({ desc: flowFailedText_1, ass: assErr }); | ||
errs.push(assErr); | ||
} | ||
} | ||
}); | ||
if (isEmpty(errs)) { | ||
errs.push({ desc: flowFailedText_1 }); | ||
} | ||
} | ||
@@ -178,5 +156,4 @@ }); | ||
else if (err) { | ||
errs.push({ desc: typeof err === 'string' ? err : err.message }); | ||
errs.push(typeof err === 'string' ? err : err.message); | ||
} | ||
return errs; | ||
}; | ||
@@ -263,16 +240,14 @@ function generateAssertionName(_a, actual, formatAssertion) { | ||
function getFlowRunAPI(f) { | ||
var testingServer = "https://" + utils_1.TESTING_HOST; | ||
return testingServer + "/api/test-suites-runs/flows/" + f.id; | ||
} | ||
function getFlowRunWebURL(s, f) { | ||
var testingServer = "https://" + utils_1.TESTING_HOST; | ||
return testingServer + "/app/api-tests/test-suite-runs/" + s.id + "/flows/" + f.id; | ||
} | ||
var junitReportAPI = testingServer + "/api/reports/junit"; | ||
var toMochawesomeFailedFlow = function (flowRun) { | ||
var _a; | ||
var errs = toFailedFlowRunReport(flowRun, function (check, operation, value, actual) { | ||
var text = ''; | ||
if (actual != null) { | ||
text += "\n+ \"Expected: " + check + " " + operation + " " + (value != null ? value : '') + " "; | ||
text += "\n- \"Actual: " + (actual !== 'null' ? actual : 'null') + " "; | ||
text += "\n+ Expected: " + check + " " + operation + " " + (value != null ? value : '') + " "; | ||
text += "\n- Actual: " + (actual !== 'null' ? actual : 'null') + " "; | ||
} | ||
@@ -287,3 +262,3 @@ return text; | ||
"generatedMessage": false, | ||
"diff": ((_a = errs[0]) === null || _a === void 0 ? void 0 : _a.desc) + errs.reduce(function (acc, e) { return acc + " \n " + (e.ass ? "\n " + e.ass : ''); }, '') | ||
"diff": errs.join('\n') | ||
}; | ||
@@ -361,3 +336,3 @@ }; | ||
case 0: | ||
suites = !Array.isArray(testResult) ? (testResult.testSuitesRuns || [testResult]) : testResult; | ||
suites = testResult.testSuitesRuns || [testResult]; | ||
passedSuites = suites.filter(function (t) { return t.passed; }).length; | ||
@@ -418,5 +393,5 @@ failedSuites = suites.filter(function (t) { return !t.passed; }).length; | ||
var junitReport = function (testResult, token, path) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { | ||
var jsonResults, asXml, resolvedPath; | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
var reportId, _a; | ||
return tslib_1.__generator(this, function (_b) { | ||
switch (_b.label) { | ||
case 0: | ||
@@ -426,9 +401,15 @@ if (!testResult) { | ||
} | ||
return [4 /*yield*/, generateJunitJsonReport(testResult, token)]; | ||
console.log('Generating JUnit report...'); | ||
return [4 /*yield*/, generateJunitReport(testResult.id, testResult.type, token)]; | ||
case 1: | ||
jsonResults = _a.sent(); | ||
asXml = xml(jsonResults, { indent: ' ', declaration: true }); | ||
resolvedPath = resolvePath(path ? path : './test-results', 'xml'); | ||
ensureDirectoryExistence(resolvedPath); | ||
fs.writeFileSync(resolvedPath, asXml); | ||
reportId = _b.sent(); | ||
_a = reportId; | ||
if (!_a) return [3 /*break*/, 3]; | ||
return [4 /*yield*/, waitForAndSaveJunitReport(reportId, token, path)]; | ||
case 2: | ||
_a = (_b.sent()); | ||
_b.label = 3; | ||
case 3: | ||
_a; | ||
console.log('Finished generating JUnit report'); | ||
return [2 /*return*/]; | ||
@@ -435,0 +416,0 @@ } |
"use strict"; | ||
exports.__esModule = true; | ||
exports.TESTING_HOST = exports.getLogger = exports.Logger = exports.readRawParams = exports.toLoadmillParams = exports.isUUID = exports.isString = exports.isEmptyObj = exports.getJSONFilesInFolderRecursively = exports.filterLabels = exports.convertArrToLabelQueryParams = exports.convertStrToArr = exports.printTestSuitesRunsReport = exports.printFlowRunsReport = exports.getObjectAsString = void 0; | ||
exports.TESTING_HOST = exports.getLogger = exports.Logger = exports.sleep = exports.readRawParams = exports.toLoadmillParams = exports.isUUID = exports.isString = exports.isEmptyObj = exports.getJSONFilesInFolderRecursively = exports.filterLabels = exports.convertArrToLabelQueryParams = exports.convertStrToArr = exports.printTestSuitesRunsReport = exports.printFlowRunsReport = exports.getObjectAsString = void 0; | ||
var tslib_1 = require("tslib"); | ||
@@ -107,2 +107,13 @@ var fs = require("fs"); | ||
exports.readRawParams = readRawParams; | ||
var sleep = function (ms) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { | ||
return tslib_1.__generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, new Promise(function (r) { return setTimeout(r, ms); })]; | ||
case 1: | ||
_a.sent(); | ||
return [2 /*return*/]; | ||
} | ||
}); | ||
}); }; | ||
exports.sleep = sleep; | ||
var Logger = /** @class */ (function () { | ||
@@ -109,0 +120,0 @@ function Logger(verbose, colors) { |
{ | ||
"name": "loadmill", | ||
"version": "3.2.3", | ||
"version": "3.2.4", | ||
"description": "A node.js module for running load tests and functional tests on loadmill.com", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -176,7 +176,7 @@ import './polyfills' | ||
async function _junitReport(testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, path?: string) { | ||
async function _junitReport(testResult: Loadmill.TestResult, path?: string) { | ||
return createJunitReport(testResult, token, path); | ||
} | ||
async function _mochawesomeReport(testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, path?: string) { | ||
async function _mochawesomeReport(testResult: Loadmill.TestResult, path?: string) { | ||
return createMochawesomeReport(testResult, token, path); | ||
@@ -241,7 +241,7 @@ } | ||
async junitReport(testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, path?: string): Promise<void> { | ||
async junitReport(testResult: Loadmill.TestResult, path?: string): Promise<void> { | ||
return _junitReport(testResult, path); | ||
}, | ||
async mochawesomeReport(testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, path?: string): Promise<void> { | ||
async mochawesomeReport(testResult: Loadmill.TestResult, path?: string): Promise<void> { | ||
return _mochawesomeReport(testResult, path); | ||
@@ -386,3 +386,3 @@ }, | ||
id: string; | ||
type: string; | ||
type: TYPES; | ||
} | ||
@@ -389,0 +389,0 @@ export interface TestSuiteDef { |
import * as fs from "fs"; | ||
import * as path from "path"; | ||
import * as Loadmill from "./index"; | ||
import * as xml from "xml"; | ||
import * as superagent from 'superagent'; | ||
@@ -14,72 +13,60 @@ const pLimit = require('p-limit'); | ||
import { TESTING_HOST } from './utils'; | ||
import { TESTING_HOST, sleep } from './utils'; | ||
const generateJunitJsonReport = async (testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, token: string) => { | ||
const testingServer = "https://" + TESTING_HOST; | ||
const flowResult = async (f: Loadmill.FlowRun) => { | ||
const url = getFlowRunAPI(f); | ||
const { body: flowRunDetails } = await superagent.get(url).auth(token, ''); | ||
const flowRun: any = { | ||
'testcase': [{ | ||
_attr: { | ||
name: f.description, | ||
status: f.status, | ||
time: ((+flowRunDetails.endTime - +flowRunDetails.startTime) || 0)/1000, | ||
} | ||
}] | ||
}; | ||
const POLLING_INTERVAL_MS = 5000; | ||
const MAX_POLLING = 36; // 3 minutes | ||
if (f.status === "FAILED") { | ||
flowRun.testcase.push(...toFailedJUnitFlowRunReport(flowRunDetails)); | ||
} | ||
return flowRun; | ||
const generateJunitReport = async ( | ||
testId: string, | ||
runType: Loadmill.TYPES, | ||
token: string | ||
): Promise<string | undefined> => { | ||
try { | ||
const { body: { junitReportId } } = await superagent.post(junitReportAPI) | ||
.send({ testId, runType }) | ||
.auth(token, ''); | ||
return junitReportId; | ||
} catch (err) { | ||
handleJunitFailed(err.message); | ||
} | ||
}; | ||
const suiteResult = async (suite: Loadmill.TestResult) => { | ||
const { flowRuns = [] } = suite; | ||
const failures = flowRuns.filter((f: any) => f.status !== 'PASSED').length; | ||
const limit = pLimit(3); | ||
const waitForAndSaveJunitReport = async (reportId: string, token: string, path?: string) => { | ||
let polling_count = 0; | ||
return { | ||
'testsuite': [{ | ||
_attr: { | ||
name: suite.description, | ||
errors: failures, | ||
failures, | ||
timestamp: (new Date()).toISOString().slice(0, -5), | ||
tests: flowRuns.length, | ||
url: suite.url | ||
} | ||
}, | ||
...await Promise.all(flowRuns.map(f => limit(() => flowResult(f)))) | ||
] | ||
}; | ||
} | ||
while (polling_count < MAX_POLLING) { | ||
try { | ||
const { body: { junitReport } } = await superagent.get(`${junitReportAPI}/${reportId}`) | ||
.auth(token, ''); | ||
let suites; | ||
if (!Array.isArray(testResult)) { | ||
if (Array.isArray(testResult.testSuitesRuns)) { // testplan | ||
suites = testResult.testSuitesRuns; | ||
saveJunitReport(junitReport, path); | ||
break; | ||
} | ||
else { | ||
suites = [testResult] // single run | ||
catch (err) { | ||
if (err.status !== 404) { | ||
handleJunitFailed(err.message); | ||
break; | ||
} | ||
} | ||
} else { | ||
suites = testResult; // multiple suites | ||
polling_count ++; | ||
await sleep(POLLING_INTERVAL_MS); | ||
} | ||
const limit = pLimit(3); | ||
if (polling_count === MAX_POLLING) { | ||
handleJunitFailed('Generating report took too long. Please contact support'); | ||
} | ||
}; | ||
let jsonResults = { | ||
'testsuites': [{ | ||
_attr: { | ||
name: 'Loadmill suites run', | ||
} | ||
}, | ||
...await Promise.all(suites.map(s => limit(() => suiteResult(s)))) | ||
] | ||
}; | ||
const saveJunitReport = (junitReport: string, path?: string) => { | ||
const resolvedPath = resolvePath(path ? path : './test-results', 'xml'); | ||
ensureDirectoryExistence(resolvedPath); | ||
fs.writeFileSync(resolvedPath, junitReport); | ||
}; | ||
return jsonResults | ||
const handleJunitFailed = (errMsg?) => { | ||
console.log(`Failed to generate JUnit report${errMsg ? `: ${errMsg}` : '' }`); | ||
}; | ||
@@ -103,32 +90,28 @@ | ||
const toFailedJUnitFlowRunReport = (flowRun) => { | ||
const errs = toFailedFlowRunReport(flowRun, (check, operation, value, actual) => { | ||
let text = ''; | ||
if (actual != null) { | ||
text += `Expected: ${check} ${operation} ${value != null ? value : ''} `; | ||
text += `Actual: ${actual !== 'null' ? actual : 'null'} `; | ||
// TODO this all flow should come from @loadmill package | ||
const toFailedFlowRunReport = (flowRun, formater) => { | ||
const errs: Array<string> = []; | ||
const { result, redactableResult } = flowRun; | ||
if (result.flow) { | ||
const { flow, afterEach } = result; | ||
appendFlowRunFailures(errs, formater, flow, redactableResult.flow); | ||
if (afterEach) { | ||
appendFlowRunFailures(errs, formater, afterEach, redactableResult.afterEach, flow.resolvedRequests.length); | ||
} | ||
return text; | ||
}); | ||
} | ||
else { | ||
appendFlowRunFailures(errs, formater, result, redactableResult); | ||
} | ||
return errs.map(e => ( | ||
{ | ||
'failure': [{ | ||
_attr: { | ||
message: `${e.desc} ${e.ass ? e.ass : ''}`, | ||
type: 'ERROR' | ||
} | ||
}] | ||
} | ||
)); | ||
return errs; | ||
}; | ||
// TODO this all flow should come from @loadmill package | ||
const toFailedFlowRunReport = (flowRun, formater) => { | ||
const errs: Array<any> = [] | ||
const { resolvedRequests, failures, err } = flowRun.result as any; | ||
const appendFlowRunFailures = (errs: string[], formater, result, redactableResult, offset: number = 0) => { | ||
const { resolvedRequests, failures, err } = result as any; | ||
if (Array.isArray(resolvedRequests) && resolvedRequests.length > 0) { | ||
resolvedRequests.map((req, i) => { | ||
const { description, method, url, assert = [] } = req; | ||
const postParameters = flowRun.redactableResult && flowRun.redactableResult[i].postParameters; | ||
const postParameters = redactableResult && redactableResult[i].postParameters; | ||
@@ -141,3 +124,3 @@ const reqFailures = failures && failures[i]; | ||
if (numFailures > 0) { | ||
let flowFailedText = `${genReqDesc(i)} ${description ? genReqDesc(i, description) : ''} ${method} ${url} =>`; | ||
let flowFailedText = `${genReqDesc(i + offset)} ${description ? genReqDesc(i + offset, description) : ''} ${method} ${url} =>`; | ||
@@ -153,2 +136,4 @@ const assertionNames = Object.keys(assert); | ||
errs.push(flowFailedText); | ||
const flatPostParameters = flatMap(postParameters); | ||
@@ -173,9 +158,6 @@ const assertionItems = getItems( | ||
); | ||
errs.push({ desc: flowFailedText, ass: assErr }); | ||
errs.push(assErr); | ||
} | ||
} | ||
}); | ||
if (isEmpty(errs)) { | ||
errs.push({ desc: flowFailedText }); | ||
} | ||
} | ||
@@ -185,5 +167,4 @@ }); | ||
else if (err) { | ||
errs.push({ desc: typeof err === 'string' ? err : err.message }) | ||
errs.push(typeof err === 'string' ? err : err.message) | ||
} | ||
return errs; | ||
}; | ||
@@ -281,3 +262,2 @@ | ||
function getFlowRunAPI(f: Loadmill.FlowRun) { | ||
const testingServer = "https://" + TESTING_HOST; | ||
return `${testingServer}/api/test-suites-runs/flows/${f.id}`; | ||
@@ -287,6 +267,7 @@ } | ||
function getFlowRunWebURL(s: Loadmill.TestResult, f: Loadmill.FlowRun) { | ||
const testingServer = "https://" + TESTING_HOST; | ||
return `${testingServer}/app/api-tests/test-suite-runs/${s.id}/flows/${f.id}`; | ||
} | ||
const junitReportAPI = `${testingServer}/api/reports/junit`; | ||
const toMochawesomeFailedFlow = (flowRun) => { | ||
@@ -297,4 +278,4 @@ | ||
if (actual != null) { | ||
text += `\n+ \"Expected: ${check} ${operation} ${value != null ? value : ''} `; | ||
text += `\n- \"Actual: ${actual !== 'null' ? actual : 'null'} `; | ||
text += `\n+ Expected: ${check} ${operation} ${value != null ? value : ''} `; | ||
text += `\n- Actual: ${actual !== 'null' ? actual : 'null'} `; | ||
} | ||
@@ -310,3 +291,3 @@ return text; | ||
"generatedMessage": false, | ||
"diff": errs[0]?.desc + errs.reduce((acc, e) => `${acc} \n ${e.ass ? `\n ${e.ass}` : ''}`, '') | ||
"diff": errs.join('\n') | ||
}; | ||
@@ -371,4 +352,4 @@ }; | ||
const generateMochawesomeReport = async (testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, token: string) => { | ||
const suites = !Array.isArray(testResult) ? (testResult.testSuitesRuns || [testResult]) : testResult; | ||
const generateMochawesomeReport = async (testResult: Loadmill.TestResult, token: string) => { | ||
const suites = testResult.testSuitesRuns || [testResult]; | ||
const passedSuites = suites.filter(t => t.passed).length; | ||
@@ -423,14 +404,13 @@ const failedSuites = suites.filter(t => !t.passed).length; | ||
export const junitReport = async (testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, token: string, path?: string) => { | ||
export const junitReport = async (testResult: Loadmill.TestResult, token: string, path?: string) => { | ||
if (!testResult) { | ||
return; | ||
} | ||
const jsonResults = await generateJunitJsonReport(testResult, token); | ||
const asXml = xml(jsonResults, { indent: ' ', declaration: true }); | ||
const resolvedPath = resolvePath(path ? path : './test-results', 'xml'); | ||
ensureDirectoryExistence(resolvedPath); | ||
fs.writeFileSync(resolvedPath, asXml); | ||
console.log('Generating JUnit report...'); | ||
const reportId = await generateJunitReport(testResult.id, testResult.type, token); | ||
reportId && await waitForAndSaveJunitReport(reportId, token, path); | ||
console.log('Finished generating JUnit report'); | ||
} | ||
export const mochawesomeReport = async (testResult: Loadmill.TestResult | Array<Loadmill.TestResult>, token: string, path?: string) => { | ||
export const mochawesomeReport = async (testResult: Loadmill.TestResult, token: string, path?: string) => { | ||
if (!testResult) { | ||
@@ -451,2 +431,1 @@ return; | ||
} | ||
@@ -110,2 +110,6 @@ import * as fs from "fs"; | ||
export const sleep = async (ms: number) => { | ||
await new Promise(r => setTimeout(r, ms)); | ||
}; | ||
export class Logger { | ||
@@ -112,0 +116,0 @@ private readonly verb: boolean = false; |
142295
2822