const rootRequire = require('rpcm-root-require');
const SauceLabsCapabilitiesLists = rootRequire('platform-helpers/saucelabs-capabilities-lists.js');
const ObjectHelper = rootRequire('platform-helpers/object-helper.js');
rootRequire('/platform-helpers/string-extensions');
/**
* Runner capabilities builder
*
* @module
* @static
* @requires rpcm-root-require
* @requires lodash
* @requires string-extensions
*/
class RunnerCapabilitiesBuilder {
/**
* Builds the capabilities object for the test run
*
* @param {object} object with the runner options
* @static
* @testFile tests\self-tests\unit-tests\runner-capabilities-builder.spec.js
* @throws
*/
static build (opts) {
const defaultCapability = { browserName: 'chrome' };
if (opts.reportOnly) defaultCapability['goog:chromeOptions'] = {
args: ['headless', 'disable-gpu']
};
const isNotArray = !Array.isArray(opts.capabilities);
const isEmptyArray = Array.isArray(opts.capabilities) && opts.capabilities.length === 0;
if (isNotArray || isEmptyArray) opts.capabilities = [defaultCapability];
const exists = opts.capabilities.findIndex(el => el.browserName === defaultCapability.browserName) > -1;
if (!exists) opts.capabilities.unshift(defaultCapability);
/**
* if its set to run remotely, override completely the capabilities collection with the SauceLabs expected lists
* See lists comments for additional information on the lists
*
* separate export so we can re-override the runner's capability (local chrome) with a shared set of browsers
* see https://wiki.saucelabs.com/display/DOCS/Test+Configuration+Options
* and https://wiki.saucelabs.com/display/DOCS/Platform+Configurator
*
*/
if (opts.runRemotely || opts.runFullCrossBrowser || opts.runCrossBrowser || opts.enableProxy) {
if (opts.runFullCrossBrowser) {
// opts.capabilities = require('{0}/wdio.conf.saucelabs.js'.format(rootRequire.rootPath)).fullCrossBrowser;
opts.capabilities = SauceLabsCapabilitiesLists.fullCapabilities();
} else if (opts.runCrossBrowser) {
// opts.capabilities = require('{0}/wdio.conf.saucelabs.js'.format(rootRequire.rootPath)).crossBrowser;
opts.capabilities = SauceLabsCapabilitiesLists.latestCapabilities();
} else {
// opts.capabilities = require('{0}/wdio.conf.saucelabs.js'.format(rootRequire.rootPath)).singleCapability;
opts.capabilities = SauceLabsCapabilitiesLists.singleCapability();
}
}
opts.capabilities.forEach((capability, index) => {
RunnerCapabilitiesBuilder.settingsList.forEach((setting) => {
// we don't necessarily need all of these on each capability, but it's harmless and simple to do it like this
if (!ObjectHelper.isNullOrUnderfined(opts[setting])) opts.capabilities[index]['teal:{0}'.format(setting)] = opts[setting];
});
});
}
static settingsList = [
'enableProxy',
'enableTrace',
'runCrossBrowser',
'extraProxyCommands',
'runRetries',
'runRemotely',
'showDurations',
'enableSauceConnect',
'blockPatterns',
'urlRewrites',
'hasReportContext',
'hasRunnerContext',
'reportContext',
'summaryContext',
'reportOnly',
'traceAccount',
'traceProfile'
];
}
module.exports = RunnerCapabilitiesBuilder;