UNPKG

just-api

Version:

Specification based API test framework for HTTP APIs (REST, GraphQL)

147 lines (111 loc) 4.63 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _events = require('events'); var _events2 = _interopRequireDefault(_events); var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs); var _child_process = require('child_process'); var childProcess = _interopRequireWildcard(_child_process); var _suite = require('./suite'); var _suite2 = _interopRequireDefault(_suite); var _utils = require('./utils'); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class Launcher extends _events2.default { constructor(specFiles, options) { super(); this.specs = specFiles.slice(0); this.options = options; this.pendingFiles = specFiles.slice(0); this.runningFiles = []; this.suiteOptions = {}; this.parallel = options.parallel; this.max_parallel = options.max_parallel; this.max_parallel_limit = options.max_parallel_limit; this.suiteOptions.grep = options.grep; this.reporterOptions = options.reporterOptions; this.results = []; this.setupReporters(options.reporters); } setupReporters(reporters) { if (!reporters) { console.error(`Reporters not set`); process.exit(1); } this.reporters = []; for (let Reporter of reporters) { try { let reporter = new Reporter(this, { parallel: this.parallel, reporterOptions: _extends({}, this.reporterOptions) }); this.reporters.push(reporter); } catch (err) { console.error(`Error occurred while initializing reporter: ${Reporter.name} \n ${err.stack}`); process.exit(1); } } } async go() { const self = this; this.emit('start', this.pendingFiles.slice(0)); if (self.parallel) { let parallelRuns; if (self.max_parallel >= self.pendingFiles.length) { parallelRuns = self.pendingFiles.length; } else { parallelRuns = self.max_parallel; } for (let run = 1; run <= parallelRuns; run++) { self.runNextSuite(self); } } else { for (let file of self.pendingFiles) { const suite = new _suite2.default(file, this.suiteOptions); this.emit('new suite', suite); await suite.launch(); let result = suite.result; result.status = suite.status; self.results.push(result); } this.exit(); } } runNextSuite(context) { let self = context; if (self.runningFiles.length === 0 && self.pendingFiles.length === 0) { self.exit(); } let file = self.pendingFiles.shift(); if (file) { let suite = new _suite2.default(file, self.suiteOptions); self.runningFiles.push(file); this.emit('new suite', suite); suite.on('end', function (suiteObject, error) { self.runningFiles.splice(self.runningFiles.indexOf(suiteObject.file), 1); let result = suiteObject.result; result.status = suiteObject.status; self.results.push(result); self.runNextSuite(self); }); suite.launch(); } else if (!file && self.runningFiles.length > 0) { console.log(`\n ${self.runningFiles.length} suite(s) are still running...`); } } exit() { this.emit('end'); console.log(); try { let failedSuites = this.results.filter(suiteResult => suiteResult.status !== 'pass' && suiteResult.status !== 'skip'); process.exitCode = failedSuites.length; } catch (error) { process.exitCode = 1; } } } exports.default = Launcher; module.exports = exports['default'];