Merge pull request #1763 from strongloop/fix/PK-coercion-in-replaceById

Fix coercion of PK value in `replaceById` method
This commit is contained in:
Miroslav Bajtoš 2019-07-26 09:22:27 +02:00 committed by GitHub
commit 74c43ca358
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 0 deletions

View File

@ -2609,6 +2609,11 @@ DataAccessObject.replaceById = function(id, data, options, cb) {
err.statusCode = 400;
process.nextTick(function() { cb(err); });
return cb.promise;
} else {
// Ensure any type conversion applied by the instance constructor
// on `data.id` is applied on the `id` value too.
// Typically, MongoDB converts PK value from a string to an ObjectID.
id = inst[pkName];
}
let context = {

View File

@ -1576,6 +1576,33 @@ describe('manipulation', function() {
done();
});
});
it('correctly coerces the PK value', async () => {
const created = await Post.create({
title: 'a title',
content: 'a content',
});
// Emulate what happens when model instance is received by REST API clients
const data = JSON.parse(JSON.stringify(created));
// Modify some of the data
data.title = 'Draft';
// Call replaceById to modify the database record
await Post.replaceById(data.id, data);
// Verify what has been stored
const found = await Post.findById(data.id);
found.toObject().should.eql({
id: created.id,
title: 'Draft',
content: 'a content',
});
// Verify that no warnings were triggered
Object.keys(Post._warned).should.be.empty();
});
});
describe('findOrCreate', function() {