UNPKG

macaca-reporter

Version:

Reporter for mocha and other frameworks.

79 lines (69 loc) 2.23 kB
'use strict'; const fs = require('fs'); const path = require('path'); const _ = require('lodash'); const moment = require('moment'); const { sync: mkdirp } = require('mkdirp'); function getJSONData(filePath) { const finalJsonPath = path.resolve(filePath, 'json-final.json'); return require(finalJsonPath); } function mergeStats(res, data) { const sumKeys = [ 'suites', 'tests', 'passes', 'pending', 'failures', 'other', 'skipped', 'duration', ]; // eslint-disable-next-line no-return-assign sumKeys.forEach(key => res[key] += data[key]); res.passPercent = Math.round(res.passes / (res.tests - res.pending) * 100); res.pendingPercent = Math.round(res.pending / res.tests * 100); res.hasOther = res.other > 0; res.hasSkipped = res.skipped > 0; res.start = moment(res.start) > moment(data.start) ? data.start : res.start; res.end = moment(res.end) < moment(data.end) ? data.end : res.end; } function mergeSuites(res, data) { res.suites = res.suites.concat(data.suites); } function mergeJSONData(options) { const { list: fileList, targetDir } = options; const resData = {}; fileList.forEach(filePath => { const data = getJSONData(filePath); const clone = _.cloneDeep(data); if (_.isEmpty(resData)) { _.merge(resData, clone); } else { mergeStats(resData.stats, clone.stats); mergeSuites(resData.suites, clone.suites); } }); const targetFilePath = path.resolve(targetDir, 'json-final.json'); fs.writeFileSync(targetFilePath, JSON.stringify(resData)); } function mergeStaticsFiles(options) { const { list: fileList, targetDir } = options; const targetStaticDir = path.resolve(targetDir, 'screenshots'); mkdirp(targetStaticDir); fileList.forEach(filePath => { const staticDir = path.resolve(filePath, 'screenshots'); const files = fs.readdirSync(staticDir); files.forEach(file => { const src = path.resolve(staticDir, file); const dest = path.resolve(targetStaticDir, file); fs.copyFileSync(src, dest); }); }); } module.exports = async (options = {}) => { const { targetDir } = options; mkdirp(targetDir); await mergeJSONData(options); await mergeStaticsFiles(options); };