rochdev/tinto

View on GitHub
lib/utils/assert.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict';

var queue = require('../queue');
var flag = require('./flag');
var wait = require('./wait');

/**
 * @private
 * @param {string} name
 * @param {function(tinto.Component, *) : function() : Promise} callback
 * @param {string} message
 * @returns {function(*) : Promise}
 */
function assert(name, callback, message) {
  return function(values) {
    var assertion = this;
    var context = flag(this, 'object');
    var delegate = !!flag(this, 'delegate');
    var negate = !!flag(this, 'negate');

    values = Array.prototype.slice.call(arguments, 0);

    if (delegate) {
      return add;
    } else {
      add.call(this, context);
      return this;
    }

    function add(assertable) {
      var self = this;

      queue.push(function() {
        return wait.until(callback.apply(assertion, [assertable].concat(values)), negate).then(test);
      });

      function test(results) {
        [].concat(results).forEach(function(result) {
          self.assert(result.outcome, buildMessage(false), buildMessage(true), result.expected, result.actual, !negate);
        });
      }

      function buildMessage(not) {
        var parts = ['expected', assertable.toString()];

        if (not) {
          parts.push('not');
        }

        parts.push('to');
        parts.push(message.replace(/#{name}/g, name));

        return parts.join(' ');
      }
    }
  };
}

module.exports = assert;