ember-cli/ember-cli

View on GitHub
lib/tasks/test.js

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
'use strict';

const Task = require('../models/task');
const SilentError = require('silent-error');

class TestTask extends Task {
  constructor(options) {
    super(options);
    this.testem = this.testem || new (require('testem'))();
  }

  invokeTestem(options) {
    let testem = this.testem;
    let task = this;

    return new Promise((resolve, reject) => {
      testem.setDefaultOptions(task.defaultOptions(options));
      testem.startCI(task.transformOptions(options), (exitCode, error) => {
        if (error) {
          reject(error);
        } else if (exitCode !== 0) {
          reject(new SilentError('Testem finished with non-zero exit code. Tests failed.'));
        } else {
          resolve(exitCode);
        }
      });
    });
  }

  addonMiddlewares(options) {
    this.project.initializeAddons();

    return this.project.addons.reduce((addons, addon) => {
      if (addon.testemMiddleware) {
        addons.push(function () {
          addon.testemMiddleware(...arguments, options);
        });
      }

      return addons;
    }, []);
  }

  defaultOptions(options) {
    let defaultOptions = this.transformOptions(options);
    defaultOptions.cwd = options.outputPath;
    /* eslint-disable camelcase */
    defaultOptions.config_dir = process.cwd();
    /* eslint-enable camelcase */
    return defaultOptions;
  }

  transformOptions(options) {
    let transformed = {
      host: options.host,
      port: options.port,
      debug: options.testemDebug,
      reporter: options.reporter,
      middleware: this.addonMiddlewares(options),
      launch: options.launch,
      file: options.configFile,
      /* eslint-disable camelcase */
      test_page: options.testPage,
      query_params: options.queryString,
      /* eslint-enable camelcase */
    };

    if (options.ssl) {
      transformed.key = options.sslKey;
      transformed.cert = options.sslCert;
    }
    return transformed;
  }

  run(options) {
    return this.invokeTestem(options);
  }
}

module.exports = TestTask;