jest-html-reporter 2.6.2 → 2.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -75,6 +75,7 @@ Please note that all configuration properties are optional.
75
75
  | `sort` | `STRING` | Sorts the test results using the given method. Available sorting methods can be found in the [documentation](https://github.com/Hargne/jest-html-reporter/wiki/Sorting-Methods). | `"default"`
76
76
  | `statusIgnoreFilter` | `STRING` | A comma-separated string of the test result statuses that should be ignored when rendering the report. Available statuses are: `"passed"`, `"pending"`, `"failed"` | `null`
77
77
  | `boilerplate` | `STRING` | The path to a boilerplate file that should be used to render the body of the test results into. `{jesthtmlreporter-content}` within the boilerplate will be replaced with the test results | `null`
78
+ | `append` | `BOOLEAN` | If set to true, new test results will be appended to the existing test report | `false`
78
79
 
79
80
  > *The plugin will search for the *styleOverridePath* from the root directory, therefore there is no need to prepend the string with `./` or `../` - You can read more about the themes in the [documentation](https://github.com/Hargne/jest-html-reporter/wiki/Test-Report-Themes).
80
81
 
@@ -0,0 +1,373 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const dateformat_1 = __importDefault(require("dateformat"));
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const mkdirp_1 = __importDefault(require("mkdirp"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const strip_ansi_1 = __importDefault(require("strip-ansi"));
11
+ const xmlbuilder_1 = __importDefault(require("xmlbuilder"));
12
+ const sortingMethods_1 = require("./sortingMethods");
13
+ class HTMLReporter {
14
+ constructor(testData, options) {
15
+ this.testData = testData;
16
+ this.setupConfig(options);
17
+ }
18
+ async generate() {
19
+ const report = await this.renderTestReport();
20
+ const outputPath = this.getConfigValue("outputPath");
21
+ await mkdirp_1.default(path_1.default.dirname(outputPath));
22
+ await fs_1.default.writeFile(outputPath, report, writeFileError => {
23
+ if (writeFileError) {
24
+ throw new Error(`Something went wrong when creating the file: ${writeFileError}`);
25
+ }
26
+ });
27
+ this.logMessage("success", `Report generated (${outputPath})`);
28
+ }
29
+ async renderTestReport() {
30
+ try {
31
+ // Generate the content of the test report
32
+ const reportBody = await this.renderTestReportBody();
33
+ // --
34
+ // Boilerplate Option
35
+ if (!!this.getConfigValue("boilerplate")) {
36
+ const boilerplateContent = await this.getFileContent(this.getConfigValue("boilerplate"));
37
+ return boilerplateContent.replace("{jesthtmlreporter-content}", reportBody.toString());
38
+ }
39
+ // --
40
+ // Create HTML and apply reporter content
41
+ const HTMLBase = {
42
+ html: {
43
+ head: {
44
+ meta: { "@charset": "utf-8" },
45
+ title: { "#text": this.getConfigValue("pageTitle") },
46
+ style: undefined,
47
+ link: undefined
48
+ }
49
+ }
50
+ };
51
+ // Default to the currently set theme
52
+ let stylesheetFilePath = path_1.default.join(__dirname, `../style/${this.getConfigValue("theme")}.css`);
53
+ // Overriding stylesheet
54
+ if (this.getConfigValue("styleOverridePath")) {
55
+ stylesheetFilePath = this.getConfigValue("styleOverridePath");
56
+ }
57
+ // Decide whether to inline the CSS or not
58
+ const inlineCSS = !this.getConfigValue("useCssFile") &&
59
+ !!!this.getConfigValue("styleOverridePath");
60
+ if (inlineCSS) {
61
+ const stylesheetContent = await fs_1.default.readFileSync(stylesheetFilePath, "utf8");
62
+ HTMLBase.html.head.style = {
63
+ "@type": "text/css",
64
+ "#text": stylesheetContent
65
+ };
66
+ }
67
+ else {
68
+ HTMLBase.html.head.link = {
69
+ "@rel": "stylesheet",
70
+ "@type": "text/css",
71
+ "@href": stylesheetFilePath
72
+ };
73
+ }
74
+ const report = xmlbuilder_1.default.create(HTMLBase);
75
+ report.ele("body").raw(reportBody.toString());
76
+ return report;
77
+ }
78
+ catch (e) {
79
+ this.logMessage("error", e);
80
+ return;
81
+ }
82
+ }
83
+ async renderTestReportBody() {
84
+ try {
85
+ if (!this.testData) {
86
+ throw Error("No test data provided");
87
+ }
88
+ // HTML Body
89
+ const reportBody = xmlbuilder_1.default.begin().element("div", {
90
+ id: "jesthtml-content"
91
+ });
92
+ /**
93
+ * Page Header
94
+ */
95
+ const header = reportBody.ele("header");
96
+ // Page Title
97
+ header.ele("h1", { id: "title" }, this.getConfigValue("pageTitle"));
98
+ // Logo
99
+ const logo = this.getConfigValue("logo");
100
+ if (logo) {
101
+ header.ele("img", { id: "logo", src: logo });
102
+ }
103
+ /**
104
+ * Meta-Data
105
+ */
106
+ const metaDataContainer = reportBody.ele("div", {
107
+ id: "metadata-container"
108
+ });
109
+ // Timestamp
110
+ const timestamp = new Date(this.testData.startTime);
111
+ metaDataContainer.ele("div", { id: "timestamp" }, `Start: ${dateformat_1.default(timestamp.toDateString(), this.getConfigValue("dateFormat"))}`);
112
+ // Test Summary
113
+ metaDataContainer.ele("div", { id: "summary" }, `${this.testData.numTotalTests} tests -- ${this.testData.numPassedTests} passed / ${this.testData.numFailedTests} failed / ${this.testData.numPendingTests} pending`);
114
+ /**
115
+ * Apply any given sorting method to the test results
116
+ */
117
+ const sortedTestResults = sortingMethods_1.sortTestResults(this.testData.testResults, this.getConfigValue("sort"));
118
+ /**
119
+ * Setup ignored test result statuses
120
+ */
121
+ const statusIgnoreFilter = this.getConfigValue("statusIgnoreFilter");
122
+ let ignoredStatuses = [];
123
+ if (statusIgnoreFilter) {
124
+ ignoredStatuses = statusIgnoreFilter
125
+ .replace(/\s/g, "")
126
+ .toLowerCase()
127
+ .split(",");
128
+ }
129
+ /**
130
+ * Test Suites
131
+ */
132
+ sortedTestResults.map(suite => {
133
+ // Filter out the test results with statuses that equals the statusIgnoreFilter
134
+ for (const [i, result] of suite.testResults.entries()) {
135
+ if (ignoredStatuses.includes(result.status)) {
136
+ suite.testResults.splice(i, 1);
137
+ }
138
+ }
139
+ // Ignore this suite if there are no results
140
+ if (!suite.testResults || suite.testResults.length <= 0) {
141
+ return;
142
+ }
143
+ // Suite Information
144
+ const suiteInfo = reportBody.ele("div", { class: "suite-info" });
145
+ // Suite Path
146
+ suiteInfo.ele("div", { class: "suite-path" }, suite.testFilePath);
147
+ // Suite execution time
148
+ const executionTime = (suite.perfStats.end - suite.perfStats.start) / 1000;
149
+ suiteInfo.ele("div", { class: `suite-time${executionTime > 5 ? " warn" : ""}` }, `${executionTime}s`);
150
+ // Suite Test Table
151
+ const suiteTable = reportBody.ele("table", {
152
+ class: "suite-table",
153
+ cellspacing: "0",
154
+ cellpadding: "0"
155
+ });
156
+ // Test Results
157
+ suite.testResults.forEach(test => {
158
+ const testTr = suiteTable.ele("tr", { class: test.status });
159
+ // Suite Name(s)
160
+ testTr.ele("td", { class: "suite" }, test.ancestorTitles.join(" > "));
161
+ // Test name
162
+ const testTitleTd = testTr.ele("td", { class: "test" }, test.title);
163
+ // Test Failure Messages
164
+ if (test.failureMessages &&
165
+ this.getConfigValue("includeFailureMsg")) {
166
+ const failureMsgDiv = testTitleTd.ele("div", {
167
+ class: "failureMessages"
168
+ });
169
+ test.failureMessages.forEach(failureMsg => {
170
+ failureMsgDiv.ele("pre", { class: "failureMsg" }, strip_ansi_1.default(failureMsg));
171
+ });
172
+ }
173
+ // Append data to <tr>
174
+ testTr.ele("td", { class: "result" }, test.status === "passed"
175
+ ? `${test.status} in ${test.duration / 1000}s`
176
+ : test.status);
177
+ });
178
+ // All console.logs caught during the test run
179
+ if (this.consoleLogList &&
180
+ this.consoleLogList.length > 0 &&
181
+ this.getConfigValue("includeConsoleLog")) {
182
+ // Filter out the logs for this test file path
183
+ const filteredConsoleLogs = this.consoleLogList.find(logs => logs.filePath === suite.testFilePath);
184
+ if (filteredConsoleLogs && filteredConsoleLogs.logs.length > 0) {
185
+ // Console Log Container
186
+ const consoleLogContainer = reportBody.ele("div", {
187
+ class: "suite-consolelog"
188
+ });
189
+ // Console Log Header
190
+ consoleLogContainer.ele("div", { class: "suite-consolelog-header" }, "Console Log");
191
+ // Apply the logs to the body
192
+ filteredConsoleLogs.logs.forEach(log => {
193
+ const logElement = consoleLogContainer.ele("div", {
194
+ class: "suite-consolelog-item"
195
+ });
196
+ logElement.ele("pre", { class: "suite-consolelog-item-origin" }, strip_ansi_1.default(log.origin));
197
+ logElement.ele("pre", { class: "suite-consolelog-item-message" }, strip_ansi_1.default(log.message));
198
+ });
199
+ }
200
+ }
201
+ });
202
+ return reportBody;
203
+ }
204
+ catch (e) {
205
+ this.logMessage("error", e);
206
+ }
207
+ }
208
+ /**
209
+ * Fetch and setup configuration
210
+ */
211
+ setupConfig(options) {
212
+ this.config = {
213
+ append: {
214
+ defaultValue: false,
215
+ environmentVariable: "JEST_HTML_REPORTER_APPEND",
216
+ configValue: options.append
217
+ },
218
+ boilerplate: {
219
+ defaultValue: null,
220
+ environmentVariable: "JEST_HTML_REPORTER_BOILERPLATE",
221
+ configValue: options.boilerplate
222
+ },
223
+ customScriptPath: {
224
+ defaultValue: null,
225
+ environmentVariable: "JEST_HTML_REPORTER_CUSTOM_SCRIPT_PATH",
226
+ configValue: options.customScriptPath
227
+ },
228
+ dateFormat: {
229
+ defaultValue: "yyyy-mm-dd HH:MM:ss",
230
+ environmentVariable: "JEST_HTML_REPORTER_DATE_FORMAT",
231
+ configValue: options.dateFormat
232
+ },
233
+ executionTimeWarningThreshold: {
234
+ defaultValue: 5,
235
+ environmentVariable: "JEST_HTML_REPORTER_EXECUTION_TIME_WARNING_THRESHOLD",
236
+ configValue: options.executionTimeWarningThreshold
237
+ },
238
+ logo: {
239
+ defaultValue: null,
240
+ environmentVariable: "JEST_HTML_REPORTER_LOGO",
241
+ configValue: options.logo
242
+ },
243
+ includeFailureMsg: {
244
+ defaultValue: false,
245
+ environmentVariable: "JEST_HTML_REPORTER_INCLUDE_FAILURE_MSG",
246
+ configValue: options.includeFailureMsg
247
+ },
248
+ includeConsoleLog: {
249
+ defaultValue: false,
250
+ environmentVariable: "JEST_HTML_REPORTER_INCLUDE_CONSOLE_LOG",
251
+ configValue: options.includeConsoleLog
252
+ },
253
+ outputPath: {
254
+ defaultValue: path_1.default.join(process.cwd(), "test-report.html"),
255
+ environmentVariable: "JEST_HTML_REPORTER_OUTPUT_PATH",
256
+ configValue: options.outputPath
257
+ },
258
+ pageTitle: {
259
+ defaultValue: "Test Report",
260
+ environmentVariable: "JEST_HTML_REPORTER_PAGE_TITLE",
261
+ configValue: options.pageTitle
262
+ },
263
+ theme: {
264
+ defaultValue: "defaultTheme",
265
+ environmentVariable: "JEST_HTML_REPORTER_THEME",
266
+ configValue: options.theme
267
+ },
268
+ sort: {
269
+ defaultValue: null,
270
+ environmentVariable: "JEST_HTML_REPORTER_SORT",
271
+ configValue: options.sort
272
+ },
273
+ statusIgnoreFilter: {
274
+ defaultValue: null,
275
+ environmentVariable: "JEST_HTML_REPORTER_STATUS_FILTER",
276
+ configValue: options.statusIgnoreFilter
277
+ },
278
+ styleOverridePath: {
279
+ defaultValue: null,
280
+ environmentVariable: "JEST_HTML_REPORTER_STYLE_OVERRIDE_PATH",
281
+ configValue: options.styleOverridePath
282
+ },
283
+ useCssFile: {
284
+ defaultValue: false,
285
+ environmentVariable: "JEST_HTML_REPORTER_USE_CSS_FILE",
286
+ configValue: options.useCssFile
287
+ }
288
+ };
289
+ // Attempt to collect and assign config settings from jesthtmlreporter.config.json
290
+ try {
291
+ const jesthtmlreporterconfig = fs_1.default.readFileSync(path_1.default.join(process.cwd(), "jesthtmlreporter.config.json"), "utf8");
292
+ if (jesthtmlreporterconfig) {
293
+ const parsedConfig = JSON.parse(jesthtmlreporterconfig);
294
+ for (const key of Object.keys(parsedConfig)) {
295
+ if (this.config[key]) {
296
+ this.config[key].configValue =
297
+ parsedConfig[key];
298
+ }
299
+ }
300
+ return;
301
+ }
302
+ }
303
+ catch (e) {
304
+ /** do nothing */
305
+ }
306
+ // If above method did not work we attempt to check package.json
307
+ try {
308
+ const packageJson = fs_1.default.readFileSync(path_1.default.join(process.cwd(), "package.json"), "utf8");
309
+ if (packageJson) {
310
+ const parsedConfig = JSON.parse(packageJson)["jest-html-reporter"];
311
+ for (const key of Object.keys(parsedConfig)) {
312
+ if (this.config[key]) {
313
+ this.config[key].configValue =
314
+ parsedConfig[key];
315
+ }
316
+ }
317
+ }
318
+ }
319
+ catch (e) {
320
+ /** do nothing */
321
+ }
322
+ }
323
+ /**
324
+ * Returns the configurated value from the config in the following priority order:
325
+ * Environment Variable > JSON configured value > Default value
326
+ * @param key
327
+ */
328
+ getConfigValue(key) {
329
+ const option = this.config[key];
330
+ if (!option) {
331
+ return;
332
+ }
333
+ if (process.env[option.environmentVariable]) {
334
+ return process.env[option.environmentVariable];
335
+ }
336
+ return option.configValue || option.defaultValue;
337
+ }
338
+ async getFileContent(filePath) {
339
+ try {
340
+ fs_1.default.readFile(filePath, "utf8", (err, content) => {
341
+ if (err) {
342
+ throw Error(`Could not locate file: '${filePath}': ${err}`);
343
+ }
344
+ return content;
345
+ });
346
+ }
347
+ catch (e) {
348
+ this.logMessage("error", e);
349
+ return;
350
+ }
351
+ }
352
+ /**
353
+ * Method for logging to the terminal
354
+ * @param type
355
+ * @param message
356
+ * @param ignoreConsole
357
+ */
358
+ logMessage(type = "default", message, ignoreConsole) {
359
+ const logTypes = {
360
+ default: "\x1b[37m%s\x1b[0m",
361
+ success: "\x1b[32m%s\x1b[0m",
362
+ error: "\x1b[31m%s\x1b[0m"
363
+ };
364
+ const logColor = !logTypes[type] ? logTypes.default : logTypes[type];
365
+ const logMsg = `jest-html-reporter >> ${message}`;
366
+ if (!ignoreConsole) {
367
+ console.log(logColor, logMsg);
368
+ }
369
+ return { logColor, logMsg }; // Return for testing purposes
370
+ }
371
+ }
372
+ exports.default = HTMLReporter;
373
+ //# sourceMappingURL=htmlreporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"htmlreporter.js","sourceRoot":"","sources":["../src/htmlreporter.ts"],"names":[],"mappings":"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"}