Merge pull request #600 from strongloop/feature/fix-lb-1401
Fix for https://github.com/strongloop/loopback/issues/1401
This commit is contained in:
commit
5977c1f872
|
@ -1,5 +1,6 @@
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var utils = require('./utils');
|
var utils = require('./utils');
|
||||||
|
var List = require('./list');
|
||||||
var isPlainObject = utils.isPlainObject;
|
var isPlainObject = utils.isPlainObject;
|
||||||
var defineCachedRelations = utils.defineCachedRelations;
|
var defineCachedRelations = utils.defineCachedRelations;
|
||||||
|
|
||||||
|
@ -734,6 +735,9 @@ Inclusion.include = function (objects, include, options, cb) {
|
||||||
*/
|
*/
|
||||||
function setIncludeData(result, cb) {
|
function setIncludeData(result, cb) {
|
||||||
if (obj === inst) {
|
if (obj === inst) {
|
||||||
|
if (Array.isArray(result) && !(result instanceof List)) {
|
||||||
|
result = new List(result, relation.modelTo);
|
||||||
|
}
|
||||||
obj.__data[relationName] = result;
|
obj.__data[relationName] = result;
|
||||||
obj.setStrict(false);
|
obj.setStrict(false);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
// This test written in mocha+should.js
|
// This test written in mocha+should.js
|
||||||
var should = require('./init.js');
|
var should = require('./init.js');
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
|
var assert = require('assert');
|
||||||
|
|
||||||
|
var DataSource = require('../').DataSource;
|
||||||
|
|
||||||
var db, User, Profile, AccessToken, Post, Passport, City, Street, Building, Assembly, Part;
|
var db, User, Profile, AccessToken, Post, Passport, City, Street, Building, Assembly, Part;
|
||||||
|
|
||||||
|
@ -690,3 +693,95 @@ function clearAndCreate(model, data, callback) {
|
||||||
itemIndex++;
|
itemIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
describe('Model instance with included relation .toJSON()', function() {
|
||||||
|
var db, ChallengerModel, GameParticipationModel, ResultModel;
|
||||||
|
|
||||||
|
before(function(done) {
|
||||||
|
db = new DataSource({connector: 'memory'});
|
||||||
|
ChallengerModel = db.createModel('Challenger',
|
||||||
|
{
|
||||||
|
name: String
|
||||||
|
},
|
||||||
|
{
|
||||||
|
relations: {
|
||||||
|
gameParticipations: {
|
||||||
|
type: 'hasMany',
|
||||||
|
model: 'GameParticipation',
|
||||||
|
foreignKey: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
GameParticipationModel = db.createModel('GameParticipation',
|
||||||
|
{
|
||||||
|
date: Date
|
||||||
|
},
|
||||||
|
{
|
||||||
|
relations: {
|
||||||
|
challenger: {
|
||||||
|
type: 'belongsTo',
|
||||||
|
model: 'Challenger',
|
||||||
|
foreignKey: ''
|
||||||
|
},
|
||||||
|
results: {
|
||||||
|
type: 'hasMany',
|
||||||
|
model: 'Result',
|
||||||
|
foreignKey: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
ResultModel = db.createModel('Result', {
|
||||||
|
points: Number,
|
||||||
|
}, {
|
||||||
|
relations: {
|
||||||
|
gameParticipation: {
|
||||||
|
type: 'belongsTo',
|
||||||
|
model: 'GameParticipation',
|
||||||
|
foreignKey: ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
async.waterfall([
|
||||||
|
createChallengers,
|
||||||
|
createGameParticipations,
|
||||||
|
createResults],
|
||||||
|
function(err) {
|
||||||
|
done(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
function createChallengers(callback) {
|
||||||
|
ChallengerModel.create([{name: 'challenger1'}, {name: 'challenger2'}], callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createGameParticipations(challengers, callback) {
|
||||||
|
GameParticipationModel.create([
|
||||||
|
{challengerId: challengers[0].id, date: Date.now()},
|
||||||
|
{challengerId: challengers[0].id, date: Date.now()}
|
||||||
|
], callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createResults(gameParticipations, callback) {
|
||||||
|
ResultModel.create([
|
||||||
|
{gameParticipationId: gameParticipations[0].id, points: 10},
|
||||||
|
{gameParticipationId: gameParticipations[0].id, points: 20}
|
||||||
|
], callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
it('should recursively serialize objects', function(done) {
|
||||||
|
var filter = {include: {gameParticipations: 'results'}};
|
||||||
|
ChallengerModel.find(filter, function(err, challengers) {
|
||||||
|
|
||||||
|
var levelOneInclusion = challengers[0].toJSON().gameParticipations[0];
|
||||||
|
assert(levelOneInclusion.__data === undefined, '.__data of a level 1 inclusion is undefined.');
|
||||||
|
|
||||||
|
var levelTwoInclusion = challengers[0].toJSON().gameParticipations[0].results[0];
|
||||||
|
assert(levelTwoInclusion.__data === undefined, '__data of a level 2 inclusion is undefined.');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in New Issue