UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

114 lines 17.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const configuration_base_1 = __importDefault(require("./configuration-base")); const option_source_1 = __importDefault(require("./option-source")); const lodash_1 = require("lodash"); const get_options_1 = require("../utils/get-options"); const option_names_1 = __importDefault(require("./option-names")); const get_filter_fn_1 = __importDefault(require("../utils/get-filter-fn")); const prepare_reporters_1 = __importDefault(require("../utils/prepare-reporters")); const string_1 = require("../utils/string"); const render_template_1 = __importDefault(require("../utils/render-template")); const warning_message_1 = __importDefault(require("../notifications/warning-message")); const default_values_1 = require("./default-values"); const CONFIGURATION_FILENAME = '.testcaferc.json'; const OPTION_FLAG_NAMES = [ option_names_1.default.skipJsErrors, option_names_1.default.disablePageReloads, option_names_1.default.quarantineMode, option_names_1.default.debugMode, option_names_1.default.debugOnFail, option_names_1.default.skipUncaughtErrors, option_names_1.default.stopOnFirstFail, option_names_1.default.takeScreenshotsOnFails ]; class TestCafeConfiguration extends configuration_base_1.default { constructor() { super(CONFIGURATION_FILENAME); } async init(options = {}) { const opts = await this._load(); if (opts) { this._options = configuration_base_1.default._fromObj(opts); await this._normalizeOptionsAfterLoad(); } this.mergeOptions(options); } prepare() { this._prepareFlags(); this._setDefaultValues(); } notifyAboutOverridenOptions() { if (!this._overridenOptions.length) return; const optionsStr = string_1.getConcatenatedValuesString(this._overridenOptions); const optionsSuffix = string_1.getPluralSuffix(this._overridenOptions); configuration_base_1.default._showConsoleWarning(render_template_1.default(warning_message_1.default.configOptionsWereOverriden, optionsStr, optionsSuffix)); this._overridenOptions = []; } get startOptions() { const result = { hostname: this.getOption('hostname'), port1: this.getOption('port1'), port2: this.getOption('port2'), options: { ssl: this.getOption('ssl'), developmentMode: this.getOption('developmentMode'), retryTestPages: !!this.getOption('retryTestPages') } }; if (result.options.retryTestPages) result.options.staticContentCaching = default_values_1.STATIC_CONTENT_CACHING_SETTINGS; return result; } _prepareFlags() { OPTION_FLAG_NAMES.forEach(name => { const option = this._ensureOption(name, void 0, option_source_1.default.configuration); option.value = !!option.value; }); } async _normalizeOptionsAfterLoad() { await this._prepareSslOptions(); this._prepareFilterFn(); this._ensureArrayOption(option_names_1.default.src); this._ensureArrayOption(option_names_1.default.browsers); this._prepareReporters(); } _prepareFilterFn() { const filterOption = this._ensureOption(option_names_1.default.filter, null); if (!filterOption.value) return; if (filterOption.value.testGrep) filterOption.value.testGrep = get_options_1.getGrepOptions(option_names_1.default.filterTestGrep, filterOption.value.testGrep); if (filterOption.value.fixtureGrep) filterOption.value.fixtureGrep = get_options_1.getGrepOptions(option_names_1.default.filterFixtureGrep, filterOption.value.fixtureGrep); filterOption.value = get_filter_fn_1.default(filterOption.value); } _prepareReporters() { const reporterOption = this._options[option_names_1.default.reporter]; if (!reporterOption) return; const optionValue = lodash_1.castArray(reporterOption.value); reporterOption.value = prepare_reporters_1.default(optionValue); } async _prepareSslOptions() { const sslOptions = this._options[option_names_1.default.ssl]; if (!sslOptions) return; sslOptions.value = await get_options_1.getSSLOptions(sslOptions.value); } _setDefaultValues() { this._ensureOptionWithValue(option_names_1.default.selectorTimeout, default_values_1.DEFAULT_TIMEOUT.selector, option_source_1.default.configuration); this._ensureOptionWithValue(option_names_1.default.assertionTimeout, default_values_1.DEFAULT_TIMEOUT.assertion, option_source_1.default.configuration); this._ensureOptionWithValue(option_names_1.default.pageLoadTimeout, default_values_1.DEFAULT_TIMEOUT.pageLoad, option_source_1.default.configuration); this._ensureOptionWithValue(option_names_1.default.speed, default_values_1.DEFAULT_SPEED_VALUE, option_source_1.default.configuration); this._ensureOptionWithValue(option_names_1.default.appInitDelay, default_values_1.DEFAULT_APP_INIT_DELAY, option_source_1.default.configuration); this._ensureOptionWithValue(option_names_1.default.concurrency, default_values_1.DEFAULT_CONCURRENCY_VALUE, option_source_1.default.configuration); } } exports.default = TestCafeConfiguration; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGNhZmUtY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWd1cmF0aW9uL3Rlc3RjYWZlLWNvbmZpZ3VyYXRpb24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4RUFBaUQ7QUFDakQsb0VBQTJDO0FBQzNDLG1DQUFtQztBQUNuQyxzREFBcUU7QUFDckUsa0VBQTBDO0FBQzFDLDJFQUFpRDtBQUNqRCxtRkFBMEQ7QUFDMUQsNENBQStFO0FBQy9FLCtFQUFzRDtBQUN0RCx1RkFBZ0U7QUFFaEUscURBTTBCO0FBRTFCLE1BQU0sc0JBQXNCLEdBQUcsa0JBQWtCLENBQUM7QUFFbEQsTUFBTSxpQkFBaUIsR0FBRztJQUN0QixzQkFBWSxDQUFDLFlBQVk7SUFDekIsc0JBQVksQ0FBQyxrQkFBa0I7SUFDL0Isc0JBQVksQ0FBQyxjQUFjO0lBQzNCLHNCQUFZLENBQUMsU0FBUztJQUN0QixzQkFBWSxDQUFDLFdBQVc7SUFDeEIsc0JBQVksQ0FBQyxrQkFBa0I7SUFDL0Isc0JBQVksQ0FBQyxlQUFlO0lBQzVCLHNCQUFZLENBQUMsc0JBQXNCO0NBQ3RDLENBQUM7QUFFRixNQUFxQixxQkFBc0IsU0FBUSw0QkFBYTtJQUM1RDtRQUNJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFFLE9BQU8sR0FBRyxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWhDLElBQUksSUFBSSxFQUFFO1lBQ04sSUFBSSxDQUFDLFFBQVEsR0FBRyw0QkFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU3QyxNQUFNLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1NBQzNDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQs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RSx1Q0FBc0IsRUFBRSx1QkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBWSxDQUFDLFdBQVcsRUFBRSwwQ0FBeUIsRUFBRSx1QkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pILENBQUM7Q0FDSjtBQS9HRCx3Q0ErR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuL2NvbmZpZ3VyYXRpb24tYmFzZSc7XG5pbXBvcnQgb3B0aW9uU291cmNlIGZyb20gJy4vb3B0aW9uLXNvdXJjZSc7XG5pbXBvcnQgeyBjYXN0QXJyYXkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZ2V0U1NMT3B0aW9ucywgZ2V0R3JlcE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucyc7XG5pbXBvcnQgT1BUSU9OX05BTUVTIGZyb20gJy4vb3B0aW9uLW5hbWVzJztcbmltcG9ydCBnZXRGaWx0ZXJGbiBmcm9tICcuLi91dGlscy9nZXQtZmlsdGVyLWZuJztcbmltcG9ydCBwcmVwYXJlUmVwb3J0ZXJzIGZyb20gJy4uL3V0aWxzL3ByZXBhcmUtcmVwb3J0ZXJzJztcbmltcG9ydCB7IGdldENvbmNhdGVuYXRlZFZhbHVlc1N0cmluZywgZ2V0UGx1cmFsU3VmZml4IH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCByZW5kZXJUZW1wbGF0ZSBmcm9tICcuLi91dGlscy9yZW5kZXItdGVtcGxhdGUnO1xuaW1wb3J0IFdBUk5JTkdfTUVTU0FHRVMgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLW1lc3NhZ2UnO1xuXG5pbXBvcnQge1xuICAgIERFRkFVTFRfVElNRU9VVCxcbiAgICBERUZBVUxUX1NQRUVEX1ZBTFVFLFxuICAgIFNUQVRJQ19DT05URU5UX0NBQ0hJTkdfU0VUVElOR1MsXG4gICAgREVGQVVMVF9BUFBfSU5JVF9ERUxBWSxcbiAgICBERUZBVUxUX0NPTkNVUlJFTkNZX1ZBTFVFXG59IGZyb20gJy4vZGVmYXVsdC12YWx1ZXMnO1xuXG5jb25zdCBDT05GSUdVUkFUSU9OX0ZJTEVOQU1FID0gJy50ZXN0Y2FmZXJjLmpzb24nO1xuXG5jb25zdCBPUFRJT05fRkxBR19OQU1FUyA9IFtcbiAgICBPUFRJT05fTkFNRVMuc2tpcEpzRXJyb3JzLFxuICAgIE9QVElPTl9OQU1FUy5kaXNhYmxlUGFnZVJlbG9hZHMsXG4gICAgT1BUSU9OX05BTUVTLnF1YXJhbnRpbmVNb2RlLFxuICAgIE9QVElPTl9OQU1FUy5kZWJ1Z01vZGUsXG4gICAgT1BUSU9OX05BTUVTLmRlYnVnT25GYWlsLFxuICAgIE9QVElPTl9OQU1FUy5za2lwVW5jYXVnaHRFcnJvcnMsXG4gICAgT1BUSU9OX05BTUVTLnN0b3BPbkZpcnN0RmFpbCxcbiAgICBPUFRJT05fTkFNRVMudGFrZVNjcmVlbnNob3RzT25GYWlsc1xuXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVzdENhZmVDb25maWd1cmF0aW9uIGV4dGVuZHMgQ29uZmlndXJhdGlvbiB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcihDT05GSUdVUkFUSU9OX0ZJTEVOQU1FKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0IChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IGF3YWl0IHRoaXMuX2xvYWQoKTtcblxuICAgICAgICBpZiAob3B0cykge1xuICAgICAgICAgICAgdGhpcy5fb3B0aW9ucyA9IENvbmZpZ3VyYXRpb24uX2Zyb21PYmoob3B0cyk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX25vcm1hbGl6ZU9wdGlvbnNBZnRlckxvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWVyZ2VPcHRpb25zKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHByZXBhcmUgKCkge1xuICAgICAgICB0aGlzLl9wcmVwYXJlRmxhZ3MoKTtcbiAgICAgICAgdGhpcy5fc2V0RGVmYXVsdFZhbHVlcygpO1xuICAgIH1cblxuICAgIG5vdGlmeUFib3V0T3ZlcnJpZGVuT3B0aW9ucyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fb3ZlcnJpZGVuT3B0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uc1N0ciAgICA9IGdldENvbmNhdGVuYXRlZFZhbHVlc1N0cmluZyh0aGlzLl9vdmVycmlkZW5PcHRpb25zKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1N1ZmZpeCA9IGdldFBsdXJhbFN1ZmZpeCh0aGlzLl9vdmVycmlkZW5PcHRpb25zKTtcblxuICAgICAgICBDb25maWd1cmF0aW9uLl9zaG93Q29uc29sZVdhcm5pbmcocmVuZGVyVGVtcGxhdGUoV0FSTklOR19NRVNTQUdFUy5jb25maWdPcHRpb25zV2VyZU92ZXJyaWRlbiwgb3B0aW9uc1N0ciwgb3B0aW9uc1N1ZmZpeCkpO1xuXG4gICAgICAgIHRoaXMuX292ZXJyaWRlbk9wdGlvbnMgPSBbXTtcbiAgICB9XG5cbiAgICBnZXQgc3RhcnRPcHRpb25zICgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgaG9zdG5hbWU6IHRoaXMuZ2V0T3B0aW9uKCdob3N0bmFtZScpLFxuICAgICAgICAgICAgcG9ydDE6ICAgIHRoaXMuZ2V0T3B0aW9uKCdwb3J0MScpLFxuICAgICAgICAgICAgcG9ydDI6ICAgIHRoaXMuZ2V0T3B0aW9uKCdwb3J0MicpLFxuICAgICAgICAgICAgb3B0aW9uczogIHtcbiAgICAgICAgICAgICAgICBzc2w6ICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdzc2wnKSxcbiAgICAgICAgICAgICAgICBkZXZlbG9wbWVudE1vZGU6IHRoaXMuZ2V0T3B0aW9uKCdkZXZlbG9wbWVudE1vZGUnKSxcbiAgICAgICAgICAgICAgICByZXRyeVRlc3RQYWdlczogICEhdGhpcy5nZXRPcHRpb24oJ3JldHJ5VGVzdFBhZ2VzJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocmVzdWx0Lm9wdGlvbnMucmV0cnlUZXN0UGFnZXMpXG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucy5zdGF0aWNDb250ZW50Q2FjaGluZyA9IFNUQVRJQ19DT05URU5UX0NBQ0hJTkdfU0VUVElOR1M7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBfcHJlcGFyZUZsYWdzICgpIHtcbiAgICAgICAgT1BUSU9OX0ZMQUdfTkFNRVMuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2Vuc3VyZU9wdGlvbihuYW1lLCB2b2lkIDAsIG9wdGlvblNvdXJjZS5jb25maWd1cmF0aW9uKTtcblxuICAgICAgICAgICAgb3B0aW9uLnZhbHVlID0gISFvcHRpb24udmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIF9ub3JtYWxpemVPcHRpb25zQWZ0ZXJMb2FkICgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcHJlcGFyZVNzbE9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5fcHJlcGFyZUZpbHRlckZuKCk7XG4gICAgICAgIHRoaXMuX2Vuc3VyZUFycmF5T3B0aW9uKE9QVElPTl9OQU1FUy5zcmMpO1xuICAgICAgICB0aGlzLl9lbnN1cmVBcnJheU9wdGlvbihPUFRJT05fTkFNRVMuYnJvd3NlcnMpO1xuICAgICAgICB0aGlzLl9wcmVwYXJlUmVwb3J0ZXJzKCk7XG4gICAgfVxuXG4gICAgX3ByZXBhcmVGaWx0ZXJGbiAoKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlck9wdGlvbiA9IHRoaXMuX2Vuc3VyZU9wdGlvbihPUFRJT05fTkFNRVMuZmlsdGVyLCBudWxsKTtcblxuICAgICAgICBpZiAoIWZpbHRlck9wdGlvbi52YWx1ZSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAoZmlsdGVyT3B0aW9uLnZhbHVlLnRlc3RHcmVwKVxuICAgICAgICAgICAgZmlsdGVyT3B0aW9uLnZhbHVlLnRlc3RHcmVwID0gZ2V0R3JlcE9wdGlvbnMoT1BUSU9OX05BTUVTLmZpbHRlclRlc3RHcmVwLCBmaWx0ZXJPcHRpb24udmFsdWUudGVzdEdyZXApO1xuXG4gICAgICAgIGlmIChmaWx0ZXJPcHRpb24udmFsdWUuZml4dHVyZUdyZXApXG4gICAgICAgICAgICBmaWx0ZXJPcHRpb24udmFsdWUuZml4dHVyZUdyZXAgPSBnZXRHcmVwT3B0aW9ucyhPUFRJT05fTkFNRVMuZmlsdGVyRml4dHVyZUdyZXAsIGZpbHRlck9wdGlvbi52YWx1ZS5maXh0dXJlR3JlcCk7XG5cbiAgICAgICAgZmlsdGVyT3B0aW9uLnZhbHVlID0gZ2V0RmlsdGVyRm4oZmlsdGVyT3B0aW9uLnZhbHVlKTtcbiAgICB9XG5cbiAgICBfcHJlcGFyZVJlcG9ydGVycyAoKSB7XG4gICAgICAgIGNvbnN0IHJlcG9ydGVyT3B0aW9uID0gdGhpcy5fb3B0aW9uc1tPUFRJT05fTkFNRVMucmVwb3J0ZXJdO1xuXG4gICAgICAgIGlmICghcmVwb3J0ZXJPcHRpb24pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBjYXN0QXJyYXkocmVwb3J0ZXJPcHRpb24udmFsdWUpO1xuXG4gICAgICAgIHJlcG9ydGVyT3B0aW9uLnZhbHVlID0gcHJlcGFyZVJlcG9ydGVycyhvcHRpb25WYWx1ZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgX3ByZXBhcmVTc2xPcHRpb25zICgpIHtcbiAgICAgICAgY29uc3Qgc3NsT3B0aW9ucyA9IHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLnNzbF07XG5cbiAgICAgICAgaWYgKCFzc2xPcHRpb25zKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHNzbE9wdGlvbnMudmFsdWUgPSBhd2FpdCBnZXRTU0xPcHRpb25zKHNzbE9wdGlvbnMudmFsdWUpO1xuICAgIH1cblxuICAgIF9zZXREZWZhdWx0VmFsdWVzICgpIHtcbiAgICAgICAgdGhpcy5fZW5zdXJlT3B0aW9uV2l0aFZhbHVlKE9QVElPTl9OQU1FUy5zZWxlY3RvclRpbWVvdXQsIERFRkFVTFRfVElNRU9VVC5zZWxlY3Rvciwgb3B0aW9uU291cmNlLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLl9lbnN1cmVPcHRpb25XaXRoVmFsdWUoT1BUSU9OX05BTUVTLmFzc2VydGlvblRpbWVvdXQsIERFRkFVTFRfVElNRU9VVC5hc3NlcnRpb24sIG9wdGlvblNvdXJjZS5jb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5fZW5zdXJlT3B0aW9uV2l0aFZhbHVlKE9QVElPTl9OQU1FUy5wYWdlTG9hZFRpbWVvdXQsIERFRkFVTFRfVElNRU9VVC5wYWdlTG9hZCwgb3B0aW9uU291cmNlLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLl9lbnN1cmVPcHRpb25XaXRoVmFsdWUoT1BUSU9OX05BTUVTLnNwZWVkLCBERUZBVUxUX1NQRUVEX1ZBTFVFLCBvcHRpb25Tb3VyY2UuY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuX2Vuc3VyZU9wdGlvbldpdGhWYWx1ZShPUFRJT05fTkFNRVMuYXBwSW5pdERlbGF5LCBERUZBVUxUX0FQUF9JTklUX0RFTEFZLCBvcHRpb25Tb3VyY2UuY29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuX2Vuc3VyZU9wdGlvbldpdGhWYWx1ZShPUFRJT05fTkFNRVMuY29uY3VycmVuY3ksIERFRkFVTFRfQ09OQ1VSUkVOQ1lfVkFMVUUsIG9wdGlvblNvdXJjZS5jb25maWd1cmF0aW9uKTtcbiAgICB9XG59XG4iXX0=