UNPKG

waterline-adapter-tests

Version:
249 lines (193 loc) 7.99 kB
var assert = require('assert'); var _ = require('@sailshq/lodash'); var WaterlineUtils = require('waterline-utils'); /** * When `autoIncrement` is set to `true` on an attribute and no value is provided for it a * new unique value will be assigned by the adapter before the record is created. It is * guaranteed that the adapter will assign a unique value not present on any existing record. * The values assigned automatically will not necessarily be sequential, which accommodates * the use of UUIDs. If a value for the attribute is present in the data provided for a new * record it will be saved as-is without any guarantee of uniqueness. The `autoIncrement` * option has no effect when updating existing records. The feature flag is `autoIncrement`. */ describe('autoIncrement attribute feature', function() { describe('migrate: alter', function() { ///////////////////////////////////////////////////// // TEST SETUP //////////////////////////////////////////////////// var Waterline = require('waterline'); var migrate = 'drop'; var waterline; var getAutoIncFixture = require('./../support/autoInc.fixture.js'); var AutoIncModel; beforeEach(function(done) { waterline = new Waterline(); waterline.registerModel(getAutoIncFixture()); var connections = { autoIncConn: _.clone(Connections.test) }; Adapter.teardown('autoIncConn', function adapterTeardown(){ waterline.initialize({ adapters: { wl_tests: Adapter }, datastores: connections, defaults: {} }, function(err, ontology) { if(err) return done(err); WaterlineUtils.autoMigrations(migrate, ontology, function(err) { // Set migrate to `alter` for the next round. migrate = 'alter'; if (err) { return done(err); } AutoIncModel = ontology.collections.autoinc; done(); }); }); }); }); after(function(done) { if(!Adapter.hasOwnProperty('drop')) { waterline.teardown(done); } else { WaterlineUtils.autoMigrations('drop', waterline, function(err1) { waterline.teardown(function(err2) { return done(err1 || err2); }); }); } }); ///////////////////////////////////////////////////// // TEST METHODS //////////////////////////////////////////////////// var testName = '.create() test autoInc unique values'; var lastIds; it('should auto generate unique values', function(done) { var records = []; for(var i=0; i<10; i++) { records.push({ name: 'ai_' + i, type: testName }); } AutoIncModel.createEach(records, function(err) { if (err) return done(err); AutoIncModel.find({where : { type: testName }, sort : 'name'}, function(err, records) { if (err) return done(err); assert.ifError(err); assert.equal(records.length, 10, 'Expecting 10 records, but got '+records.length); assert(records[0].id); assert.equal(records[0].name, 'ai_0'); assert.equal(records[0].normalField, 0); var ids = _.pluck(records, 'id'); lastIds = ids; assert.equal(ids.length, 10); assert.equal(_.unique(ids).length, 10, 'Generated ids are not unique: '+ids.join(', ')); done(); }); }); }); it('should auto generate unique values (second run)', function(done) { var records = []; for(var i=0; i<10; i++) { records.push({ name: 'ai_' + i, type: testName }); } AutoIncModel.createEach(records, function(err) { if (err) return done(err); AutoIncModel.find({where : { type: testName }, sort : 'name'}, function(err, records) { if (err) return done(err); assert.ifError(err); assert.equal(records.length, 20, 'Expecting 20 records, but got '+records.length); assert(records[0].id); assert.equal(records[0].name, 'ai_0'); assert.equal(records[0].normalField, 0); var ids = _.pluck(records, 'id'); lastIds = ids; assert.equal(ids.length, 20); assert.equal(_.unique(ids).length, 20, 'Generated ids are not unique: '+ids.join(', ')); done(); }); }); }); }); describe('migrate: safe', function() { ///////////////////////////////////////////////////// // TEST SETUP //////////////////////////////////////////////////// var Waterline = require('waterline'); var migrate = 'drop'; var waterline; var getAutoIncFixture = require('./../support/autoInc.fixture.js'); var AutoIncModel; beforeEach(function(done) { waterline = new Waterline(); waterline.registerModel(getAutoIncFixture()); var connections = { autoIncConn: _.clone(Connections.test) }; connections.autoIncConn.dir = '.tmp/autoIncMigrateSafe'; Adapter.teardown('autoIncConn', function adapterTeardown(){ waterline.initialize({ adapters: { wl_tests: Adapter }, datastores: connections, defaults: {} }, function(err, ontology) { if(err) return done(err); WaterlineUtils.autoMigrations(migrate, ontology, function(err) { if (err) { return done(err); } // Set migrate to `safe` for the next round migrate = 'safe'; AutoIncModel = ontology.collections.autoinc; done(); }); }); }); }); after(function(done) { if(!Adapter.hasOwnProperty('drop')) { waterline.teardown(done); } else { WaterlineUtils.autoMigrations('drop', waterline, function(err1) { waterline.teardown(function(err2) { return done(err1 || err2); }); }); } }); ///////////////////////////////////////////////////// // TEST METHODS //////////////////////////////////////////////////// var testName = '.create() test autoInc unique values'; var lastIds; it('should auto generate unique values', function(done) { var records = []; for(var i=0; i<10; i++) { records.push({ name: 'ai_' + i, type: testName }); } AutoIncModel.createEach(records, function(err) { if (err) return done(err); AutoIncModel.find({where : { type: testName }, sort : 'name'}, function(err, records) { if (err) return done(err); assert.ifError(err); assert.equal(records.length, 10, 'Expecting 10 records, but got '+records.length); assert(records[0].id); assert.equal(records[0].name, 'ai_0'); assert.equal(records[0].normalField, 0); var ids = _.pluck(records, 'id'); lastIds = ids; assert.equal(ids.length, 10); assert.equal(_.unique(ids).length, 10, 'Generated ids are not unique: '+ids.join(', ')); done(); }); }); }); it('should auto generate unique values (second run)', function(done) { var records = []; for(var i=0; i<10; i++) { records.push({ name: 'ai_' + i, type: testName }); } AutoIncModel.createEach(records, function(err) { if (err) return done(err); AutoIncModel.find({where : { type: testName }, sort : 'name'}, function(err, records) { if (err) return done(err); assert.ifError(err); assert.equal(records.length, 20, 'Expecting 20 records, but got '+records.length); assert(records[0].id); assert.equal(records[0].name, 'ai_0'); assert.equal(records[0].normalField, 0); var ids = _.pluck(records, 'id'); lastIds = ids; assert.equal(ids.length, 20); assert.equal(_.unique(ids).length, 20, 'Generated ids are not unique: '+ids.join(', ')); done(); }); }); }); }); });