app/lib/assertions/objectHasProperty.js

/**
 * Assert property of object
 * @module
 */

var _ = require('underscore');
var assert = require('assert');
var ObjectId = require('mongoose').Types.ObjectId;

module.exports = function(objectName, object, propertyName, propertyValue) {
  var description = objectName + ' object has property ' + propertyName;

  if (propertyValue) {
    description += ' that matches ' + typeof propertyValue;
  }

  it(description, (done) => {
    if (typeof propertyValue === 'object') {
      try {
        if (typeof object[propertyName] === 'string' && ObjectId.isValid(object[propertyName])) {
          assert(_.isEqual(ObjectId(object[propertyName]), propertyValue));
        } else {
          assert(_.isEqual(object[propertyName], propertyValue));
        }
      } catch (error) {
        return done(new Error(`Object property "${propertyName}" does match value expected: ${JSON.stringify(object[propertyName])} !== ${propertyValue}`));
      }
    } else if (!propertyValue) {
      assert(typeof object[propertyName] !== 'undefined');
    } else {
      try {
        assert.deepEqual(object[propertyName], propertyValue);
      } catch (error) {
        return done(new Error(`Object property "${propertyName}" does match value expected: ${object[propertyName]} !== ${propertyValue}`));
      }
    }
    
    done();
  });
};