UNPKG

qape

Version:

Monkey testing library

155 lines (121 loc) 3.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _fs = _interopRequireDefault(require("fs")); var _path = _interopRequireDefault(require("path")); var _globAll = _interopRequireDefault(require("glob-all")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Handles scenarios execution order */ class ScenariosHandler { /** * @param {Object} config */ constructor(config) { this._config = config; this._scenarios = { defined: [], failing: [] }; this._initTime = null; this._urlPathsIndex = 0; } /** * Initializes default values * and loads defined scenarios */ init() { this._loadDefinedScenarios(); this._initTime = new Date().getTime(); return this; } /** * Returns available scenario with highest priority * 1) FailingScenario * 2) DefinedScenario * 3) RandomScenario (if allowed by config) * @returns {Object} */ getScenario() { if (this._scenarios.failing.length > 0) { return { type: 'failing', scenario: this._scenarios.failing.shift() }; } if (this._scenarios.defined.length > 0) { return { type: 'defined', scenario: this._scenarios.defined.shift() }; } if (this._isAllowedToStartRandomScenario()) { return { type: 'random', scenario: { startUrl: this._getRandomScenarioStartUrl() } }; } return {}; } addFailingScenario(scenario) { this._scenarios.failing.push(scenario); } /** * Checks if new random scenarios are allowed based on configuration * @returns {boolean} */ _isAllowedToStartRandomScenario() { if (this._config.randomScenariosDisabled) { return false; } if (this._config.stopNewScenariosAfterTime === 0) { return true; } return new Date().getTime() - this._initTime < this._config.stopNewScenariosAfterTime; } /** * Loads all user defined scenarios specified in config */ _loadDefinedScenarios() { _globAll.default.sync(this._config.files).forEach(file => { let scenarioPath = _path.default.join(process.cwd(), file); if (!_fs.default.existsSync(scenarioPath)) { console.error(`Failed to load scenario at path "${scenarioPath}". File does not exist!`); return; } let scenario = this._loadScenarioFromPath(scenarioPath); this._scenarios.defined.push(scenario); }); } /** * Loads a scenario from specified scenarioPath * @param {string} scenarioPath * @returns {Object} scenario */ _loadScenarioFromPath(scenarioPath) { let scenario = require(scenarioPath); if (!scenario.name) { scenario.name = scenarioPath; } return scenario; } /** * Loads a start url for scenario from specified url paths * @returns {string} start url */ _getRandomScenarioStartUrl() { const { urlPaths } = this._config; if (this._urlPathsIndex >= urlPaths.length) { this._urlPathsIndex = 0; } return this._config.url + urlPaths[this._urlPathsIndex++]; } } exports.default = ScenariosHandler;