UNPKG

protractor-flake

Version:

A wrapper for protractor to automatically re-run failed specs for a specific number of attempts

78 lines 3.3 kB
"use strict"; const child_process_1 = require("child_process"); const parsers_1 = require("./parsers"); const parse_options_1 = require("./parse-options"); const logger_1 = require("./logger"); function filterArgs(protractorArgs) { protractorArgs = protractorArgs.filter((arg) => !/^--(suite|specs)=/.test(arg)); ['--suite', '--specs'].forEach((item) => { let index = protractorArgs.indexOf(item); if (index !== -1) { protractorArgs.splice(index, 2); } }); return protractorArgs; } function noop(status, output) { } function flake(options = {}, callback = noop) { let testAttempt = 1; let parsedOptions = parse_options_1.default(options); let parser = parsers_1.getParser(parsedOptions.parser); let logger = new logger_1.default(parsedOptions.color); function handleTestEnd(status, output = '') { if (status === 0) { callback(status, output); } else { if (++testAttempt <= parsedOptions.maxAttempts) { logger.log('info', `\nUsing ${parser.name} to parse output\n`); let failedSpecs = parser.parse(output); logger.log('info', `Re-running tests: test attempt ${testAttempt}\n`); if (parsedOptions.protractorRetryConfig) { logger.log('info', `Using provided protractorRetryConfig: ${parsedOptions.protractorRetryConfig}\n`); } if (failedSpecs.length === 0) { logger.log('info', '\nTests failed but no specs were found. All specs will be run again.\n\n'); } else { logger.log('info', 'Re-running the following test files:\n'); logger.log('info', failedSpecs.join('\n') + '\n'); } return startProtractor(failedSpecs, true); } callback(status, output); } } function startProtractor(specFiles = [], retry = false) { let output = ''; let protractorArgs = [parsedOptions.protractorPath].concat(parsedOptions.protractorArgs); protractorArgs.push('--params.flake.iteration', testAttempt.toString()); if (retry) { protractorArgs.push('--params.flake.retry', true.toString()); } if (specFiles.length) { protractorArgs = filterArgs(protractorArgs); protractorArgs.push('--specs', specFiles.join(',')); } if (parsedOptions.protractorRetryConfig && retry) { protractorArgs.push(parsedOptions.protractorRetryConfig); } let protractor = child_process_1.spawn(parsedOptions.nodeBin, protractorArgs, parsedOptions.protractorSpawnOptions); protractor.stdout.on('data', (buffer) => { let text = buffer.toString(); logger.protractor(text); output = output + text; }); protractor.stderr.on('data', (buffer) => { let text = buffer.toString(); logger.protractor(text); output = output + text; }); protractor.on('exit', function (status) { handleTestEnd(status, output); }); } startProtractor(); } module.exports = flake; //# sourceMappingURL=index.js.map