UNPKG

creevey

Version:

creevey is a tool for automated visual testing, that tightly integrated with storybook

73 lines (56 loc) 17.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TeamcityReporter = exports.CreeveyReporter = void 0; var _chalk = _interopRequireDefault(require("chalk")); var _mocha = require("mocha"); var _types = require("../../types"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } class CreeveyReporter extends _mocha.reporters.Base { constructor(runner, options) { super(runner); // eslint-disable-next-line @typescript-eslint/ban-ts-ignore //@ts-ignore Should update @types/mocha for new major release https://github.com/mochajs/mocha/releases/tag/v7.0.0 const topLevelSuite = options.reporterOption.topLevelSuite; runner.on('test', test => console.log(`[${_chalk.default.yellow('START')}:${topLevelSuite}:${process.pid}]`, _chalk.default.cyan(test.titlePath().join('/')))); runner.on('pass', test => console.log(`[${_chalk.default.green('PASS')}:${topLevelSuite}:${process.pid}]`, _chalk.default.cyan(test.titlePath().join('/')))); runner.on('fail', (test, error) => console.log(`[${_chalk.default.red('FAIL')}:${topLevelSuite}:${process.pid}]`, _chalk.default.cyan(test.titlePath().join('/')), error instanceof Error ? error.stack || error.message : error)); } } exports.CreeveyReporter = CreeveyReporter; class TeamcityReporter extends _mocha.reporters.Base { constructor(runner, options) { super(runner); // eslint-disable-next-line @typescript-eslint/ban-ts-ignore //@ts-ignore Should update @types/mocha for new major release https://github.com/mochajs/mocha/releases/tag/v7.0.0 _defineProperty(this, "escape", str => { if (!str) return ''; return str.toString() // eslint-disable-next-line no-control-regex .replace(/\x1B.*?m/g, '').replace(/\|/g, '||').replace(/\n/g, '|n').replace(/\r/g, '|r').replace(/\[/g, '|[').replace(/\]/g, '|]').replace(/\u0085/g, '|x').replace(/\u2028/g, '|l').replace(/\u2029/g, '|p').replace(/'/g, "|'"); }); const topLevelSuite = this.escape(options.reporterOption.topLevelSuite); // eslint-disable-next-line @typescript-eslint/ban-ts-ignore //@ts-ignore Should update @types/mocha for new major release https://github.com/mochajs/mocha/releases/tag/v7.0.0 const { reportDir, willRetry, images } = options.reporterOption; runner.on('suite', suite => suite.root ? console.log(`##teamcity[testSuiteStarted name='${topLevelSuite}' flowId='${process.pid}']`) : console.log(`##teamcity[testSuiteStarted name='${this.escape(suite.title)}' flowId='${process.pid}']`)); runner.on('test', test => console.log(`##teamcity[testStarted name='${this.escape(test.title)}' flowId='${process.pid}']`)); runner.on('fail', (test, error) => { Object.entries(images()).forEach(([name, image]) => { if (!image) return; const filePath = test.titlePath().concat(name == topLevelSuite ? [] : [topLevelSuite]).map(this.escape).join('/'); Object.values(image).filter(_types.isDefined).forEach(fileName => (console.log(`##teamcity[publishArtifacts '${reportDir}/${filePath}/${fileName} => report/${filePath}']`), console.log(`##teamcity[testMetadata testName='${this.escape(test.title)}' type='image' value='report/${filePath}/${fileName}' flowId='${process.pid}']`))); }); // Output failed test as passed due TC don't support retry mechanic // https://teamcity-support.jetbrains.com/hc/en-us/community/posts/207216829-Count-test-as-successful-if-at-least-one-try-is-successful?page=1#community_comment_207394125 willRetry() ? console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`) : console.log(`##teamcity[testFailed name='${this.escape(test.title)}' message='${this.escape(error.message)}' details='${this.escape(error.stack)}' flowId='${process.pid}']`); }); runner.on('pending', test => console.log(`##teamcity[testIgnored name='${this.escape(test.title)}' message='${this.escape(typeof test.skipReason == 'boolean' ? test.title : test.skipReason)}' flowId='${process.pid}']`)); runner.on('test end', test => console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`)); runner.on('suite end', suite => suite.root || console.log(`##teamcity[testSuiteFinished name='${this.escape(suite.title)}' flowId='${process.pid}']`)); runner.on('end', () => console.log(`##teamcity[testSuiteFinished name='${topLevelSuite}' flowId='${process.pid}']`)); } } exports.TeamcityReporter = TeamcityReporter; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvd29ya2VyL3JlcG9ydGVyLnRzIl0sIm5hbWVzIjpbIkNyZWV2ZXlSZXBvcnRlciIsInJlcG9ydGVycyIsIkJhc2UiLCJjb25zdHJ1Y3RvciIsInJ1bm5lciIsIm9wdGlvbnMiLCJ0b3BMZXZlbFN1aXRlIiwicmVwb3J0ZXJPcHRpb24iLCJvbiIsInRlc3QiLCJjb25zb2xlIiwibG9nIiwiY2hhbGsiLCJ5ZWxsb3ciLCJwcm9jZXNzIiwicGlkIiwiY3lhbiIsInRpdGxlUGF0aCIsImpvaW4iLCJncmVlbiIsImVycm9yIiwicmVkIiwiRXJyb3IiLCJzdGFjayIsIm1lc3NhZ2UiLCJUZWFtY2l0eVJlcG9ydGVyIiwic3RyIiwidG9TdHJpbmciLCJyZXBsYWNlIiwiZXNjYXBlIiwicmVwb3J0RGlyIiwid2lsbFJldHJ5IiwiaW1hZ2VzIiwic3VpdGUiLCJyb290IiwidGl0bGUiLCJPYmplY3QiLCJlbnRyaWVzIiwiZm9yRWFjaCIsIm5hbWUiLCJpbWFnZSIsImZpbGVQYXRoIiwiY29uY2F0IiwibWFwIiwidmFsdWVzIiwiZmlsdGVyIiwiaXNEZWZpbmVkIiwiZmlsZU5hbWUiLCJza2lwUmVhc29uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVPLE1BQU1BLGVBQU4sU0FBOEJDLGlCQUFVQyxJQUF4QyxDQUE2QztBQUNsREMsRUFBQUEsV0FBVyxDQUFDQyxNQUFELEVBQWlCQyxPQUFqQixFQUF3QztBQUNqRCxVQUFNRCxNQUFOLEVBRGlELENBR2pEO0FBQ0E7O0FBQ0EsVUFBTUUsYUFBYSxHQUFHRCxPQUFPLENBQUNFLGNBQVIsQ0FBdUJELGFBQTdDO0FBRUFGLElBQUFBLE1BQU0sQ0FBQ0ksRUFBUCxDQUFVLE1BQVYsRUFBbUJDLElBQUQsSUFDaEJDLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLElBQUdDLGVBQU1DLE1BQU4sQ0FBYSxPQUFiLENBQXNCLElBQUdQLGFBQWMsSUFBR1EsT0FBTyxD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LGFBQWMsYUFBWVEsT0FBTyxDQUFDQyxHQUFJLElBQXhGLENBREY7QUFHRDs7QUFsRmtEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IFJ1bm5lciwgcmVwb3J0ZXJzLCBNb2NoYU9wdGlvbnMgfSBmcm9tICdtb2NoYSc7XG5pbXBvcnQgeyBJbWFnZXMsIGlzRGVmaW5lZCB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENyZWV2ZXlSZXBvcnRlciBleHRlbmRzIHJlcG9ydGVycy5CYXNlIHtcbiAgY29uc3RydWN0b3IocnVubmVyOiBSdW5uZXIsIG9wdGlvbnM6IE1vY2hhT3B0aW9ucykge1xuICAgIHN1cGVyKHJ1bm5lcik7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1pZ25vcmVcbiAgICAvL0B0cy1pZ25vcmUgU2hvdWxkIHVwZGF0ZSBAdHlwZXMvbW9jaGEgZm9yIG5ldyBtYWpvciByZWxlYXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb2NoYWpzL21vY2hhL3JlbGVhc2VzL3RhZy92Ny4wLjBcbiAgICBjb25zdCB0b3BMZXZlbFN1aXRlID0gb3B0aW9ucy5yZXBvcnRlck9wdGlvbi50b3BMZXZlbFN1aXRlO1xuXG4gICAgcnVubmVyLm9uKCd0ZXN0JywgKHRlc3QpID0+XG4gICAgICBjb25zb2xlLmxvZyhgWyR7Y2hhbGsueWVsbG93KCdTVEFSVCcpfToke3RvcExldmVsU3VpdGV9OiR7cHJvY2Vzcy5waWR9XWAsIGNoYWxrLmN5YW4odGVzdC50aXRsZVBhdGgoKS5qb2luKCcvJykpKSxcbiAgICApO1xuICAgIHJ1bm5lci5vbigncGFzcycsICh0ZXN0KSA9PlxuICAgICAgY29uc29sZS5sb2coYFske2NoYWxrLmdyZWVuKCdQQVNTJyl9OiR7dG9wTGV2ZWxTdWl0ZX06JHtwcm9jZXNzLnBpZH1dYCwgY2hhbGsuY3lhbih0ZXN0LnRpdGxlUGF0aCgpLmpvaW4oJy8nKSkpLFxuICAgICk7XG4gICAgcnVubmVyLm9uKCdmYWlsJywgKHRlc3QsIGVycm9yKSA9PlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBbJHtjaGFsay5yZWQoJ0ZBSUwnKX06JHt0b3BMZXZlbFN1aXRlfToke3Byb2Nlc3MucGlkfV1gLFxuICAgICAgICBjaGFsay5jeWFuKHRlc3QudGl0bGVQYXRoKCkuam9pbignLycpKSxcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIHx8IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICksXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGVhbWNpdHlSZXBvcnRlciBleHRlbmRzIHJlcG9ydGVycy5CYXNlIHtcbiAgY29uc3RydWN0b3IocnVubmVyOiBSdW5uZXIsIG9wdGlvbnM6IE1vY2hhT3B0aW9ucykge1xuICAgIHN1cGVyKHJ1bm5lcik7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1pZ25vcmVcbiAgICAvL0B0cy1pZ25vcmUgU2hvdWxkIHVwZGF0ZSBAdHlwZXMvbW9jaGEgZm9yIG5ldyBtYWpvciByZWxlYXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb2NoYWpzL21vY2hhL3JlbGVhc2VzL3RhZy92Ny4wLjBcbiAgICBjb25zdCB0b3BMZXZlbFN1aXRlID0gdGhpcy5lc2NhcGUob3B0aW9ucy5yZXBvcnRlck9wdGlvbi50b3BMZXZlbFN1aXRlKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1pZ25vcmVcbiAgICAvL0B0cy1pZ25vcmUgU2hvdWxkIHVwZGF0ZSBAdHlwZXMvbW9jaGEgZm9yIG5ldyBtYWpvciByZWxlYXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb2NoYWpzL21vY2hhL3JlbGVhc2VzL3RhZy92Ny4wLjBcbiAgICBjb25zdCB7IHJlcG9ydERpciwgd2lsbFJldHJ5LCBpbWFnZXMgfSA9IG9wdGlvbnMucmVwb3J0ZXJPcHRpb24gYXMge1xuICAgICAgcmVwb3J0RGlyOiBzdHJpbmc7XG4gICAgICB3aWxsUmV0cnk6ICgpID0+IGJvb2xlYW47XG4gICAgICBpbWFnZXM6ICgpID0+IFBhcnRpYWw8e1xuICAgICAgICBbbmFtZTogc3RyaW5nXTogUGFydGlhbDxJbWFnZXM+O1xuICAgICAgfT47XG4gICAgfTtcblxuICAgIHJ1bm5lci5vbignc3VpdGUnLCAoc3VpdGUpID0+XG4gICAgICBzdWl0ZS5yb290XG4gICAgICAgID8gY29uc29sZS5sb2coYCMjdGVhbWNpdHlbdGVzdFN1aXRlU3RhcnRlZCBuYW1lPScke3RvcExldmVsU3VpdGV9JyBmbG93SWQ9JyR7cHJvY2Vzcy5waWR9J11gKVxuICAgICAgICA6IGNvbnNvbGUubG9nKGAjI3RlYW1jaXR5W3Rlc3RTdWl0ZVN0YXJ0ZWQgbmFtZT0nJHt0aGlzLmVzY2FwZShzdWl0ZS50aXRsZSl9JyBmbG93SWQ9JyR7cHJvY2Vzcy5waWR9J11gKSxcbiAgICApO1xuXG4gICAgcnVubmVyLm9uKCd0ZXN0JywgKHRlc3QpID0+XG4gICAgICBjb25zb2xlLmxvZyhgIyN0ZWFtY2l0eVt0ZXN0U3RhcnRlZCBuYW1lPScke3RoaXMuZXNjYXBlKHRlc3QudGl0bGUpfScgZmxvd0lkPScke3Byb2Nlc3MucGlkfSddYCksXG4gICAgKTtcblxuICAgIHJ1bm5lci5vbignZmFpbCcsICh0ZXN0LCBlcnJvcikgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoaW1hZ2VzKCkpLmZvckVhY2goKFtuYW1lLCBpbWFnZV0pID0+IHtcbiAgICAgICAgaWYgKCFpbWFnZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHRlc3RcbiAgICAgICAgICAudGl0bGVQYXRoKClcbiAgICAgICAgICAuY29uY2F0KG5hbWUgPT0gdG9wTGV2ZWxTdWl0ZSA/IFtdIDogW3RvcExldmVsU3VpdGVdKVxuICAgICAgICAgIC5tYXAodGhpcy5lc2NhcGUpXG4gICAgICAgICAgLmpvaW4oJy8nKTtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhpbWFnZSlcbiAgICAgICAgICAuZmlsdGVyKGlzRGVmaW5lZClcbiAgICAgICAgICAuZm9yRWFjaChcbiAgICAgICAgICAgIChmaWxlTmFtZSkgPT4gKFxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgIyN0ZWFtY2l0eVtwdWJsaXNoQXJ0aWZhY3RzICcke3JlcG9ydERpcn0vJHtmaWxlUGF0aH0vJHtmaWxlTmFtZX0gPT4gcmVwb3J0LyR7ZmlsZVBhdGh9J11gKSxcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgYCMjdGVhbWNpdHlbdGVzdE1ldGFkYXRhIHRlc3ROYW1lPScke3RoaXMuZXNjYXBlKFxuICAgICAgICAgICAgICAgICAgdGVzdC50aXRsZSxcbiAgICAgICAgICAgICAgICApfScgdHlwZT0naW1hZ2UnIHZhbHVlPSdyZXBvcnQvJHtmaWxlUGF0aH0vJHtmaWxlTmFtZX0nIGZsb3dJZD0nJHtwcm9jZXNzLnBpZH0nXWAsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBPdXRwdXQgZmFpbGVkIHRlc3QgYXMgcGFzc2VkIGR1ZSBUQyBkb24ndCBzdXBwb3J0IHJldHJ5IG1lY2hhbmljXG4gICAgICAvLyBodHRwczovL3RlYW1jaXR5LXN1cHBvcnQuamV0YnJhaW5zLmNvbS9oYy9lbi11cy9jb21tdW5pdHkvcG9zdHMvMjA3MjE2ODI5LUNvdW50LXRlc3QtYXMtc3VjY2Vzc2Z1bC1pZi1hdC1sZWFzdC1vbmUtdHJ5LWlzLXN1Y2Nlc3NmdWw/cGFnZT0xI2NvbW11bml0eV9jb21tZW50XzIwNzM5NDEyNVxuICAgICAgd2lsbFJldHJ5KClcbiAgICAgICAgPyBjb25zb2xlLmxvZyhgIyN0ZWFtY2l0eVt0ZXN0RmluaXNoZWQgbmFtZT0nJHt0aGlzLmVzY2FwZSh0ZXN0LnRpdGxlKX0nIGZsb3dJZD0nJHtwcm9jZXNzLnBpZH0nXWApXG4gICAgICAgIDogY29uc29sZS5sb2coXG4gICAgICAgICAgICBgIyN0ZWFtY2l0eVt0ZXN0RmFpbGVkIG5hbWU9JyR7dGhpcy5lc2NhcGUodGVzdC50aXRsZSl9JyBtZXNzYWdlPScke3RoaXMuZXNjYXBlKFxuICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgKX0nIGRldGFpbHM9JyR7dGhpcy5lc2NhcGUoZXJyb3Iuc3RhY2spfScgZmxvd0lkPScke3Byb2Nlc3MucGlkfSddYCxcbiAgICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgcnVubmVyLm9uKCdwZW5kaW5nJywgKHRlc3QpID0+XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYCMjdGVhbWNpdHlbdGVzdElnbm9yZWQgbmFtZT0nJHt0aGlzLmVzY2FwZSh0ZXN0LnRpdGxlKX0nIG1lc3NhZ2U9JyR7dGhpcy5lc2NhcGUoXG4gICAgICAgICAgdHlwZW9mIHRlc3Quc2tpcFJlYXNvbiA9PSAnYm9vbGVhbicgPyB0ZXN0LnRpdGxlIDogdGVzdC5za2lwUmVhc29uLFxuICAgICAgICApfScgZmxvd0lkPScke3Byb2Nlc3MucGlkfSddYCxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJ1bm5lci5vbigndGVzdCBlbmQnLCAodGVzdCkgPT5cbiAgICAgIGNvbnNvbGUubG9nKGAjI3RlYW1jaXR5W3Rlc3RGaW5pc2hlZCBuYW1lPScke3RoaXMuZXNjYXBlKHRlc3QudGl0bGUpfScgZmxvd0lkPScke3Byb2Nlc3MucGlkfSddYCksXG4gICAgKTtcblxuICAgIHJ1bm5lci5vbihcbiAgICAgICdzdWl0ZSBlbmQnLFxuICAgICAgKHN1aXRlKSA9PlxuICAgICAgICBzdWl0ZS5yb290IHx8XG4gICAgICAgIGNvbnNvbGUubG9nKGAjI3RlYW1jaXR5W3Rlc3RTdWl0ZUZpbmlzaGVkIG5hbWU9JyR7dGhpcy5lc2NhcGUoc3VpdGUudGl0bGUpfScgZmxvd0lkPScke3Byb2Nlc3MucGlkfSddYCksXG4gICAgKTtcblxuICAgIHJ1bm5lci5vbignZW5kJywgKCkgPT5cbiAgICAgIGNvbnNvbGUubG9nKGAjI3RlYW1jaXR5W3Rlc3RTdWl0ZUZpbmlzaGVkIG5hbWU9JyR7dG9wTGV2ZWxTdWl0ZX0nIGZsb3dJZD0nJHtwcm9jZXNzLnBpZH0nXWApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGVzY2FwZSA9IChzdHI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgaWYgKCFzdHIpIHJldHVybiAnJztcbiAgICByZXR1cm4gKFxuICAgICAgc3RyXG4gICAgICAgIC50b1N0cmluZygpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgICAgIC5yZXBsYWNlKC9cXHgxQi4qP20vZywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9cXHwvZywgJ3x8JylcbiAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAnfG4nKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csICd8cicpXG4gICAgICAgIC5yZXBsYWNlKC9cXFsvZywgJ3xbJylcbiAgICAgICAgLnJlcGxhY2UoL1xcXS9nLCAnfF0nKVxuICAgICAgICAucmVwbGFjZSgvXFx1MDA4NS9nLCAnfHgnKVxuICAgICAgICAucmVwbGFjZSgvXFx1MjAyOC9nLCAnfGwnKVxuICAgICAgICAucmVwbGFjZSgvXFx1MjAyOS9nLCAnfHAnKVxuICAgICAgICAucmVwbGFjZSgvJy9nLCBcInwnXCIpXG4gICAgKTtcbiAgfTtcbn1cbiJdfQ==