diff --git a/test/helper.js b/test/helper.js index 9a18d0d..bf0075c 100644 --- a/test/helper.js +++ b/test/helper.js @@ -10,14 +10,12 @@ var loopback = require('loopback'); var remoteConnector = require('..'); exports.createMemoryDataSource = createMemoryDataSource; -exports.createModel = createModel; exports.createRemoteDataSource = createRemoteDataSource; -exports.createRemoteDataSourceWithOptions = createRemoteDataSourceWithOptions; exports.createRestAppAndListen = createRestAppAndListen; exports.getUserProperties = getUserProperties; function createRestAppAndListen() { - var app = loopback(); + const app = loopback({localRegistry: true}); app.set('host', '127.0.0.1'); app.set('port', 0); @@ -34,38 +32,17 @@ function createRestAppAndListen() { return app; } -function createMemoryDataSource() { - return loopback.createDataSource({connector: 'memory'}); +function createMemoryDataSource(app) { + return app.dataSource('db', {connector: 'memory'}); } -function createRemoteDataSource(remoteApp) { - return loopback.createDataSource({ - url: 'http://' + remoteApp.get('host') + ':' + remoteApp.get('port'), +function createRemoteDataSource(app, serverApp) { + return app.dataSource('remote', { + url: 'http://' + serverApp.get('host') + ':' + serverApp.get('port'), connector: remoteConnector }); } -function createRemoteDataSourceWithOptions(remoteApp, options) { - return loopback.createDataSource({ - url: 'http://anyURL.com', - connector: remoteConnector, - options: options - }); -} - -/** - * Used to create models based on a set of options. May associate or link to an - * app. - */ -function createModel(options) { - var modelOptions = extend({ forceId: false }, options.options); - var Model = loopback.PersistedModel.extend(options.parent, options.properties, - modelOptions); - if (options.app) options.app.model(Model); - if (options.datasource) Model.attachTo(options.datasource); - return Model; -} - function getUserProperties() { return { 'first': String, diff --git a/test/integration/promise-support.js b/test/integration/promise-support.js index e312f94..64c1575 100644 --- a/test/integration/promise-support.js +++ b/test/integration/promise-support.js @@ -1,9 +1,16 @@ -var assert = require('assert'); -var helper = require('../helper'); -var Promise = require('bluebird'); +// Copyright IBM Corp. 2016. All Rights Reserved. +// Node module: loopback-connector-remote +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT -var globalPromiseSetManually = false; -var User; +'use strict'; + +const assert = require('assert'); +const helper = require('../helper'); +const Promise = require('bluebird'); + +let globalPromiseSetManually = false; +let User; describe('promise support', function() { before(setGlobalPromise); @@ -12,21 +19,21 @@ describe('promise support', function() { context('create', function() { it('supports promises', function() { - var retval = User.create(); + const retval = User.create(); assert(retval && typeof retval.then === 'function'); }); }); context('find', function() { it('supports promises', function() { - var retval = User.find(); + const retval = User.find(); assert(retval && typeof retval.then === 'function'); }); }); context('findById', function() { it('supports promises', function() { - var retval = User.findById(1); + const retval = User.findById(1); assert(retval && typeof retval.then === 'function'); }); }); @@ -40,12 +47,15 @@ function setGlobalPromise() { } function createUserModel() { - User = helper.createModel({ - parent: 'user', - app: helper.createRestAppAndListen(), - datasource: helper.createMemoryDataSource(), - properties: helper.getUserProperties() + const app = helper.createRestAppAndListen(); + const db = helper.createMemoryDataSource(app); + + User = app.registry.createModel({ + name: 'user', + properties: helper.getUserProperties(), + options: {forceId: false}, }); + app.model(User, {dataSource: db}); } function resetGlobalPromise() { diff --git a/test/models.test.js b/test/models.test.js index 3201344..96782e9 100644 --- a/test/models.test.js +++ b/test/models.test.js @@ -5,27 +5,31 @@ 'use strict'; -var assert = require('assert'); -var helper = require('./helper'); -var TaskEmitter = require('strong-task-emitter'); +const assert = require('assert'); +const helper = require('./helper'); +const loopback = require('loopback'); +const TaskEmitter = require('strong-task-emitter'); describe('Model tests', function() { - var User; + let User; beforeEach(function() { - User = helper.createModel({ - parent: 'user', - app: helper.createRestAppAndListen(), - datasource: helper.createMemoryDataSource(), - properties: helper.getUserProperties() + const app = helper.createRestAppAndListen(); + const db = helper.createMemoryDataSource(app); + + User = app.registry.createModel({ + name: 'user', + properties: helper.getUserProperties(), + options: {forceId: false}, }); + app.model(User, {dataSource: db}); }); describe('Model.validatesPresenceOf(properties...)', function() { it('should require a model to include a property to be considered valid', function() { User.validatesPresenceOf('first', 'last', 'age'); - var joe = new User({first: 'joe'}); + const joe = new User({first: 'joe'}); assert(joe.isValid() === false, 'model should not validate'); assert(joe.errors.last, 'should have a missing last error'); assert(joe.errors.age, 'should have a missing age error'); @@ -37,7 +41,7 @@ describe('Model tests', function() { function() { User.validatesLengthOf('password', {min: 5, message: {min: 'Password is too short'}}); - var joe = new User({password: '1234'}); + const joe = new User({password: '1234'}); assert(joe.isValid() === false, 'model should not be valid'); assert(joe.errors.password, 'should have password error'); }); @@ -47,7 +51,7 @@ describe('Model tests', function() { it('should require a value for `property` to be in the specified array', function() { User.validatesInclusionOf('gender', {in: ['male', 'female']}); - var foo = new User({gender: 'bar'}); + const foo = new User({gender: 'bar'}); assert(foo.isValid() === false, 'model should not be valid'); assert(foo.errors.gender, 'should have gender error'); }); @@ -57,9 +61,9 @@ describe('Model tests', function() { it('should require a value for `property` to not exist in the specified ' + 'array', function() { User.validatesExclusionOf('domain', {in: ['www', 'billing', 'admin']}); - var foo = new User({domain: 'www'}); - var bar = new User({domain: 'billing'}); - var bat = new User({domain: 'admin'}); + const foo = new User({domain: 'www'}); + const bar = new User({domain: 'billing'}); + const bat = new User({domain: 'admin'}); assert(foo.isValid() === false); assert(bar.isValid() === false); assert(bat.isValid() === false); @@ -73,9 +77,9 @@ describe('Model tests', function() { it('should require a value for `property` to be a specific type of ' + '`Number`', function() { User.validatesNumericalityOf('age', {int: true}); - var joe = new User({age: 10.2}); + const joe = new User({age: 10.2}); assert(joe.isValid() === false); - var bob = new User({age: 0}); + const bob = new User({age: 0}); assert(bob.isValid() === true); assert(joe.errors.age, 'model should have an age error'); }); @@ -84,15 +88,15 @@ describe('Model tests', function() { describe('myModel.isValid()', function() { it('should validate the model instance', function() { User.validatesNumericalityOf('age', {int: true}); - var user = new User({first: 'joe', age: 'flarg'}); - var valid = user.isValid(); + const user = new User({first: 'joe', age: 'flarg'}); + const valid = user.isValid(); assert(valid === false); assert(user.errors.age, 'model should have age error'); }); it('should validate the model asynchronously', function(done) { User.validatesNumericalityOf('age', {int: true}); - var user = new User({first: 'joe', age: 'flarg'}); + const user = new User({first: 'joe', age: 'flarg'}); user.isValid(function(valid) { assert(valid === false); assert(user.errors.age, 'model should have age error'); @@ -115,7 +119,7 @@ describe('Model tests', function() { describe('model.save([options], [callback])', function() { it('should save an instance of a Model to the attached data source', function(done) { - var joe = new User({first: 'Joe', last: 'Bob'}); + const joe = new User({first: 'Joe', last: 'Bob'}); joe.save(function(err, user) { if (err) return done(err); assert(user.id); @@ -218,7 +222,7 @@ describe('Model tests', function() { describe('Model.count([query], callback)', function() { it('should return the count of Model instances in data source', function(done) { - var taskEmitter = new TaskEmitter(); + const taskEmitter = new TaskEmitter(); taskEmitter .task(User, 'create', {first: 'jill', age: 100}) .task(User, 'create', {first: 'bob', age: 200}) diff --git a/test/remote-connector.test.js b/test/remote-connector.test.js index 25b57b9..6a2e6f2 100644 --- a/test/remote-connector.test.js +++ b/test/remote-connector.test.js @@ -5,43 +5,45 @@ 'use strict'; -var assert = require('assert'); -var helper = require('./helper'); +const assert = require('assert'); +const helper = require('./helper'); +const loopback = require('loopback'); describe('RemoteConnector', function() { - var ctx = this; + let serverApp, clientApp, ServerModel, ClientModel; before(function setupServer(done) { - ctx.serverApp = helper.createRestAppAndListen(); - ctx.ServerModel = helper.createModel({ - parent: 'TestModel', - app: ctx.serverApp, - datasource: helper.createMemoryDataSource() + const app = serverApp = helper.createRestAppAndListen(); + const db = helper.createMemoryDataSource(app); + + ServerModel = app.registry.createModel({ + name: 'TestModel', }); - ctx.serverApp.locals.handler.on('listening', function() { done(); }); + app.model(ServerModel, {dataSource: db}); + + app.locals.handler.on('listening', function() { done(); }); }); - before(function setupRemoteClient(done) { - ctx.remoteApp = helper.createRestAppAndListen(); - ctx.RemoteModel = helper.createModel({ - parent: 'TestModel', - app: ctx.remoteApp, - datasource: helper.createRemoteDataSource(ctx.serverApp) + before(function setupRemoteClient() { + const app = clientApp = loopback({localRegistry: true}); + const remoteDs = helper.createRemoteDataSource(clientApp, serverApp); + + ClientModel = app.registry.createModel({ + name: 'TestModel', }); - ctx.remoteApp.locals.handler.on('listening', function() { done(); }); + app.model(ClientModel, {dataSource: remoteDs}); }); after(function() { - ctx.serverApp.locals.handler.close(); - ctx.remoteApp.locals.handler.close(); - ctx.ServerModel = null; - ctx.RemoteModel = null; + serverApp.locals.handler.close(); + ServerModel = null; + ClientModel = null; }); it('should support the save method', function(done) { - var calledServerCreate = false; + let calledServerCreate = false; - ctx.ServerModel.create = function(data, options, cb, callback) { + ServerModel.create = function(data, options, cb, callback) { if (typeof options === 'function') { callback = cb; cb = options; @@ -54,20 +56,20 @@ describe('RemoteConnector', function() { else cb(null, data); }; - var m = new ctx.RemoteModel({foo: 'bar'}); + const m = new ClientModel({foo: 'bar'}); m.save(function(err, instance) { if (err) return done(err); assert(instance); - assert(instance instanceof ctx.RemoteModel); + assert(instance instanceof ClientModel); assert(calledServerCreate); done(); }); }); it('should support aliases', function(done) { - var calledServerUpsert = false; - ctx.ServerModel.patchOrCreate = - ctx.ServerModel.upsert = function(id, options, cb) { + let calledServerUpsert = false; + ServerModel.patchOrCreate = + ServerModel.upsert = function(id, options, cb) { if (typeof options === 'function') { cb = options; options = {}; @@ -77,10 +79,10 @@ describe('RemoteConnector', function() { cb(); }; - ctx.RemoteModel.updateOrCreate({}, function(err, instance) { + ClientModel.updateOrCreate({}, function(err, instance) { if (err) return done(err); assert(instance); - assert(instance instanceof ctx.RemoteModel); + assert(instance instanceof ClientModel); assert(calledServerUpsert, 'server upsert should have been called'); done(); }); @@ -88,46 +90,45 @@ describe('RemoteConnector', function() { }); describe('Custom Path', function() { - var ctx = this; + let serverApp, clientApp, ServerModel, ClientModel; before(function setupServer(done) { - ctx.serverApp = helper.createRestAppAndListen(); - ctx.ServerModel = helper.createModel({ - parent: 'TestModel', - app: ctx.serverApp, - datasource: helper.createMemoryDataSource(), + const app = serverApp = helper.createRestAppAndListen(); + const db = helper.createMemoryDataSource(app); + + ServerModel = app.registry.createModel({ + name: 'TestModel', options: { http: {path: '/custom'} } }); - ctx.serverApp.locals.handler.on('listening', function() { done(); }); + app.model(ServerModel, {dataSource: db}); + + serverApp.locals.handler.on('listening', function() { done(); }); }); - before(function setupRemoteClient(done) { - ctx.remoteApp = helper.createRestAppAndListen(); - ctx.RemoteModel = helper.createModel({ - parent: 'TestModel', - app: ctx.remoteApp, - datasource: helper.createRemoteDataSource(ctx.serverApp), + before(function setupRemoteClient() { + const app = clientApp = loopback({localRegistry: true}); + const remoteDs = helper.createRemoteDataSource(clientApp, serverApp); + + ClientModel = app.registry.createModel({ + name: 'TestModel', options: { dataSource: 'remote', http: {path: '/custom'} } }); - ctx.remoteApp.locals.handler.on('listening', function() { done(); }); + app.model(ClientModel, {dataSource: remoteDs}); }); - after(function(done) - { - ctx.serverApp.locals.handler.close(); - ctx.remoteApp.locals.handler.close(); - ctx.ServerModel = null; - ctx.RemoteModel = null; - done(); + after(function() { + serverApp.locals.handler.close(); + ServerModel = null; + ClientModel = null; }); it('should support http.path configuration', function(done) { - ctx.RemoteModel.create({}, function(err, instance) { + ClientModel.create({}, function(err, instance) { if (err) return done(err); assert(instance); done(); @@ -137,12 +138,13 @@ describe('Custom Path', function() { describe('RemoteConnector with options', () => { it('should have the remoting options passed to the remote object', () => { - const serverApp = helper.createRestAppAndListen(); + const app = loopback(); + const dataSource = app.dataSource('remote', { + url: 'http://example.com', + connector: require('..'), + options: {'test': 'abc'}, + }); - const datasource = helper.createRemoteDataSourceWithOptions( - serverApp, - {'test': 'abc'}); - - assert.deepEqual(datasource.connector.remotes.options, {test: 'abc'}); + assert.deepEqual(dataSource.connector.remotes.options, {test: 'abc'}); }); }); diff --git a/test/remote-models.test.js b/test/remote-models.test.js index fcabee2..21383f8 100644 --- a/test/remote-models.test.js +++ b/test/remote-models.test.js @@ -5,48 +5,50 @@ 'use strict'; -var assert = require('assert'); -var helper = require('./helper'); -var TaskEmitter = require('strong-task-emitter'); +const assert = require('assert'); +const helper = require('./helper'); +const loopback = require('loopback'); +const TaskEmitter = require('strong-task-emitter'); describe('Remote model tests', function() { - var ctx = this; + let serverApp, ServerModel, clientApp, ClientModel; - beforeEach(function(done) { - ctx.serverApp = helper.createRestAppAndListen(); - ctx.ServerModel = helper.createModel({ - parent: 'TestModel', - app: ctx.serverApp, - datasource: helper.createMemoryDataSource(), - properties: helper.userProperties + beforeEach(function setupServer(done) { + const app = serverApp = helper.createRestAppAndListen(); + const db = helper.createMemoryDataSource(app); + + ServerModel = app.registry.createModel({ + name: 'TestModel', + properties: helper.userProperties, + options: {forceId: false}, }); - ctx.serverApp.locals.handler.on('listening', function() { done(); }); + app.model(ServerModel, {dataSource: db}); + + serverApp.locals.handler.on('listening', function() { done(); }); }); - beforeEach(function setupRemoteClient(done) { - ctx.remoteApp = helper.createRestAppAndListen(); - ctx.RemoteModel = helper.createModel({ - parent: 'TestModel', - app: ctx.remoteApp, - datasource: helper.createRemoteDataSource(ctx.serverApp), - properties: helper.userProperties + beforeEach(function setupRemoteClient() { + const app = clientApp = loopback({localRegistry: true}); + const remoteDs = helper.createRemoteDataSource(clientApp, serverApp); + + ClientModel = app.registry.createModel({ + name: 'TestModel', }); - ctx.remoteApp.locals.handler.on('listening', function() { done(); }); + app.model(ClientModel, {dataSource: remoteDs}); }); afterEach(function() { - ctx.serverApp.locals.handler.close(); - ctx.remoteApp.locals.handler.close(); - ctx.ServerModel = null; - ctx.RemoteModel = null; + serverApp.locals.handler.close(); + ServerModel = null; + ClientModel = null; }); describe('Model.create([data], [callback])', function() { it('should create an instance and save to the attached data source', function(done) { - ctx.RemoteModel.create({first: 'Joe', last: 'Bob'}, function(err, user) { + ClientModel.create({first: 'Joe', last: 'Bob'}, function(err, user) { if (err) return done(err); - assert(user instanceof ctx.RemoteModel); + assert(user instanceof ClientModel); done(); }); }); @@ -55,7 +57,7 @@ describe('Remote model tests', function() { describe('model.save([options], [callback])', function() { it('should save an instance of a Model to the attached data source', function(done) { - var joe = new ctx.RemoteModel({first: 'Joe', last: 'Bob'}); + const joe = new ClientModel({first: 'Joe', last: 'Bob'}); joe.save(function(err, user) { if (err) return done(err); assert(user.id); @@ -68,7 +70,7 @@ describe('Remote model tests', function() { describe('model.updateAttributes(data, [callback])', function() { it('should save specified attributes to the attached data source', function(done) { - ctx.ServerModel.create({first: 'joe', age: 100}, function(err, user) { + ServerModel.create({first: 'joe', age: 100}, function(err, user) { if (err) return done(err); assert.equal(user.first, 'joe'); @@ -89,11 +91,11 @@ describe('Remote model tests', function() { describe('Model.upsert(data, callback)', function() { it('should update when a record with id=data.id is found, insert otherwise', function(done) { - ctx.RemoteModel.upsert({first: 'joe', id: 7}, function(err, user) { + ClientModel.upsert({first: 'joe', id: 7}, function(err, user) { if (err) return done(err); assert.equal(user.first, 'joe'); - ctx.RemoteModel.upsert({first: 'bob', id: 7}, function(err, + ClientModel.upsert({first: 'bob', id: 7}, function(err, updatedUser) { if (err) return done(err); assert.equal(updatedUser.first, 'bob'); @@ -106,11 +108,11 @@ describe('Remote model tests', function() { describe('Model.deleteById(id, [callback])', function() { it('should delete a model instance from the attached data source', function(done) { - ctx.ServerModel.create({first: 'joe', last: 'bob'}, function(err, user) { + ServerModel.create({first: 'joe', last: 'bob'}, function(err, user) { if (err) return done(err); - ctx.RemoteModel.deleteById(user.id, function(err) { + ClientModel.deleteById(user.id, function(err) { if (err) return done(err); - ctx.RemoteModel.findById(user.id, function(err, notFound) { + ClientModel.findById(user.id, function(err, notFound) { assert.equal(notFound, null); assert(err && err.statusCode === 404, 'should have failed with HTTP 404'); @@ -124,10 +126,10 @@ describe('Remote model tests', function() { describe('Model.findById(id, callback)', function() { it('should find an instance by id from the attached data source', function(done) { - ctx.ServerModel.create({first: 'michael', last: 'jordan', id: 23}, + ServerModel.create({first: 'michael', last: 'jordan', id: 23}, function(err) { if (err) return done(err); - ctx.RemoteModel.findById(23, function(err, user) { + ClientModel.findById(23, function(err, user) { if (err) return done(err); assert.equal(user.id, 23); assert.equal(user.first, 'michael'); @@ -141,16 +143,16 @@ describe('Remote model tests', function() { describe('Model.count([query], callback)', function() { it('should return the count of Model instances from both data source', function(done) { - var taskEmitter = new TaskEmitter(); + const taskEmitter = new TaskEmitter(); taskEmitter - .task(ctx.ServerModel, 'create', {first: 'jill', age: 100}) - .task(ctx.RemoteModel, 'create', {first: 'bob', age: 200}) - .task(ctx.RemoteModel, 'create', {first: 'jan'}) - .task(ctx.ServerModel, 'create', {first: 'sam'}) - .task(ctx.ServerModel, 'create', {first: 'suzy'}) + .task(ServerModel, 'create', {first: 'jill', age: 100}) + .task(ClientModel, 'create', {first: 'bob', age: 200}) + .task(ClientModel, 'create', {first: 'jan'}) + .task(ServerModel, 'create', {first: 'sam'}) + .task(ServerModel, 'create', {first: 'suzy'}) .on('done', function(err) { if (err) return done(err); - ctx.RemoteModel.count({age: {gt: 99}}, function(err, count) { + ClientModel.count({age: {gt: 99}}, function(err, count) { if (err) return done(err); assert.equal(count, 2); done();