platform-helpers/runner-capabilities-builder.js

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;