UNPKG

waterline

Version:

An ORM for Node.js and the Sails framework

140 lines (117 loc) 4.79 kB
var assert = require('assert'); var _ = require('@sailshq/lodash'); var Waterline = require('../../../../lib/waterline'); describe.skip('Type Casting ::', function() { describe('with `type: \'json\'` ::', function() { var orm; var Person; before(function(done) { orm = new Waterline(); orm.registerModel(Waterline.Model.extend({ identity: 'person', datastore: 'foo', primaryKey: 'id', attributes: { id: { type: 'number' }, activated: { type: 'boolean' }, age: { type: 'number' }, name: { type: 'string' }, organization: { type: 'json' }, avatarBlob: { type: 'ref' } } })); orm.initialize({ adapters: { foobar: {} }, datastores: { foo: { adapter: 'foobar' } } }, function(err, orm) { if (err) { return done(err); } Person = orm.collections.person; return done(); });//</.initialize()> });//</before> it('should leave the null literal as-is', function() { assert.equal(Person.validate('organization', null), null); }); it('should leave numbers as-is', function() { assert.equal(Person.validate('organization', 4), 4); assert.equal(Person.validate('organization', 0), 0); assert.equal(Person.validate('organization', -10000.32852), -10000.32852); }); it('should leave booleans as-is', function() { assert.equal(Person.validate('organization', true), true); assert.equal(Person.validate('organization', false), false); }); describe('given a string imposter (i.e. looks like another type)', function() { it('should leave "null" imposter string as-is', function (){ assert.equal(Person.validate('organization', 'null'), 'null'); }); it('should leave number imposter strings as-is', function (){ assert.equal(Person.validate('organization', '4'), '4'); assert.equal(Person.validate('organization', '0'), '0'); assert.equal(Person.validate('organization', '-10000.32852'), '-10000.32852'); }); it('should leave boolean imposter strings as-is', function (){ assert.equal(Person.validate('organization', 'true'), 'true'); assert.equal(Person.validate('organization', 'false'), 'false'); }); it('should leave dictionary imposter strings as-is', function (){ var DICTIONARY_IMPOSTER_STR = '{ name: \'Foo Bar\', location: [-31.0123, 31.0123] }'; var result = Person.validate('organization', '{ name: \'Foo Bar\', location: [-31.0123, 31.0123] }'); assert(_.isString(result)); assert.equal(DICTIONARY_IMPOSTER_STR, result); }); }); it('should decycle circular nonsense', function(){ var cersei = {}; var jaime = {}; cersei.brother = jaime; cersei.lover = jaime; jaime.sister = cersei; jaime.lover = cersei; var dryJaime = Person.validate('organization', jaime); assert.deepEqual(dryJaime, { sister: { brother: '[Circular ~]', lover: '[Circular ~]' }, lover: { brother: '[Circular ~]', lover: '[Circular ~]' } }); var dryCersei = Person.validate('organization', cersei); assert.deepEqual(dryCersei, { brother: { sister: '[Circular ~]', lover: '[Circular ~]' }, lover: { sister: '[Circular ~]', lover: '[Circular ~]' } }); }); it('should reject Readable streams', function(){ try { Person.validate('organization', new (require('stream').Readable)()); } catch (e) { switch (e.code) { case 'E_VALIDATION': // FUTURE: maybe expand test to check more things return; // As of Thu Dec 22, 2016, this test is failing because // validation is not being completely rolled up yet. default: throw new Error('The actual error code was "'+e.code+'" - but it should have been "E_VALIDATION": the rolled-up validation error. This is so that errors from the public `.validate()` are consistent with errors exposed when creating or updating records (i.e. when multiple values are being set at the same time.) Here is the error that was actually received:\n```\n' +e.stack+'\n```'); } } }); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // For further details on edge case handling, plus thousands more tests, see: // • http://npmjs.com/package/rttc // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }); });