creevey
Version:
creevey is a tool for automated visual testing, that tightly integrated with storybook
95 lines (75 loc) • 11.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = master;
var _path = _interopRequireDefault(require("path"));
var _cluster = _interopRequireDefault(require("cluster"));
var _fs = require("fs");
var _util = require("util");
var _types = require("../../types");
var _stories = require("../../stories");
var _runner = _interopRequireDefault(require("./runner"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const copyFileAsync = (0, _util.promisify)(_fs.copyFile);
const readdirAsync = (0, _util.promisify)(_fs.readdir);
const mkdirAsync = (0, _util.promisify)(_fs.mkdir);
function reportDataModule(data) {
return `
(function (root, factory) {
if (typeof module === 'object' && module.exports) {
module.exports = factory();
} else {
root.__CREEVEY_DATA__ = factory();
}
}(this, function () { return ${JSON.stringify(data)} }));
`;
}
function mergeTests(testsWithReports, testsFromStories) {
Object.values(testsFromStories).filter(_types.isDefined).forEach(test => {
const testWithReport = testsWithReports[test.id];
if (!testWithReport) return;
test.retries = testWithReport.retries;
if (testWithReport.status == 'success' || testWithReport.status == 'failed') test.status = testWithReport.status;
test.results = testWithReport.results;
test.approved = testWithReport.approved;
});
return testsFromStories;
}
async function copyStatics(reportDir) {
const clientDir = _path.default.join(__dirname, '../../client');
const files = (await readdirAsync(clientDir, {
withFileTypes: true
})).filter(dirent => dirent.isFile() && !dirent.name.endsWith('.d.ts')).map(dirent => dirent.name);
await mkdirAsync(reportDir, {
recursive: true
});
for (const file of files) {
await copyFileAsync(_path.default.join(clientDir, file), _path.default.join(reportDir, file));
}
}
async function master(config) {
const runner = new _runner.default(config, {});
const reportDataPath = _path.default.join(config.reportDir, 'data.js');
let testsFromReport = {};
try {
testsFromReport = require(reportDataPath);
} catch (error) {// Ignore error
}
const tests = await (0, _stories.loadTestsFromStories)(config, Object.keys(config.browsers), testsDiff => runner.updateTests(testsDiff));
runner.updateTests(mergeTests(testsFromReport, tests));
await runner.init();
await copyStatics(config.reportDir);
process.on('SIGINT', () => {
if (runner.isRunning) {
// TODO Better handle stop
Promise.race([new Promise(resolve => setTimeout(resolve, 10000)), new Promise(resolve => runner.once('stop', resolve))]).then(() => _cluster.default.disconnect(() => process.exit(0)));
runner.stop();
} else {
_cluster.default.disconnect(() => process.exit(0));
}
});
process.on('exit', () => (0, _fs.writeFileSync)(reportDataPath, reportDataModule(runner.status.tests)));
return runner;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvbWFzdGVyL21hc3Rlci50cyJdLCJuYW1lcyI6WyJjb3B5RmlsZUFzeW5jIiwiY29weUZpbGUiLCJyZWFkZGlyQXN5bmMiLCJyZWFkZGlyIiwibWtkaXJBc3luYyIsIm1rZGlyIiwicmVwb3J0RGF0YU1vZHVsZSIsImRhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwibWVyZ2VUZXN0cyIsInRlc3RzV2l0aFJlcG9ydHMiLCJ0ZXN0c0Zyb21TdG9yaWVzIiwiT2JqZWN0IiwidmFsdWVzIiwiZmlsdGVyIiwiaXNEZWZpbmVkIiwiZm9yRWFjaCIsInRlc3QiLCJ0ZXN0V2l0aFJlcG9ydCIsImlkIiwicmV0cmllcyIsInN0YXR1cyIsInJlc3VsdHMiLCJhcHByb3ZlZCIsImNvcHlTdGF0aWNzIiwicmVwb3J0RGlyIiwiY2xpZW50RGlyIiwicGF0aCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJmaWxlcyIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJpc0ZpbGUiLCJuYW1lIiwiZW5kc1dpdGgiLCJtYXAiLCJyZWN1cnNpdmUiLCJmaWxlIiwibWFzdGVyIiwiY29uZmlnIiwicnVubmVyIiwiUnVubmVyIiwicmVwb3J0RGF0YVBhdGgiLCJ0ZXN0c0Zyb21SZXBvcnQiLCJyZXF1aXJlIiwiZXJyb3IiLCJ0ZXN0cyIsImtleXMiLCJicm93c2VycyIsInRlc3RzRGlmZiIsInVwZGF0ZVRlc3RzIiwiaW5pdCIsInByb2Nlc3MiLCJvbiIsImlzUnVubmluZyIsIlByb21pc2UiLCJyYWNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJvbmNlIiwidGhlbiIsImNsdXN0ZXIiLCJkaXNjb25uZWN0IiwiZXhpdCIsInN0b3AiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLGFBQWEsR0FBRyxxQkFBVUMsWUFBVixDQUF0QjtBQUNBLE1BQU1DLFlBQVksR0FBRyxx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LENBQTdCO0FBRUEsUUFBTU4sTUFBTSxDQUFDVyxJQUFQLEVBQU47QUFDQSxRQUFNNUIsV0FBVyxDQUFDZ0IsTUFBTSxDQUFDZixTQUFSLENBQWpCO0FBRUE0QixFQUFBQSxPQUFPLENBQUNDLEVBQVIsQ0FBVyxRQUFYLEVBQXFCLE1BQU07QUFDekIsUUFBSWIsTUFBTSxDQUFDYyxTQUFYLEVBQXNCO0FBQ3BCO0FBQ0FDLE1BQUFBLE9BQU8sQ0FBQ0MsSUFBUixDQUFhLENBQ1gsSUFBSUQsT0FBSixDQUFhRSxPQUFELElBQWFDLFVBQVUsQ0FBQ0QsT0FBRCxFQUFVLEtBQVYsQ0FBbkMsQ0FEVyxFQUVYLElBQUlGLE9BQUosQ0FBYUUsT0FBRCxJQUFhakIsTUFBTSxDQUFDbUIsSUFBUCxDQUFZLE1BQVosRUFBb0JGLE9BQXBCLENBQXpCLENBRlcsQ0FBYixFQUdHRyxJQUhILENBR1EsTUFBTUMsaUJBQVFDLFVBQVIsQ0FBbUIsTUFBTVYsT0FBTyxDQUFDVyxJQUFSLENBQWEsQ0FBYixDQUF6QixDQUhkO0FBSUF2QixNQUFBQSxNQUFNLENBQUN3QixJQUFQO0FBQ0QsS0FQRCxNQU9PO0FBQ0xILHVCQUFRQyxVQUFSLENBQW1CLE1BQU1WLE9BQU8sQ0FBQ1csSUFBUixDQUFhLENBQWIsQ0FBekI7QUFDRDtBQUNGLEdBWEQ7QUFZQVgsRUFBQUEsT0FBTyxDQUFDQyxFQUFSLENBQVcsTUFBWCxFQUFtQixNQUFNLHVCQUFjWCxjQUFkLEVBQThCdEMsZ0JBQWdCLENBQUNvQyxNQUFNLENBQUNwQixNQUFQLENBQWMwQixLQUFmLENBQTlDLENBQXpCO0FBRUEsU0FBT04sTUFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgY2x1c3RlciBmcm9tICdjbHVzdGVyJztcbmltcG9ydCB7IHdyaXRlRmlsZVN5bmMsIGNvcHlGaWxlLCByZWFkZGlyLCBta2RpciB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgQ29uZmlnLCBUZXN0LCBpc0RlZmluZWQsIFNlcnZlclRlc3QgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBsb2FkVGVzdHNGcm9tU3RvcmllcyB9IGZyb20gJy4uLy4uL3N0b3JpZXMnO1xuaW1wb3J0IFJ1bm5lciBmcm9tICcuL3J1bm5lcic7XG5cbmNvbnN0IGNvcHlGaWxlQXN5bmMgPSBwcm9taXNpZnkoY29weUZpbGUpO1xuY29uc3QgcmVhZGRpckFzeW5jID0gcHJvbWlzaWZ5KHJlYWRkaXIpO1xuY29uc3QgbWtkaXJBc3luYyA9IHByb21pc2lmeShta2Rpcik7XG5cbmZ1bmN0aW9uIHJlcG9ydERhdGFNb2R1bGU8VD4oZGF0YTogVCk6IHN0cmluZyB7XG4gIHJldHVybiBgXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fX0NSRUVWRVlfREFUQV9fID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHsgcmV0dXJuICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9IH0pKTtcbmA7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVGVzdHMoXG4gIHRlc3RzV2l0aFJlcG9ydHM6IFBhcnRpYWw8eyBbaWQ6IHN0cmluZ106IFRlc3QgfT4sXG4gIHRlc3RzRnJvbVN0b3JpZXM6IFBhcnRpYWw8eyBbaWQ6IHN0cmluZ106IFNlcnZlclRlc3QgfT4sXG4pOiBQYXJ0aWFsPHsgW2lkOiBzdHJpbmddOiBTZXJ2ZXJUZXN0IH0+IHtcbiAgT2JqZWN0LnZhbHVlcyh0ZXN0c0Zyb21TdG9yaWVzKVxuICAgIC5maWx0ZXIoaXNEZWZpbmVkKVxuICAgIC5mb3JFYWNoKCh0ZXN0KSA9PiB7XG4gICAgICBjb25zdCB0ZXN0V2l0aFJlcG9ydCA9IHRlc3RzV2l0aFJlcG9ydHNbdGVzdC5pZF07XG4gICAgICBpZiAoIXRlc3RXaXRoUmVwb3J0KSByZXR1cm47XG4gICAgICB0ZXN0LnJldHJpZXMgPSB0ZXN0V2l0aFJlcG9ydC5yZXRyaWVzO1xuICAgICAgaWYgKHRlc3RXaXRoUmVwb3J0LnN0YXR1cyA9PSAnc3VjY2VzcycgfHwgdGVzdFdpdGhSZXBvcnQuc3RhdHVzID09ICdmYWlsZWQnKSB0ZXN0LnN0YXR1cyA9IHRlc3RXaXRoUmVwb3J0LnN0YXR1cztcbiAgICAgIHRlc3QucmVzdWx0cyA9IHRlc3RXaXRoUmVwb3J0LnJlc3VsdHM7XG4gICAgICB0ZXN0LmFwcHJvdmVkID0gdGVzdFdpdGhSZXBvcnQuYXBwcm92ZWQ7XG4gICAgfSk7XG4gIHJldHVybiB0ZXN0c0Zyb21TdG9yaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5U3RhdGljcyhyZXBvcnREaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjbGllbnREaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vY2xpZW50Jyk7XG4gIGNvbnN0IGZpbGVzID0gKGF3YWl0IHJlYWRkaXJBc3luYyhjbGllbnREaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSlcbiAgICAuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJykpXG4gICAgLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSk7XG4gIGF3YWl0IG1rZGlyQXN5bmMocmVwb3J0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgYXdhaXQgY29weUZpbGVBc3luYyhwYXRoLmpvaW4oY2xpZW50RGlyLCBmaWxlKSwgcGF0aC5qb2luKHJlcG9ydERpciwgZmlsZSkpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIG1hc3Rlcihjb25maWc6IENvbmZpZyk6IFByb21pc2U8UnVubmVyPiB7XG4gIGNvbnN0IHJ1bm5lciA9IG5ldyBSdW5uZXIoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHJlcG9ydERhdGFQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5yZXBvcnREaXIsICdkYXRhLmpzJyk7XG4gIGxldCB0ZXN0c0Zyb21SZXBvcnQgPSB7fTtcbiAgdHJ5IHtcbiAgICB0ZXN0c0Zyb21SZXBvcnQgPSByZXF1aXJlKHJlcG9ydERhdGFQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBJZ25vcmUgZXJyb3JcbiAgfVxuICBjb25zdCB0ZXN0cyA9IGF3YWl0IGxvYWRUZXN0c0Zyb21TdG9yaWVzKGNvbmZpZywgT2JqZWN0LmtleXMoY29uZmlnLmJyb3dzZXJzKSwgKHRlc3RzRGlmZikgPT5cbiAgICBydW5uZXIudXBkYXRlVGVzdHModGVzdHNEaWZmKSxcbiAgKTtcblxuICBydW5uZXIudXBkYXRlVGVzdHMobWVyZ2VUZXN0cyh0ZXN0c0Zyb21SZXBvcnQsIHRlc3RzKSk7XG5cbiAgYXdhaXQgcnVubmVyLmluaXQoKTtcbiAgYXdhaXQgY29weVN0YXRpY3MoY29uZmlnLnJlcG9ydERpcik7XG5cbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGlmIChydW5uZXIuaXNSdW5uaW5nKSB7XG4gICAgICAvLyBUT0RPIEJldHRlciBoYW5kbGUgc3RvcFxuICAgICAgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwMDApKSxcbiAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHJ1bm5lci5vbmNlKCdzdG9wJywgcmVzb2x2ZSkpLFxuICAgICAgXSkudGhlbigoKSA9PiBjbHVzdGVyLmRpc2Nvbm5lY3QoKCkgPT4gcHJvY2Vzcy5leGl0KDApKSk7XG4gICAgICBydW5uZXIuc3RvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbHVzdGVyLmRpc2Nvbm5lY3QoKCkgPT4gcHJvY2Vzcy5leGl0KDApKTtcbiAgICB9XG4gIH0pO1xuICBwcm9jZXNzLm9uKCdleGl0JywgKCkgPT4gd3JpdGVGaWxlU3luYyhyZXBvcnREYXRhUGF0aCwgcmVwb3J0RGF0YU1vZHVsZShydW5uZXIuc3RhdHVzLnRlc3RzKSkpO1xuXG4gIHJldHVybiBydW5uZXI7XG59XG4iXX0=