More hasAndBelongsToMany tests

This commit is contained in:
Fabien Franzen 2014-07-26 17:20:25 +02:00
parent 9f94ec9bde
commit d1896553fd
2 changed files with 99 additions and 29 deletions

View File

@ -574,6 +574,21 @@ HasMany.prototype.destroyById = function (fkId, cb) {
});
};
var throughKeys = function(definition) {
var modelThrough = definition.modelThrough;
var pk2 = definition.modelTo.definition.idName();
if (definition.typeTo) { // polymorphic
var fk1 = definition.keyTo;
var fk2 = definition.keyThrough;
} else {
var fk1 = findBelongsTo(modelThrough, definition.modelFrom,
definition.keyFrom);
var fk2 = findBelongsTo(modelThrough, definition.modelTo, pk2);
}
return [fk1, fk2];
}
/**
* Find a related item by foreign key
* @param {*} fkId The foreign key value
@ -664,14 +679,9 @@ HasManyThrough.prototype.create = function create(data, done) {
// The primary key for the target model
var pk2 = definition.modelTo.definition.idName();
if (definition.typeTo) { // polymorphic
var fk1 = definition.keyTo;
var fk2 = definition.keyThrough;
} else {
var fk1 = findBelongsTo(modelThrough, definition.modelFrom,
definition.keyFrom);
var fk2 = findBelongsTo(modelThrough, definition.modelTo, pk2);
}
var keys = throughKeys(definition);
var fk1 = keys[0];
var fk2 = keys[1];
var d = {};
d[fk1] = modelInstance[definition.keyFrom];
@ -694,6 +704,8 @@ HasManyThrough.prototype.create = function create(data, done) {
});
};
/**
* Add the target model instance to the 'hasMany' relation
* @param {Object|ID} acInst The actual instance or id value
@ -706,14 +718,13 @@ HasManyThrough.prototype.add = function (acInst, done) {
var data = {};
var query = {};
var fk1 = findBelongsTo(modelThrough, definition.modelFrom,
definition.keyFrom);
// The primary key for the target model
var pk2 = definition.modelTo.definition.idName();
var fk2 = findBelongsTo(modelThrough, definition.modelTo, pk2);
var keys = throughKeys(definition);
var fk1 = keys[0];
var fk2 = keys[1];
query[fk1] = this.modelInstance[pk1];
query[fk2] = (acInst instanceof definition.modelTo) ? acInst[pk2] : acInst;
@ -724,6 +735,7 @@ HasManyThrough.prototype.add = function (acInst, done) {
data[fk1] = this.modelInstance[pk1];
data[fk2] = (acInst instanceof definition.modelTo) ? acInst[pk2] : acInst;
definition.applyProperties(this.modelInstance, data);
// Create an instance of the through model
@ -749,15 +761,12 @@ HasManyThrough.prototype.exists = function (acInst, done) {
var data = {};
var query = {};
var fk1 = findBelongsTo(modelThrough, definition.modelFrom,
definition.keyFrom);
// The primary key for the target model
var pk2 = definition.modelTo.definition.idName();
var fk2 = findBelongsTo(modelThrough, definition.modelTo, pk2);
query[fk1] = this.modelInstance[pk1];
var keys = throughKeys(definition);
var fk1 = keys[0];
var fk2 = keys[1];
query[fk2] = (acInst instanceof definition.modelTo) ? acInst[pk2] : acInst;
@ -781,13 +790,12 @@ HasManyThrough.prototype.remove = function (acInst, done) {
var query = {};
var fk1 = findBelongsTo(modelThrough, definition.modelFrom,
definition.keyFrom);
// The primary key for the target model
var pk2 = definition.modelTo.definition.idName();
var fk2 = findBelongsTo(modelThrough, definition.modelTo, pk2);
var keys = throughKeys(definition);
var fk1 = keys[0];
var fk2 = keys[1];
query[fk1] = this.modelInstance[pk1];
query[fk2] = (acInst instanceof definition.modelTo) ? acInst[pk2] : acInst;
@ -795,7 +803,7 @@ HasManyThrough.prototype.remove = function (acInst, done) {
var filter = { where: query };
definition.applyScope(this.modelInstance, filter);
modelThrough.deleteAll(filter.where, function (err) {
if (!err) {
self.removeFromCache(query[fk2]);

View File

@ -792,7 +792,7 @@ describe('relations', function () {
});
it('should create polymorphic relation - author', function (done) {
Author.create({ id: 3, name: 'Author 1' }, function (err, author) {
Author.create({ id: 4, name: 'Author 1' }, function (err, author) {
author.pictures.create({ name: 'Author Pic 1' }, function (err, p) {
should.not.exist(err);
p.id.should.equal(1);
@ -819,14 +819,14 @@ describe('relations', function () {
PictureLink.findOne(function(err, link) {
should.not.exist(err);
link.pictureId.should.equal(1);
link.imageableId.should.equal(3);
link.imageableId.should.equal(4);
link.imageableType.should.equal('Author');
done();
});
});
it('should get polymorphic relation through model - author', function (done) {
Author.findById(3, function(err, author) {
Author.findById(4, function(err, author) {
should.not.exist(err);
author.name.should.equal('Author 1');
author.pictures(function(err, pics) {
@ -851,6 +851,68 @@ describe('relations', function () {
});
});
});
it('should include polymorphic items', function (done) {
Author.find({ include: 'pictures' }, function(err, authors) {
authors.should.have.length(1);
authors[0].pictures(function(err, pics) {
pics[0].name.should.equal('Author Pic 1');
pics[1].name.should.equal('Author Pic 2');
done();
});
});
});
it('should add to a polymorphic relation - author', function (done) {
Author.findById(4, function(err, author) {
Picture.create({ id: 7, name: 'Example' }, function(err, p) {
author.pictures.add(p, function(err, link) {
link.should.be.instanceof(PictureLink);
link.pictureId.should.equal(7);
link.imageableId.should.equal(4);
link.imageableType.should.equal('Author');
done();
});
});
});
});
it('should create polymorphic through model', function (done) {
PictureLink.findOne({ where: { pictureId: 7 } }, function(err, link) {
should.not.exist(err);
link.pictureId.should.equal(7);
link.imageableId.should.equal(4);
link.imageableType.should.equal('Author');
done();
});
});
it('should check if polymorphic relation exists - author', function (done) {
Author.findById(4, function(err, author) {
author.pictures.exists(7, function(err, exists) {
exists.should.be.true;
done();
});
});
});
it('should remove from a polymorphic relation - author', function (done) {
Author.findById(4, function(err, author) {
author.pictures.remove(7, function(err) {
should.not.exist(err);
done();
});
});
});
it('should check if polymorphic relation exists - author', function (done) {
Author.findById(4, function(err, author) {
author.pictures.exists(7, function(err, exists) {
exists.should.be.false;
done();
});
});
});
});