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

Commit 118460f9 by sdepold

check all specs for every single dialect

1 parent bbd796f4
Showing with 411 additions and 401 deletions
var config = require("./config/config") var config = require("./config/config")
, Sequelize = require("../index") , Sequelize = require("../index")
, sequelize = new Sequelize(config.database, config.username, config.password, { logging: false }) , dialects = ['sqlite', 'mysql']
, Helpers = new (require("./config/helpers"))(sequelize)
describe('Model', function() { describe('Model', function() {
var User = null dialects.forEach(function(dialect) {
describe('with dialect "' + dialect + '"', function() {
var setup = function() { var User = null
Helpers.async(function(done) { , sequelize = new Sequelize(config.database, config.username, config.password, {
User = sequelize.define('User', { username: Sequelize.STRING }) logging: false,
User.sync({ force: true }).success(done) dialect: dialect
}) })
} , Helpers = new (require("./config/helpers"))(sequelize)
beforeEach(function() { Helpers.dropAllTables(); setup() })
afterEach(function() { Helpers.dropAllTables() })
describe('Validations', function() { var setup = function() {
var checks = { Helpers.async(function(done) {
is : { User = sequelize.define('User', { username: Sequelize.STRING })
spec : { args: ["[a-z]",'i'] }, User.sync({ force: true }).success(done)
fail: "0", })
pass: "a"
}
, not : {
spec: { args: ["[a-z]",'i'] },
fail: "a",
pass: "0"
}
, isEmail : {
fail: "a",
pass: "abc@abc.com"
}
, isUrl : {
fail: "abc",
pass: "http://abc.com"
}
, isIP : {
fail: "abc",
pass: "129.89.23.1"
}
, isAlpha : {
fail: "012",
pass: "abc"
}
, isAlphanumeric : {
fail: "_abc019",
pass: "abc019"
}
, isNumeric : {
fail: "abc",
pass: "019"
}
, isInt : {
fail: "9.2",
pass: "-9"
}
, isLowercase : {
fail: "AB",
pass: "ab"
}
, isUppercase : {
fail: "ab",
pass: "AB"
}
, isDecimal : {
fail: "a",
pass: "0.2"
}
, isFloat : {
fail: "a",
pass: "9.2"
}
, notNull : {
fail: null,
pass: 0
}
, isNull : {
fail: 0,
pass: null
}
, notEmpty : {
fail: " ",
pass: "a"
}
, equals : {
spec : { args : "bla bla bla" },
fail: "bla",
pass: "bla bla bla"
}
, contains : {
spec : { args : "bla" },
fail: "la",
pass: "0bla23"
}
, notContains : {
spec : { args : "bla" },
fail: "0bla23",
pass: "la"
}
, regex : {
spec : { args: ["[a-z]",'i'] },
fail: "0",
pass: "a"
}
, notRegex : {
spec: { args: ["[a-z]",'i'] },
fail: "a",
pass: "0"
}
, len : {
spec: { args: [2,4] },
fail: ["1", "12345"],
pass: ["12", "123", "1234"],
raw: true
}
, isUUID : {
spec: { args: 4 },
fail: "f47ac10b-58cc-3372-a567-0e02b2c3d479",
pass: "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
, isDate : {
fail: "not a date",
pass: "2011-02-04"
}
, isAfter : {
spec: { args: "2011-11-05" },
fail: "2011-11-04",
pass: "2011-11-05"
}
, isBefore : {
spec: { args: "2011-11-05" },
fail: "2011-11-06",
pass: "2011-11-05"
}
, isIn : {
spec: { args: "abcdefghijk" },
fail: "ghik",
pass: "ghij"
}
, notIn : {
spec: { args: "abcdefghijk" },
fail: "ghij",
pass: "ghik"
}
, max : {
spec: { args: 23 },
fail: "24",
pass: "23"
}
, min : {
spec: { args: 23 },
fail: "22",
pass: "23"
}
, isArray : {
fail: 22,
pass: [22]
}
, isCreditCard : {
fail: "401288888888188f",
pass: "4012888888881881"
} }
};
var User, i; beforeEach(function() { Helpers.dropAllTables(); setup() })
afterEach(function() { Helpers.dropAllTables() })
it('should correctly validate using node-validator methods', function() { describe('Validations', function() {
Helpers.async(function(done) { var checks = {
for (var validator in checks) { is : {
if (checks.hasOwnProperty(validator)) { spec : { args: ["[a-z]",'i'] },
// build spec fail: "0",
var v = {}; pass: "a"
v[validator] = checks[validator].hasOwnProperty("spec") ? checks[validator].spec : {}; }
, not : {
var check = checks[validator]; spec: { args: ["[a-z]",'i'] },
fail: "a",
// test for failure pass: "0"
if (!check.hasOwnProperty("raw")) }
check.fail = new Array(check.fail); , isEmail : {
fail: "a",
for (i=0; i<check.fail.length; ++i) { pass: "abc@abc.com"
v[validator].msg = validator + "(" + check.fail[i] + ")"; }
, isUrl : {
// define user fail: "abc",
User = sequelize.define('User' + Math.random(), { pass: "http://abc.com"
name: { }
type: Sequelize.STRING, , isIP : {
validate: v fail: "abc",
pass: "129.89.23.1"
}
, isAlpha : {
fail: "012",
pass: "abc"
}
, isAlphanumeric : {
fail: "_abc019",
pass: "abc019"
}
, isNumeric : {
fail: "abc",
pass: "019"
}
, isInt : {
fail: "9.2",
pass: "-9"
}
, isLowercase : {
fail: "AB",
pass: "ab"
}
, isUppercase : {
fail: "ab",
pass: "AB"
}
, isDecimal : {
fail: "a",
pass: "0.2"
}
, isFloat : {
fail: "a",
pass: "9.2"
}
, notNull : {
fail: null,
pass: 0
}
, isNull : {
fail: 0,
pass: null
}
, notEmpty : {
fail: " ",
pass: "a"
}
, equals : {
spec : { args : "bla bla bla" },
fail: "bla",
pass: "bla bla bla"
}
, contains : {
spec : { args : "bla" },
fail: "la",
pass: "0bla23"
}
, notContains : {
spec : { args : "bla" },
fail: "0bla23",
pass: "la"
}
, regex : {
spec : { args: ["[a-z]",'i'] },
fail: "0",
pass: "a"
}
, notRegex : {
spec: { args: ["[a-z]",'i'] },
fail: "a",
pass: "0"
}
, len : {
spec: { args: [2,4] },
fail: ["1", "12345"],
pass: ["12", "123", "1234"],
raw: true
}
, isUUID : {
spec: { args: 4 },
fail: "f47ac10b-58cc-3372-a567-0e02b2c3d479",
pass: "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
, isDate : {
fail: "not a date",
pass: "2011-02-04"
}
, isAfter : {
spec: { args: "2011-11-05" },
fail: "2011-11-04",
pass: "2011-11-05"
}
, isBefore : {
spec: { args: "2011-11-05" },
fail: "2011-11-06",
pass: "2011-11-05"
}
, isIn : {
spec: { args: "abcdefghijk" },
fail: "ghik",
pass: "ghij"
}
, notIn : {
spec: { args: "abcdefghijk" },
fail: "ghij",
pass: "ghik"
}
, max : {
spec: { args: 23 },
fail: "24",
pass: "23"
}
, min : {
spec: { args: 23 },
fail: "22",
pass: "23"
}
, isArray : {
fail: 22,
pass: [22]
}
, isCreditCard : {
fail: "401288888888188f",
pass: "4012888888881881"
}
};
var User, i;
it('should correctly validate using node-validator methods', function() {
Helpers.async(function(done) {
for (var validator in checks) {
if (checks.hasOwnProperty(validator)) {
// build spec
var v = {};
v[validator] = checks[validator].hasOwnProperty("spec") ? checks[validator].spec : {};
var check = checks[validator];
// test for failure
if (!check.hasOwnProperty("raw"))
check.fail = new Array(check.fail);
for (i=0; i<check.fail.length; ++i) {
v[validator].msg = validator + "(" + check.fail[i] + ")";
// define user
User = sequelize.define('User' + Math.random(), {
name: {
type: Sequelize.STRING,
validate: v
}
});
var u_fail = User.build({
name : check.fail[i]
});
var errors = u_fail.validate();
expect(errors).toNotBe(null);
expect(errors).toEqual({
name : [v[validator].msg]
});
} }
}); // test for success
if (!check.hasOwnProperty("raw"))
var u_fail = User.build({ check.pass = new Array(check.pass);
name : check.fail[i]
}); for (i=0; i<check.pass.length; ++i) {
var errors = u_fail.validate(); v[validator].msg = validator + "(" + check.pass[i] + ")";
expect(errors).toNotBe(null);
expect(errors).toEqual({ // define user
name : [v[validator].msg] User = sequelize.define('User' + Math.random(), {
}); name: {
} type: Sequelize.STRING,
// test for success validate: v
if (!check.hasOwnProperty("raw")) }
check.pass = new Array(check.pass); });
for (i=0; i<check.pass.length; ++i) { var u_success = User.build({
v[validator].msg = validator + "(" + check.pass[i] + ")"; name : check.pass[i]
});
// define user expect(u_success.validate()).toBe(null);
User = sequelize.define('User' + Math.random(), {
name: {
type: Sequelize.STRING,
validate: v
} }
});
var u_success = User.build({
name : check.pass[i]
});
expect(u_success.validate()).toBe(null);
}
}
} // for each check
done();
});
});
it('should correctly validate using custom validation methods', function() {
Helpers.async(function(done) {
User = sequelize.define('User' + Math.random(), {
name: {
type: Sequelize.STRING,
validate: {
customFn: function(val) {
if (val !== "2")
throw new Error("name should equal '2'")
} }
} } // for each check
}
});
var u_fail = User.build({ done();
name : "3" });
});
var errors = u_fail.validate();
expect(errors).toNotBe(null);
expect(errors).toEqual({
name : ["name should equal '2'"]
}); });
var u_success = User.build({ it('should correctly validate using custom validation methods', function() {
name : "2" Helpers.async(function(done) {
User = sequelize.define('User' + Math.random(), {
name: {
type: Sequelize.STRING,
validate: {
customFn: function(val) {
if (val !== "2")
throw new Error("name should equal '2'")
}
}
}
});
var u_fail = User.build({
name : "3"
});
var errors = u_fail.validate();
expect(errors).toNotBe(null);
expect(errors).toEqual({
name : ["name should equal '2'"]
});
var u_success = User.build({
name : "2"
});
expect(u_success.validate()).toBe(null);
done();
});
}); });
expect(u_success.validate()).toBe(null); })
done();
});
});
})
describe('isNewRecord', function() { describe('isNewRecord', function() {
it('returns true for non-saved objects', function() { it('returns true for non-saved objects', function() {
var user = User.build({ username: 'user' }) var user = User.build({ username: 'user' })
expect(user.id).toBeNull() expect(user.id).toBeNull()
expect(user.isNewRecord).toBeTruthy() expect(user.isNewRecord).toBeTruthy()
}) })
it("returns false for saved objects", function() { it("returns false for saved objects", function() {
Helpers.async(function(done) { Helpers.async(function(done) {
User.build({ username: 'user' }).save().success(function(user) { User.build({ username: 'user' }).save().success(function(user) {
expect(user.isNewRecord).toBeFalsy() expect(user.isNewRecord).toBeFalsy()
done() done()
})
})
}) })
})
})
it("returns false for created objects", function() { it("returns false for created objects", function() {
Helpers.async(function(done) { Helpers.async(function(done) {
User.create({ username: 'user' }).success(function(user) { User.create({ username: 'user' }).success(function(user) {
expect(user.isNewRecord).toBeFalsy() expect(user.isNewRecord).toBeFalsy()
done() done()
})
})
}) })
})
})
it("returns false for objects found by find method", function() { it("returns false for objects found by find method", function() {
Helpers.async(function(done) { Helpers.async(function(done) {
User.create({ username: 'user' }).success(function(user) { User.create({ username: 'user' }).success(function(user) {
User.find(user.id).success(function(user) { User.create({ username: 'user' }).success(function(user) {
expect(user.isNewRecord).toBeFalsy() User.find(user.id).success(function(user) {
done() expect(user.isNewRecord).toBeFalsy()
done()
})
})
})
}) })
}) })
})
})
it("returns false for objects found by findAll method", function() { it("returns false for objects found by findAll method", function() {
var chainer = new Sequelize.Utils.QueryChainer var chainer = new Sequelize.Utils.QueryChainer
for(var i = 0; i < 10; i++) for(var i = 0; i < 10; i++)
chainer.add(User.create({ username: 'user' })) chainer.add(User.create({ username: 'user' }))
Helpers.async(function(done) { Helpers.async(function(done) {
chainer.run().success(function() { chainer.run().success(function() {
User.findAll().success(function(users) { User.findAll().success(function(users) {
users.forEach(function(u) { users.forEach(function(u) {
expect(u.isNewRecord).toBeFalsy() expect(u.isNewRecord).toBeFalsy()
})
done()
})
}) })
done()
}) })
}) })
}) })
})
})
describe('save', function() { describe('save', function() {
it("stores an entry in the database", function() { it("stores an entry in the database", function() {
var username = 'user' var username = 'user'
, user = User.build({ username: username }) , user = User.build({ username: username })
Helpers.async(function(done) { Helpers.async(function(done) {
User.all().success(function(users) { User.all().success(function(users) {
expect(users.length).toEqual(0) expect(users.length).toEqual(0)
done() done()
}) })
}) })
Helpers.async(function(done) { Helpers.async(function(done) {
user.save().success(done) user.save().success(done)
}) })
Helpers.async(function(done) { Helpers.async(function(done) {
User.all().success(function(users) { User.all().success(function(users) {
expect(users.length).toEqual(1) expect(users.length).toEqual(1)
expect(users[0].username).toEqual(username) expect(users[0].username).toEqual(username)
done() done()
})
})
}) })
})
})
it("updates the timestamps", function() { it("updates the timestamps", function() {
var now = Date.now() var now = Date.now()
, user = null , user = null
, updatedAt = null , updatedAt = null
Helpers.async(function(done) { Helpers.async(function(done) {
// timeout is needed, in order to check the update of the timestamp // timeout is needed, in order to check the update of the timestamp
setTimeout(function() { setTimeout(function() {
user = User.build({ username: 'user' }) user = User.build({ username: 'user' })
updatedAt = user.updatedAt updatedAt = user.updatedAt
expect(updatedAt.getTime()).toBeGreaterThan(now) expect(updatedAt.getTime()).toBeGreaterThan(now)
done() done()
}, 10) }, 10)
}) })
Helpers.async(function(done) { Helpers.async(function(done) {
setTimeout(function() { setTimeout(function() {
user.save().success(function() { user.save().success(function() {
expect(updatedAt.getTime()).toBeLessThan(user.updatedAt.getTime()) expect(updatedAt.getTime()).toBeLessThan(user.updatedAt.getTime())
done() done()
})
}, 10)
}) })
}, 10) })
}) })
})
})
describe('updateAttributes', function() { describe('updateAttributes', function() {
it("updates attributes in the database", function() { it("updates attributes in the database", function() {
Helpers.async(function(done) { Helpers.async(function(done) {
User.create({ username: 'user' }).success(function(user) { User.create({ username: 'user' }).success(function(user) {
expect(user.username).toEqual('user') expect(user.username).toEqual('user')
user.updateAttributes({ username: 'person' }).success(function(user) { user.updateAttributes({ username: 'person' }).success(function(user) {
expect(user.username).toEqual('person') expect(user.username).toEqual('person')
done() done()
})
})
}) })
}) })
})
})
it("ignores unknown attributes", function() { it("ignores unknown attributes", function() {
Helpers.async(function(done) { Helpers.async(function(done) {
User.create({ username: 'user' }).success(function(user) { User.create({ username: 'user' }).success(function(user) {
user.updateAttributes({ username: 'person', foo: 'bar'}).success(function(user) { user.updateAttributes({ username: 'person', foo: 'bar'}).success(function(user) {
expect(user.username).toEqual('person') expect(user.username).toEqual('person')
expect(user.foo).toBeUndefined() expect(user.foo).toBeUndefined()
done() done()
})
})
}) })
}) })
})
})
it("doesn't update primary keys or timestamps", function() { it("doesn't update primary keys or timestamps", function() {
var User = sequelize.define('User' + config.rand(), { var User = sequelize.define('User' + config.rand(), {
name: Sequelize.STRING, bio: Sequelize.TEXT, identifier: {type: Sequelize.STRING, primaryKey: true} name: Sequelize.STRING, bio: Sequelize.TEXT, identifier: {type: Sequelize.STRING, primaryKey: true}
}) })
Helpers.async(function(done) { Helpers.async(function(done) {
User.sync({ force: true }).success(done) User.sync({ force: true }).success(done)
}) })
Helpers.async(function(done) { Helpers.async(function(done) {
User.create({ User.create({
name: 'snafu', name: 'snafu',
identifier: 'identifier' identifier: 'identifier'
}).success(function(user) { }).success(function(user) {
var oldCreatedAt = user.createdAt var oldCreatedAt = user.createdAt
, oldIdentifier = user.identifier , oldIdentifier = user.identifier
user.updateAttributes({ user.updateAttributes({
name: 'foobar', name: 'foobar',
createdAt: new Date(2000, 1, 1), createdAt: new Date(2000, 1, 1),
identifier: 'another identifier' identifier: 'another identifier'
}).success(function(user) { }).success(function(user) {
expect(user.createdAt).toEqual(oldCreatedAt) expect(user.createdAt).toEqual(oldCreatedAt)
expect(user.identifier).toEqual(oldIdentifier) expect(user.identifier).toEqual(oldIdentifier)
done() done()
})
})
}) })
}) })
})
})
it("uses primary keys in where clause", function() { it("uses primary keys in where clause", function() {
var User = sequelize.define('User' + config.rand(), { var User = sequelize.define('User' + config.rand(), {
name: Sequelize.STRING, bio: Sequelize.TEXT, identifier: {type: Sequelize.STRING, primaryKey: true} name: Sequelize.STRING, bio: Sequelize.TEXT, identifier: {type: Sequelize.STRING, primaryKey: true}
}) })
Helpers.async(function(done) { Helpers.async(function(done) {
User.sync({ force:true }).success(done) User.sync({ force:true }).success(done)
}) })
Helpers.async(function(done) { Helpers.async(function(done) {
User.create({ User.create({
name: 'snafu', name: 'snafu',
identifier: 'identifier' identifier: 'identifier'
}).success(function(user) { }).success(function(user) {
var emitter = user.updateAttributes({name: 'foobar'}) var emitter = user.updateAttributes({name: 'foobar'})
emitter.success(function() { emitter.success(function() {
expect(emitter.query.sql).toMatch(/WHERE `identifier`..identifier./) expect(emitter.query.sql).toMatch(/WHERE `identifier`..identifier./)
done() done()
})
})
}) })
}) })
}) })
})
})
describe('values', function() { describe('values', function() {
it('returns all values', function() { it('returns all values', function() {
var User = sequelize.define('User', { var User = sequelize.define('User', {
username: Sequelize.STRING username: Sequelize.STRING
}, { timestamps: false, logging: false }) }, { timestamps: false, logging: false })
Helpers.async(function(done) { Helpers.async(function(done) {
User.sync({ force: true }).success(done) User.sync({ force: true }).success(done)
}) })
Helpers.async(function(done) { Helpers.async(function(done) {
var user = User.build({ username: 'foo' }) var user = User.build({ username: 'foo' })
expect(user.values).toEqual({ username: "foo", id: null }) expect(user.values).toEqual({ username: "foo", id: null })
done() done()
})
})
}) })
}) })
}) })
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!