index.js 3.5 KB
var equal     = require('assert').equal;
var deepEqual = require('assert').deepEqual;

var createError = require('../create-error');

describe('create-error', function() {

  describe('error creation', function() {

    it('should create a new error', function() {
      var TestingError = createError('TestingError');
      var a = new TestingError('msgA');
      var b = new TestingError('msgB');
      equal((a instanceof TestingError), true);
      equal((a instanceof Error), true);
      equal(a.message, 'msgA');
      equal(b.message, 'msgB');
      equal((a.stack.length > 0), true);
    });

    it('should attach properties in the second argument', function() {
      var TestingError = createError('TestingError', {anArray: []});
      var a = new TestingError('Test the array');
      deepEqual(a.anArray, []);
    });

    it('should give the name "CustomError" if the name is omitted', function() {
      var TestingError = createError();
      var a = new TestingError("msg");
      equal(a.name, 'CustomError');
    });

    it('should not reference the same property in subsequent errors', function() {
      var TestingError = createError('TestingError', {anArray: []});
      var a = new TestingError('Test the array');
      a.anArray.push('a');
      var b = new TestingError('');
      deepEqual(b.anArray, []);
    });

    it('should allow for empty objects on the cloned hash', function() {
      var TestingError = createError('TestingError', {anEmptyObj: Object.create(null)});
      var a = new TestingError('Test the array');
      deepEqual(a.anEmptyObj, Object.create(null));
    });

    it('attaches attrs in the second arg of the error ctor, #3', function() {
      var RequestError = createError('RequestError', {status: 400});
      var reqErr = new RequestError('404 Error', {status: 404});
      equal(reqErr.status, 404);
      equal(reqErr.message, '404 Error');
      equal(reqErr.name, 'RequestError');
    });

  });

  describe('subclassing errors', function() {

    it('takes an object in the first argument', function() {
      var TestingError = createError('TestingError');
      var SubTestingError = createError(TestingError, 'SubTestingError');
      var x = new SubTestingError();
      equal((x instanceof SubTestingError), true);
      equal((x instanceof TestingError), true);
      equal((x instanceof Error), true);
    });

    it('attaches the properties appropriately.', function() {
      var TestingError = createError('TestingError');
      var SubTestingError = createError(TestingError, 'SubTestingError', {key: []});
      var x = new SubTestingError();
      deepEqual(x.key, []);
    });

    it('allows for a default message, #4', function() {
      var TestingError = createError('TestingError', {message: 'Error with testing'});
      var x = new TestingError();
      equal(x.message, 'Error with testing');
    });

  });

  describe('invalid values sent to the second argument', function() {

    it('should ignore falsy values', function() {
      var TestingError  = createError('TestingError', '');
      var TestingError2 = createError('TestingError', null);
      var TestingError3 = createError('TestingError', void 0);
      var a = new TestingError('Test the array');
      var b = new TestingError2('Test the array');
      var c = new TestingError3('Test the array');
    });

    it('should ignore arrays', function() {
      var TestingError = createError('TestingError', [{anArray: []}]);
      var a = new TestingError('Test the array');
      equal(a.anArray, void 0);
    });

  });

});