nazarhussain/mocha-test-options

View on GitHub
index.js

Summary

Maintainability
A
0 mins
Test Coverage
var Mocha = require('mocha');
var Suite = require('mocha/lib/suite');
var Test = require('mocha/lib/test');
var escapeRe = require('escape-string-regexp');
var extend = require('util')._extend;

module.exports = Mocha.interfaces['test-options'] = function(suite) {
  var suites = [suite];

  suite.on('pre-require', function(context, file, mocha) {
    var common = require('mocha/lib/interfaces/common')(suites, context);

    context.before = common.before;
    context.after = common.after;
    context.beforeEach = common.beforeEach;
    context.afterEach = common.afterEach;
    context.run = mocha.options.delay && common.runWithSuite(suite);
    /**
     * Describe a "suite" with the given `title`
     * and callback `fn` containing nested suites
     * and/or tests.
     */

    context.describe = context.context = function(title, options, fn) {
      if(typeof(options) === 'function' && fn == undefined){
        fn = options;
        options = {}
      }

      var suite = Suite.create(suites[0], title);
      suite.file = file;
      suite.testOptions = options;
      suites.unshift(suite);
      fn.call(suite);
      suites.shift();
      return suite;
    };

    /**
     * Pending describe.
     */

    context.xdescribe = context.xcontext = context.describe.skip = function(title, options, fn) {
      if(typeof(options) === 'function' && fn == undefined){
        fn = options;
        options = {}
      }

      var suite = Suite.create(suites[0], title);
      suite.testOptions = options;
      suite.pending = true;
      suites.unshift(suite);
      fn.call(suite);
      suites.shift();
    };

    /**
     * Exclusive suite.
     */

    context.describe.only = function(title, options, fn) {
      var suite = context.describe(title, options, fn);
      mocha.grep(suite.fullTitle());
      return suite;
    };

    /**
     * Describe a specification or test-case
     * with the given `title` and callback `fn`
     * acting as a thunk.
     */

    context.it = context.specify = function(title, options, fn) {
      var suite = suites[0];

      if(typeof(options) === 'function' && fn == undefined){
        fn = options;
        options = {};
      } else if (typeof(options) === 'object' && fn === null){
        fn = undefined;
        options = {};
      }

      if (suite.pending) {
        fn = null;
      }
      var test = new Test(title, fn);
      test.testOptions = extend(extend({}, suite.testOptions), options);
      test.file = file;
      suite.addTest(test);
      return test;
    };

    context.it.only = function(title, options, fn) {
      var test = context.it(title, options, fn);
      var reString = '^' + escapeRe(test.fullTitle()) + '$';
      mocha.grep(new RegExp(reString));
      return test;
    };

    /**
     * Pending test case.
     */

    context.xit = context.xspecify = context.it.skip = function(title, options, fn) {
      if(typeof(options) === 'function' && fn == undefined){
        options = {}
      }
      context.it(title, options, null);
    };

    /**
     * Number of attempts to retry.
     */
    context.it.retries = function(n) {
      context.retries(n);
    };
  });
};