testcafe-reporter-nunit3
Version:
NUnit 3 TestCafe reporter plugin that supports screenshot attachments.
124 lines • 5.75 kB
JavaScript
"use strict";
var fs_1 = require("fs");
var Handlebars = require("handlebars");
var path = require("path");
var template = Handlebars.compile((0, fs_1.readFileSync)(path.join(__dirname, 'template.handlebars'), 'utf-8'));
var TaskData = (function () {
function TaskData(startTime) {
this.startTime = startTime;
this.fixtures = [];
}
TaskData.prototype.handleFixtureStart = function (name, path, meta) {
this.currentFixture = new FixtureData(name, path, meta);
this.fixtures.push(this.currentFixture);
};
TaskData.prototype.handleTestStart = function (name, meta) { };
TaskData.prototype.handleTestDone = function (name, testRunInfo, meta, formattedErrorMessage) {
if (formattedErrorMessage === void 0) { formattedErrorMessage = ''; }
this.currentFixture.endTime = new Date().toISOString();
this.currentFixture.testCases.push(new TestCaseData(name, testRunInfo, meta, formattedErrorMessage));
};
TaskData.prototype.handleTaskDone = function (endTime, passed, warnings, result) {
this.endTime = endTime;
};
return TaskData;
}());
var FixtureData = (function () {
function FixtureData(name, path, meta) {
this.name = name;
this.path = path;
this.meta = meta;
this.startTime = new Date().toISOString();
this.testCases = [];
this.hasMetadata = this.meta && Object.keys(this.meta).length > 0;
}
return FixtureData;
}());
var TestCaseData = (function () {
function TestCaseData(name, testRunInfo, meta, formattedErrorMessage) {
var _a;
this.name = name;
this.testRunInfo = testRunInfo;
this.meta = meta;
this.formattedErrorMessage = formattedErrorMessage;
this.result = testRunInfo.skipped ? 'Skipped' : testRunInfo.errs.length > 0 ? 'Failed' : testRunInfo.unstable ? 'Inconclusive' : 'Passed';
this.errorMessage = this.formattedErrorMessage.replace(/[\s\u2800]*Browser.*?([\n\u2800]*❌|$)/gs, function ($0, $1) { return $1; });
if (testRunInfo.screenshots) {
this.attachmentPaths = testRunInfo.screenshots.map(function (screenshot) { return screenshot.screenshotPath; });
}
if (testRunInfo.videos) {
this.attachmentPaths = ((_a = this.attachmentPaths) !== null && _a !== void 0 ? _a : []).concat(testRunInfo.videos.map(function (video) { return video.videoPath; }));
}
if (testRunInfo.quarantine && Object.entries(testRunInfo.quarantine).length > 1) {
if (this.errorMessage) {
this.errorMessage += '\n\n';
}
this.errorMessage += Object.entries(testRunInfo.quarantine)
.map(function (_a) {
var runNumber = _a[0], passedObject = _a[1];
return "Run ".concat(runNumber, ": ").concat(passedObject.passed ? 'Passed' : 'Failed');
})
.join('\n');
}
if (testRunInfo.warnings && testRunInfo.warnings.length > 0) {
this.formattedErrorMessage += '\n' + testRunInfo.warnings.join('\n');
}
this.duration = testRunInfo.durationMs / 1000;
this.hasFailureData = !!this.errorMessage || !!this.formattedErrorMessage;
this.hasMetadata = this.meta && Object.keys(this.meta).length > 0;
}
return TestCaseData;
}());
module.exports = function () {
return {
noColors: true,
taskData: null,
cleanupPrematureExit: null,
addFailedCompletionCheck: function () {
var completionCheckName = 'TEST RAN TO COMPLETION CHECK';
this.taskData.handleTestStart(completionCheckName, {});
this.taskData.handleTestDone(completionCheckName, {
durationMs: 0,
errs: [{}],
quarantine: [],
screenshotPath: '',
skipped: false,
unstable: false,
warnings: [],
}, {}, 'Process exited prior to all tests finishing.');
},
writeAllData: function () {
this.write(template(this.taskData));
},
reportTaskStart: function (startTime, userAgents, testCount) {
var _this = this;
this.taskData = new TaskData(startTime.toISOString());
this.cleanupPrematureExit = function () {
_this.addFailedCompletionCheck();
_this.writeAllData();
};
process.on('exit', this.cleanupPrematureExit);
},
reportFixtureStart: function (name, path, meta) {
this.taskData.handleFixtureStart(this.escapeHtml(name), path, meta);
},
reportTestStart: function (name, meta) {
this.taskData.handleTestStart(name, meta);
},
reportTestDone: function (name, testRunInfo, meta) {
var _this = this;
var errorDetails = testRunInfo.errs.map(function (err) { return _this.formatError(err, '❌ '); }).join('\n\n') || '';
var withoutScreenshot = errorDetails.replace(/^\s*Screenshot:.*\n?$/gm, '');
var u2800SpacingHack = withoutScreenshot
.replace(/^[^\S\r\n][^\S\r\n]([\s\d>]+\|)/gm, function ($0, $1, $2) { return '\u2800' + $1; })
.replace(/\n\n/g, '\n\u2800\n');
this.taskData.handleTestDone(this.escapeHtml(name), testRunInfo, meta, u2800SpacingHack);
},
reportTaskDone: function (endTime, passed, warnings, result) {
this.taskData.handleTaskDone(endTime.toISOString(), passed, warnings, result);
process.off('exit', this.cleanupPrematureExit);
this.writeAllData();
},
};
};
//# sourceMappingURL=index.js.map