forked from Ivasoft/mattermost-mobile
149 lines
4.7 KiB
JavaScript
149 lines
4.7 KiB
JavaScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
/* eslint-disable no-console */
|
|
|
|
const fse = require('fs-extra');
|
|
const glob = require('glob');
|
|
const processor = require('jest-stare');
|
|
|
|
function flatten(items) {
|
|
return items.reduce((acc, arr) => {
|
|
return [...acc, ...arr];
|
|
}, []);
|
|
}
|
|
|
|
function flatMap(fn) {
|
|
return (items) => {
|
|
return flatten(items.map(fn));
|
|
};
|
|
}
|
|
|
|
const collectSourceFiles = flatMap((pattern) => {
|
|
const files = glob.sync(pattern);
|
|
if (!files.length) {
|
|
throw new Error(`Pattern ${pattern} matched no report files`);
|
|
}
|
|
return files;
|
|
});
|
|
|
|
function collectReportFiles(files) {
|
|
return Promise.all(files.map((filename) => {
|
|
return fse.readJson(filename);
|
|
}));
|
|
}
|
|
|
|
function collectReportSuites(reports) {
|
|
let numFailedTestSuites = 0;
|
|
let numFailedTests = 0;
|
|
let numPassedTestSuites = 0;
|
|
let numPassedTests = 0;
|
|
let numPendingTestSuites = 0;
|
|
let numPendingTests = 0;
|
|
let numRuntimeErrorTestSuites = 0;
|
|
let numTodoTests = 0;
|
|
let numTotalTestSuites = 0;
|
|
let numTotalTests = 0;
|
|
let openHandles = [];
|
|
const snapshot = {
|
|
added: 0,
|
|
didUpdate: false,
|
|
failure: false,
|
|
filesAdded: 0,
|
|
filesRemoved: 0,
|
|
filesRemovedList: [],
|
|
filesUnmatched: 0,
|
|
filesUpdated: 0,
|
|
matched: 0,
|
|
total: 0,
|
|
unchecked: 0,
|
|
uncheckedKeysByFile: [],
|
|
unmatched: 0,
|
|
updated: 0,
|
|
};
|
|
let startTime = 0;
|
|
let success = true;
|
|
let testResults = [];
|
|
let wasInterrupted = false;
|
|
reports.forEach((report) => {
|
|
numFailedTestSuites += report.numFailedTestSuites;
|
|
numFailedTests += report.numFailedTests;
|
|
numPassedTestSuites += report.numPassedTestSuites;
|
|
numPassedTests += report.numPassedTests;
|
|
numPendingTestSuites += report.numPendingTestSuites;
|
|
numPendingTests += report.numPendingTests;
|
|
numRuntimeErrorTestSuites += report.numRuntimeErrorTestSuites;
|
|
numTodoTests += report.numTodoTests;
|
|
numTotalTestSuites += report.numTotalTestSuites;
|
|
numTotalTests += report.numTotalTests;
|
|
openHandles = openHandles.concat(report.openHandles);
|
|
snapshot.added += report.snapshot.added;
|
|
if (report.snapshot.didUpdate === true) {
|
|
snapshot.didUpdate = true;
|
|
}
|
|
if (report.snapshot.failure === true) {
|
|
snapshot.failure = true;
|
|
}
|
|
snapshot.filesAdded += report.snapshot.filesAdded;
|
|
snapshot.filesRemoved += report.snapshot.filesRemoved;
|
|
snapshot.filesRemovedList = snapshot.filesRemovedList.concat(report.snapshot.filesRemovedList);
|
|
snapshot.filesUnmatched += report.snapshot.filesUnmatched;
|
|
snapshot.filesUpdated += report.snapshot.filesUpdated;
|
|
snapshot.matched += report.snapshot.matched;
|
|
snapshot.total += report.snapshot.total;
|
|
snapshot.unchecked += report.snapshot.unchecked;
|
|
snapshot.uncheckedKeysByFile = snapshot.uncheckedKeysByFile.concat(report.snapshot.uncheckedKeysByFile);
|
|
snapshot.unmatched += report.snapshot.unmatched;
|
|
snapshot.updated += report.snapshot.updated;
|
|
if (startTime === 0) {
|
|
startTime = report.startTime;
|
|
} else if (report.startTime < startTime) {
|
|
startTime = report.startTime;
|
|
}
|
|
if (report.success === false) {
|
|
success = false;
|
|
}
|
|
testResults = testResults.concat(report.testResults);
|
|
if (report.wasInterrupted === true) {
|
|
wasInterrupted = true;
|
|
}
|
|
});
|
|
|
|
return {
|
|
numFailedTestSuites,
|
|
numFailedTests,
|
|
numPassedTestSuites,
|
|
numPassedTests,
|
|
numPendingTestSuites,
|
|
numPendingTests,
|
|
numRuntimeErrorTestSuites,
|
|
numTodoTests,
|
|
numTotalTestSuites,
|
|
numTotalTests,
|
|
openHandles,
|
|
snapshot,
|
|
startTime,
|
|
success,
|
|
testResults,
|
|
wasInterrupted,
|
|
};
|
|
}
|
|
|
|
function generateJestStareHtmlReport(outputDir, outputFile, inputFilePath) {
|
|
const suites = fse.readJsonSync(inputFilePath);
|
|
processor(suites, {log: false, resultDir: outputDir, resultHtml: outputFile, reportHeadline: 'Mobile App E2E with Detox and Jest'});
|
|
}
|
|
|
|
async function mergeJestStareJsonFiles(outputFilePath, inputFiles) {
|
|
const files = collectSourceFiles(inputFiles);
|
|
const reports = await collectReportFiles(files);
|
|
const suites = collectReportSuites(reports);
|
|
fse.writeJsonSync(outputFilePath, suites);
|
|
console.log('Successfully written:', outputFilePath);
|
|
}
|
|
|
|
module.exports = {
|
|
generateJestStareHtmlReport,
|
|
mergeJestStareJsonFiles,
|
|
};
|