UNPKG

jugglingdb

Version:

Node.js ORM for every database: redis, mysql, mongodb, postgres, sqlite, ...

264 lines (237 loc) 9 kB
'use strict'; // This test written in mocha+should.js var should = require('./init.js'); var db = void 0, User = void 0, Post = void 0, Passport = void 0, City = void 0, Street = void 0, Building = void 0, Asset = void 0; var nbSchemaRequests = 0; var createdUsers = []; describe('include', function () { before(setup); it('should fetch belongsTo relation', function (done) { Passport.all({ include: 'owner' }, function (err, passports) { passports.length.should.be.ok; passports.forEach(function (p) { p.__cachedRelations.should.have.property('owner'); var owner = p.__cachedRelations.owner; if (!p.ownerId) { should.not.exist(owner); } else { should.exist(owner); owner.id.should.equal(p.ownerId); } }); done(); }); }); it('should fetch hasMany relation', function (done) { User.all({ include: 'posts' }, function (err, users) { should.not.exist(err); should.exist(users); users.length.should.be.ok; users.forEach(function (u) { u.__cachedRelations.should.have.property('posts'); u.__cachedRelations.posts.forEach(function (p) { p.userId.should.equal(u.id); }); }); done(); }); }); it('should fetch hasAndBelongsToMany relation', function (done) { User.all({ include: ['assets'] }, function (err, users) { should.not.exist(err); should.exist(users); users.length.should.be.ok; users.forEach(function (user) { user.__cachedRelations.should.have.property('assets'); if (user.id === createdUsers[0].id) { user.__cachedRelations.assets.should.have.length(3); } if (user.id === createdUsers[1].id) { user.__cachedRelations.assets.should.have.length(1); } user.__cachedRelations.assets.forEach(function (a) { a.url.should.startWith('http://placekitten.com'); }); }); done(); }); }); it('should fetch Passport - Owner - Posts', function (done) { Passport.all({ include: { owner: 'posts' } }, function (err, passports) { should.not.exist(err); should.exist(passports); passports.length.should.be.ok; passports.forEach(function (p) { p.__cachedRelations.should.have.property('owner'); var user = p.__cachedRelations.owner; if (!p.ownerId) { should.not.exist(user); } else { should.exist(user); user.id.should.equal(p.ownerId); user.__cachedRelations.should.have.property('posts'); user.__cachedRelations.posts.forEach(function (pp) { pp.userId.should.equal(user.id); }); } }); done(); }); }); it('should fetch Passports - User - Posts - User', function (done) { Passport.all({ include: { owner: { posts: 'author' } } }, function (err, passports) { should.not.exist(err); should.exist(passports); passports.length.should.be.ok; passports.forEach(function (p) { p.__cachedRelations.should.have.property('owner'); var user = p.__cachedRelations.owner; if (!p.ownerId) { should.not.exist(user); } else { should.exist(user); user.id.should.equal(p.ownerId); user.__cachedRelations.should.have.property('posts'); user.__cachedRelations.posts.forEach(function (pp) { pp.userId.should.equal(user.id); pp.__cachedRelations.should.have.property('author'); var author = pp.__cachedRelations.author; author.id.should.equal(user.id); }); } }); done(); }); }); it('should fetch User - Posts AND Passports', function (done) { User.all({ include: ['posts', 'passports'] }, function (err, users) { should.not.exist(err); should.exist(users); users.length.should.be.ok; users.forEach(function (user) { user.__cachedRelations.should.have.property('posts'); user.__cachedRelations.should.have.property('passports'); user.__cachedRelations.posts.forEach(function (p) { p.userId.should.equal(user.id); }); user.__cachedRelations.passports.forEach(function (pp) { pp.ownerId.should.equal(user.id); }); }); done(); }); }); }); function setup(done) { db = getSchema(); City = db.define('City'); Street = db.define('Street'); Building = db.define('Building'); User = db.define('User', { name: String, age: Number }); Passport = db.define('Passport', { number: String }); Post = db.define('Post', { title: String }); Asset = db.define('Asset', { url: String }); Passport.belongsTo('owner', { model: User }); User.hasMany('passports', { foreignKey: 'ownerId' }); User.hasMany('posts', { foreignKey: 'userId' }); Post.belongsTo('author', { model: User, foreignKey: 'userId' }); User.hasAndBelongsToMany('assets'); db.automigrate(function () { var createdPassports = []; var createdPosts = []; var createdAssets = []; createUsers(); function createUsers() { clearAndCreate(User, [{ name: 'User A', age: 21 }, { name: 'User B', age: 22 }, { name: 'User C', age: 23 }, { name: 'User D', age: 24 }, { name: 'User E', age: 25 }], function (items) { createdUsers = items; createPassports(); }); } function createPassports() { clearAndCreate(Passport, [{ number: '1', ownerId: createdUsers[0].id }, { number: '2', ownerId: createdUsers[1].id }, { number: '3' }], function (items) { createdPassports = items; createPosts(); }); } function createPosts() { clearAndCreate(Post, [{ title: 'Post A', userId: createdUsers[0].id }, { title: 'Post B', userId: createdUsers[0].id }, { title: 'Post C', userId: createdUsers[0].id }, { title: 'Post D', userId: createdUsers[1].id }, { title: 'Post E' }], function (items) { createdPosts = items; createAssets(); }); } function createAssets() { clearAndCreateScoped('assets', [{ url: 'http://placekitten.com/200/200' }, { url: 'http://placekitten.com/300/300' }, { url: 'http://placekitten.com/400/400' }, { url: 'http://placekitten.com/500/500' }], [createdUsers[0], createdUsers[0], createdUsers[0], createdUsers[1]], function (items) { createdAssets = items; done(); }); } }); } function clearAndCreate(model, data, callback) { var createdItems = []; model.destroyAll(function () { nextItem(null, null); }); var itemIndex = 0; function nextItem(err, lastItem) { if (lastItem !== null) { createdItems.push(lastItem); } if (itemIndex >= data.length) { callback(createdItems); return; } model.create(data[itemIndex], nextItem); itemIndex++; } } function clearAndCreateScoped(modelName, data, scope, callback) { var createdItems = []; var clearedItemIndex = 0; if (scope && scope.length) { scope.forEach(function (instance) { instance[modelName].destroyAll(function (err) { clearedItemIndex++; if (clearedItemIndex >= scope.length) { createItems(); } }); }); } else { callback(createdItems); } var itemIndex = 0; function nextItem(err, lastItem) { itemIndex++; if (lastItem !== null) { createdItems.push(lastItem); } if (itemIndex >= data.length) { callback(createdItems); return; } } function createItems() { scope.forEach(function (instance, instanceIndex) { instance[modelName].create(data[instanceIndex], nextItem); }); } }