不要怂,就是干,撸起袖子干!

changed.test.js 4.96 KB
'use strict';

/* jshint -W030 */
var chai = require('chai')
  , expect = chai.expect
  , Support   = require(__dirname + '/../support')
  , DataTypes = require(__dirname + '/../../../lib/data-types')
  , current   = Support.sequelize;

describe(Support.getTestDialectTeaser('Instance'), function() {
  describe('changed', function () {
    beforeEach(function () {
      this.User = current.define('User', {
        name: DataTypes.STRING,
        birthdate: DataTypes.DATE,
        meta: DataTypes.JSON
      });
    });

    it('should return true for changed primitive', function () {
      var user = this.User.build({
        name: 'a'
      }, {
        isNewRecord: false,
        raw: true
      });

      expect(user.changed('meta')).to.equal(false);
      user.set('name', 'b');
      user.set('meta', null);
      expect(user.changed('name')).to.equal(true);
      expect(user.changed('meta')).to.equal(true);
    });

    it('should return falsy for unchanged primitive', function () {
      var user = this.User.build({
        name: 'a',
        meta: null
      }, {
        isNewRecord: false,
        raw: true
      });

      user.set('name', 'a');
      user.set('meta', null);
      expect(user.changed('name')).to.equal(false);
      expect(user.changed('meta')).to.equal(false);
    });

    it('should return true for multiple changed values', function () {
      var user = this.User.build({
        name: 'a',
        birthdate: new Date(new Date() - 10)
      }, {
        isNewRecord: false,
        raw: true
      });

      user.set('name', 'b');
      user.set('birthdate', new Date());
      expect(user.changed('name')).to.equal(true);
      expect(user.changed('birthdate')).to.equal(true);
    });

    it('should return false for two instances with same value', function () {
      var milliseconds = 1436921941088;
      var firstDate = new Date(milliseconds);
      var secondDate = new Date(milliseconds);

      var user = this.User.build({
        birthdate: firstDate
      }, {
        isNewRecord: false,
        raw: true
      });

      user.set('birthdate', secondDate);
      expect(user.changed('birthdate')).to.equal(false);
    });

    it('should return true for changed JSON with same object', function () {
      var user = this.User.build({
        meta: {
          city: 'Copenhagen'
        }
      }, {
        isNewRecord: false,
        raw: true
      });

      var meta = user.get('meta');
      meta.city = 'Stockholm';

      user.set('meta', meta);
      expect(user.changed('meta')).to.equal(true);
    });

    it('should return true for JSON dot.separated key with changed values', function() {
      var user = this.User.build({
        meta: {
          city: 'Stockholm'
        }
      }, {
        isNewRecord: false,
        raw: true
      });

      user.set('meta.city', 'Gothenburg');
      expect(user.changed('meta')).to.equal(true);
    });

    it('should return false for JSON dot.separated key with same value', function() {
      var user = this.User.build({
        meta: {
          city: 'Gothenburg'
        }
      }, {
        isNewRecord: false,
        raw: true
      });

      user.set('meta.city', 'Gothenburg');
      expect(user.changed('meta')).to.equal(false);
    });

    it('should return true for JSON dot.separated key with object', function() {
      var user = this.User.build({
        meta: {
          address: { street: 'Main street', number: '40' }
        }
      }, {
        isNewRecord: false,
        raw: true
      });

      user.set('meta.address', { street: 'Second street', number: '1' } );
      expect(user.changed('meta')).to.equal(true);
    });

    it('should return false for JSON dot.separated key with same object', function() {
      var user = this.User.build({
        meta: {
          address: { street: 'Main street', number: '40' }
        }
      }, {
        isNewRecord: false,
        raw: true
      });

      user.set('meta.address', { street: 'Main street', number: '40' } );
      expect(user.changed('meta')).to.equal(false);
    });

    it('should return false when changed from null to null', function() {
      var attributes = {};
      var attr;

      for (attr in this.User.rawAttributes) {
        attributes[attr] = null;
      }
      var user = this.User.build(attributes, {
        isNewRecord: false,
        raw: true
      });
      for (attr in this.User.rawAttributes) {
        user.set(attr, null);
      }
      for (attr in this.User.rawAttributes) {
        expect(user.changed(attr)).to.equal(false);
      }
    });

    describe('setDataValue', function() {
      it('should return falsy for unchanged primitive', function() {
        var user = this.User.build({
          name: 'a',
          meta: null
        }, {
          isNewRecord: false,
          raw: true
        });

        user.setDataValue('name', 'a');
        user.setDataValue('meta', null);
        expect(user.changed('name')).to.equal(false);
        expect(user.changed('meta')).to.equal(false);
      });
    });
  });
});