Fix generated string id's

Co-authored-by: Miroslav Bajtoš <mbajtoss@gmail.com>
This commit is contained in:
Francisco Buceta 2019-11-15 16:15:38 +01:00
parent b07bdfc71a
commit b9f0284a28
No known key found for this signature in database
GPG Key ID: 560C96FB51235652
3 changed files with 46 additions and 1 deletions

View File

@ -719,7 +719,7 @@ DataSource.prototype.setupDataAccess = function(modelClass, settings) {
// Check if the id property should be generated // Check if the id property should be generated
const idName = modelClass.definition.idName(); const idName = modelClass.definition.idName();
const idProp = modelClass.definition.rawProperties[idName]; const idProp = modelClass.definition.rawProperties[idName];
if (idProp && idProp.generated && this.connector.getDefaultIdType) { if (idProp && idProp.generated && idProp.useDefaultIdType !== false && this.connector.getDefaultIdType) {
// Set the default id type from connector's ability // Set the default id type from connector's ability
const idType = this.connector.getDefaultIdType() || String; const idType = this.connector.getDefaultIdType() || String;
idProp.type = idType; idProp.type = idType;

View File

@ -648,6 +648,16 @@ describe('DataSource define model', function() {
done(); done();
}); });
it('injects id with useDefaultIdType to false', function(done) {
const ds = new ModelBuilder();
const User = ds.define('User', {id: {type: String, generated: true, id: true, useDefaultIdType: false}});
assert.deepEqual(User.definition.properties.id,
{type: String, id: true, generated: true, updateOnly: true, useDefaultIdType: false});
done();
});
it('disables idInjection if the value is false', function(done) { it('disables idInjection if the value is false', function(done) {
const ds = new ModelBuilder(); const ds = new ModelBuilder();

View File

@ -2662,6 +2662,41 @@ describe('manipulation', function() {
null, // databases representing `undefined` as `null` (e.g. SQL) null, // databases representing `undefined` as `null` (e.g. SQL)
]); ]);
}); });
it('preserves custom type of auto-generated id property', async () => {
// NOTE: This test is trying to reproduce the behavior observed
// when using property defined as follows:
// {type: 'string', generated: true, mongodb: {dataType: 'ObjectID'}}
// We want to test that behavior for all connectors, which is tricky,
// because not all connectors support autogenerated string PK values.
const User = db.define('UserWithStringId', {
id: {
type: String,
id: true,
useDefaultIdType: false,
// `useDefaultIdType` is applied only when `generated: true`
generated: true,
},
name: String,
}, {forceId: false});
// disable `generated: true` because many SQL databases cannot
// auto-generate string ids
User.definition.properties.id.generated = false;
User.definition.rawProperties.id.generated = false;
await db.automigrate(User.modelName);
const userId = 'custom user id';
const createdUser = await User.create({id: userId, name: 'testUser'});
// strict equality check
createdUser.id.should.equal(userId);
const foundUser = await User.findById(userId);
// strict equality check
foundUser.id.should.equal(userId);
});
}); });
}); });