Home Reference Source Repository

src/component/test/unit-runner.js

'use strict';

const fs = require('fs');
const path = require('path');
const Mocha = require('mocha');
const uuidv1 = require('uuid/v1');
const Logger = require('../../../src/logger');

/**
 * Unit test runner
 */
class UnitRunner {
  /**
   * @param {Object} options
   */
  constructor(options = {}) {
    this._tmps = [];
    this._mocha = new Mocha(options);
  }

  /**
   * Run tests
   * @param {Array} tests
   * @returns {Promise}
   */
  run(tests) {
    return new Promise((resolve, reject) => {
      tests.forEach(test => {
        const testDir = path.dirname(test);
        const tmpTest = path.join(testDir, `${uuidv1()}.spec.js`);

        fs.writeFileSync(tmpTest, fs.readFileSync(test));
        this._tmps.push(tmpTest);
        this._mocha.addFile(tmpTest);
      });

      this._mocha.run(err => {
        if (err) {
          this._removeTmpFiles();
          return reject(err);
        }

        return resolve();
      });
    });
  }

  /**
   * Get mocha instance
   * @returns {Mocha}
   */
  getMocha() {
    return this._mocha;
  }

  /**
   * Cleanup action
   * @returns {Promise}
   */
  cleanup() {
    this._removeTmpFiles();

    return Promise.resolve();
  }

  /**
   * Remove tmp test files
   * @private
   */
  _removeTmpFiles() {
    this._tmps.forEach(tmpTest => {
      try {
        fs.unlinkSync(tmpTest);
      } catch (err) {
        if (err.code !== 'ENOENT') {
          Logger.warn(Logger.emoji.bulb, err.message);
        }
      }
    });
  }
}

module.exports = UnitRunner;