不要怂,就是干,撸起袖子干!

Commit 5d27f33c by Edgar Veiga

Add getOrCreate method + proper testing.

1 parent d4ed9d39
Showing with 80 additions and 0 deletions
......@@ -194,6 +194,34 @@ module.exports = (function() {
return this.build(values).save(fields)
}
DAOFactory.prototype.getOrCreate = function (params, defaults) {
var self = this;
return new Utils.CustomEventEmitter(function (emitter) {
self.find({
where: params
}).success(function (instance) {
if (instance === null) {
for (var attrname in defaults) {
params[attrname] = defaults[attrname];
}
self.create(params)
.success(function (instance) {
emitter.emit('success', instance)
})
.error( function (erro) {
emitter.emit('error', error)
});
} else {
emitter.emit('success', instance)
}
}).error(function (error) {
emitter.emit('error', error)
});
}).run()
}
DAOFactory.prototype.__defineGetter__('primaryKeys', function() {
var result = {}
Utils._.each(this.attributes, function(dataTypeString, attributeName) {
......
......@@ -28,6 +28,58 @@ dialects.forEach(function(dialect) {
})
})
describe('getOrCreate', function () {
it("Returns instace if already existent. Single find field.", function (done) {
var self = this,
data = {
username: 'Username'
};
this.User.create(data).success(function (user) {
self.User.getOrCreate({
username: user.username
}).success(function (_user) {
expect(_user.id).toEqual(user.id)
expect(_user.username).toEqual('Username')
done()
})
})
})
it("Returns instace if already existent. Multiple find fields.", function (done) {
var self = this,
data = {
username: 'Username',
data: 'ThisIsData'
};
this.User.create(data).success(function (user) {
self.User.getOrCreate(data).success(function (_user) {
expect(_user.id).toEqual(user.id)
expect(_user.username).toEqual('Username')
expect(_user.data).toEqual('ThisIsData')
done()
})
})
})
it("Creates new instance with default value.", function (done) {
var self = this,
data = {
username: 'Username'
},
default_values = {
data: 'ThisIsData'
};
this.User.getOrCreate(data, default_values).success(function (user) {
expect(user.username).toEqual('Username')
expect(user.data).toEqual('ThisIsData')
done()
})
})
})
describe('create', function() {
it('should only store the values passed in the witelist', function(done) {
var self = this
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!