2013-04-06 10:57:12 +00:00
|
|
|
// This test written in mocha+should.js
|
|
|
|
var should = require('./init.js');
|
|
|
|
var db, User;
|
2013-03-26 19:33:11 +00:00
|
|
|
|
|
|
|
describe('basic-querying', function() {
|
|
|
|
|
2013-03-27 00:50:34 +00:00
|
|
|
before(function(done) {
|
2013-03-26 19:33:11 +00:00
|
|
|
db = getSchema();
|
|
|
|
|
|
|
|
User = db.define('User', {
|
2013-03-29 07:43:04 +00:00
|
|
|
name: {type: String, sort: true},
|
2013-03-26 19:33:11 +00:00
|
|
|
email: {type: String, index: true},
|
|
|
|
role: {type: String, index: true},
|
2013-03-29 07:43:04 +00:00
|
|
|
order: {type: Number, index: true, sort: true}
|
2013-03-26 19:33:11 +00:00
|
|
|
});
|
|
|
|
|
2013-03-27 00:50:34 +00:00
|
|
|
db.automigrate(done);
|
|
|
|
|
2013-03-26 19:33:11 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
|
2013-06-24 19:42:58 +00:00
|
|
|
describe('findById', function() {
|
2013-03-26 19:33:11 +00:00
|
|
|
|
|
|
|
before(function(done) {
|
|
|
|
User.destroyAll(done);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should query by id: not found', function(done) {
|
2013-06-24 19:42:58 +00:00
|
|
|
User.findById(1, function(err, u) {
|
2013-03-26 19:33:11 +00:00
|
|
|
should.not.exist(u);
|
|
|
|
should.not.exist(err);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should query by id: found', function(done) {
|
|
|
|
User.create(function(err, u) {
|
2013-03-27 14:53:46 +00:00
|
|
|
should.not.exist(err);
|
2013-03-26 19:33:11 +00:00
|
|
|
should.exist(u.id);
|
2013-06-24 19:42:58 +00:00
|
|
|
User.findById(u.id, function(err, u) {
|
2013-03-26 19:33:11 +00:00
|
|
|
should.exist(u);
|
|
|
|
should.not.exist(err);
|
|
|
|
u.should.be.an.instanceOf(User);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-06-24 19:42:58 +00:00
|
|
|
describe('find', function() {
|
2013-03-26 19:33:11 +00:00
|
|
|
|
|
|
|
before(seed);
|
|
|
|
|
|
|
|
it('should query collection', function(done) {
|
2013-06-24 19:42:58 +00:00
|
|
|
User.find(function(err, users) {
|
2013-03-26 19:33:11 +00:00
|
|
|
should.exists(users);
|
|
|
|
should.not.exists(err);
|
|
|
|
users.should.have.lengthOf(6);
|
|
|
|
done();
|
2013-04-18 16:15:07 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should query limited collection', function(done) {
|
2013-06-24 19:42:58 +00:00
|
|
|
User.find({limit: 3}, function(err, users) {
|
2013-04-18 16:15:07 +00:00
|
|
|
should.exists(users);
|
|
|
|
should.not.exists(err);
|
|
|
|
users.should.have.lengthOf(3);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should query offset collection with limit', function(done) {
|
2013-06-24 19:42:58 +00:00
|
|
|
User.find({skip: 1, limit: 4}, function(err, users) {
|
2013-04-18 16:15:07 +00:00
|
|
|
should.exists(users);
|
|
|
|
should.not.exists(err);
|
|
|
|
users.should.have.lengthOf(4);
|
|
|
|
done();
|
2013-03-26 19:33:11 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should query filtered collection', function(done) {
|
2013-06-24 19:42:58 +00:00
|
|
|
User.find({where: {role: 'lead'}}, function(err, users) {
|
2013-03-26 19:33:11 +00:00
|
|
|
should.exists(users);
|
|
|
|
should.not.exists(err);
|
|
|
|
users.should.have.lengthOf(2);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should query collection sorted by numeric field', function(done) {
|
2013-06-24 19:42:58 +00:00
|
|
|
User.find({order: 'order'}, function(err, users) {
|
2013-03-26 19:33:11 +00:00
|
|
|
should.exists(users);
|
|
|
|
should.not.exists(err);
|
|
|
|
users.forEach(function(u, i) {
|
|
|
|
u.order.should.eql(i + 1);
|
|
|
|
});
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should query collection desc sorted by numeric field', function(done) {
|
2013-06-24 19:42:58 +00:00
|
|
|
User.find({order: 'order DESC'}, function(err, users) {
|
2013-03-26 19:33:11 +00:00
|
|
|
should.exists(users);
|
|
|
|
should.not.exists(err);
|
|
|
|
users.forEach(function(u, i) {
|
|
|
|
u.order.should.eql(users.length - i);
|
|
|
|
});
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should query collection sorted by string field', function(done) {
|
2013-06-24 19:42:58 +00:00
|
|
|
User.find({order: 'name'}, function(err, users) {
|
2013-03-26 19:33:11 +00:00
|
|
|
should.exists(users);
|
|
|
|
should.not.exists(err);
|
|
|
|
users.shift().name.should.equal('George Harrison');
|
|
|
|
users.shift().name.should.equal('John Lennon');
|
|
|
|
users.pop().name.should.equal('Stuart Sutcliffe');
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should query collection desc sorted by string field', function(done) {
|
2013-06-24 19:42:58 +00:00
|
|
|
User.find({order: 'name DESC'}, function(err, users) {
|
2013-03-26 19:33:11 +00:00
|
|
|
should.exists(users);
|
|
|
|
should.not.exists(err);
|
|
|
|
users.pop().name.should.equal('George Harrison');
|
|
|
|
users.pop().name.should.equal('John Lennon');
|
|
|
|
users.shift().name.should.equal('Stuart Sutcliffe');
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
2013-07-17 00:53:52 +00:00
|
|
|
|
|
|
|
it('should only include fields as specified', function(done) {
|
|
|
|
var remaining = 0;
|
|
|
|
|
|
|
|
function sample(fields) {
|
|
|
|
|
|
|
|
return {
|
|
|
|
expect: function (arr) {
|
|
|
|
remaining++;
|
|
|
|
User.find({fields: fields}, function(err, users) {
|
|
|
|
|
|
|
|
remaining--;
|
|
|
|
if(err) return done(err);
|
|
|
|
|
|
|
|
should.exists(users);
|
|
|
|
|
|
|
|
if(remaining === 0) {
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
|
|
|
|
users.forEach(function (user) {
|
|
|
|
var obj = user.toObject();
|
|
|
|
|
|
|
|
Object.keys(obj)
|
|
|
|
.forEach(function (key) {
|
|
|
|
// if the obj has an unexpected value
|
|
|
|
if(obj[key] !== undefined && arr.indexOf(key) === -1) {
|
|
|
|
console.log('Given fields:', fields);
|
|
|
|
console.log('Got:', key, obj[key]);
|
|
|
|
console.log('Expected:', arr);
|
|
|
|
throw new Error('should not include data for key: '+ key);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sample({name: true}).expect(['name']);
|
|
|
|
sample({name: false}).expect(['id', 'email', 'role', 'order']);
|
|
|
|
sample({name: false, id: true}).expect(['id']);
|
|
|
|
sample({id: true}).expect(['id']);
|
|
|
|
sample('id').expect(['id']);
|
|
|
|
sample(['id']).expect(['id']);
|
|
|
|
sample(['email']).expect(['email']);
|
|
|
|
});
|
2013-03-26 19:33:11 +00:00
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('count', function() {
|
|
|
|
|
|
|
|
before(seed);
|
|
|
|
|
|
|
|
it('should query total count', function(done) {
|
|
|
|
User.count(function(err, n) {
|
|
|
|
should.not.exist(err);
|
|
|
|
should.exist(n);
|
|
|
|
n.should.equal(6);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should query filtered count', function(done) {
|
|
|
|
User.count({role: 'lead'}, function(err, n) {
|
|
|
|
should.not.exist(err);
|
|
|
|
should.exist(n);
|
|
|
|
n.should.equal(2);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2013-03-26 20:50:13 +00:00
|
|
|
describe('findOne', function() {
|
|
|
|
|
|
|
|
before(seed);
|
|
|
|
|
|
|
|
it('should find first record (default sort by id)', function(done) {
|
2013-03-29 07:43:04 +00:00
|
|
|
User.all({order: 'id'}, function(err, users) {
|
2013-04-15 23:50:49 +00:00
|
|
|
User.findOne(function(e, u) {
|
2013-03-26 20:50:13 +00:00
|
|
|
should.not.exist(e);
|
|
|
|
should.exist(u);
|
2013-03-27 17:53:07 +00:00
|
|
|
u.id.toString().should.equal(users[0].id.toString());
|
2013-03-26 20:50:13 +00:00
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should find first record', function(done) {
|
|
|
|
User.findOne({order: 'order'}, function(e, u) {
|
|
|
|
should.not.exist(e);
|
|
|
|
should.exist(u);
|
|
|
|
u.order.should.equal(1);
|
|
|
|
u.name.should.equal('Paul McCartney');
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should find last record', function(done) {
|
|
|
|
User.findOne({order: 'order DESC'}, function(e, u) {
|
|
|
|
should.not.exist(e);
|
|
|
|
should.exist(u);
|
|
|
|
u.order.should.equal(6);
|
|
|
|
u.name.should.equal('Ringo Starr');
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2013-04-11 23:23:34 +00:00
|
|
|
it('should find last record in filtered set', function(done) {
|
2013-03-26 20:50:13 +00:00
|
|
|
User.findOne({
|
|
|
|
where: {role: 'lead'},
|
|
|
|
order: 'order DESC'
|
|
|
|
}, function(e, u) {
|
|
|
|
should.not.exist(e);
|
|
|
|
should.exist(u);
|
|
|
|
u.order.should.equal(2);
|
|
|
|
u.name.should.equal('John Lennon');
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2013-04-11 23:23:34 +00:00
|
|
|
it('should work even when find by id', function(done) {
|
2013-03-27 17:53:07 +00:00
|
|
|
User.findOne(function(e, u) {
|
|
|
|
User.findOne({where: {id: u.id}}, function(err, user) {
|
|
|
|
should.not.exist(err);
|
|
|
|
should.exist(user);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2013-03-26 20:50:13 +00:00
|
|
|
});
|
|
|
|
|
2013-03-26 19:33:11 +00:00
|
|
|
describe('exists', function() {
|
|
|
|
|
|
|
|
before(seed);
|
|
|
|
|
|
|
|
it('should check whether record exist', function(done) {
|
2013-03-26 20:50:13 +00:00
|
|
|
User.findOne(function(e, u) {
|
|
|
|
User.exists(u.id, function(err, exists) {
|
|
|
|
should.not.exist(err);
|
|
|
|
should.exist(exists);
|
2013-03-27 00:50:34 +00:00
|
|
|
exists.should.be.ok;
|
2013-03-26 20:50:13 +00:00
|
|
|
done();
|
|
|
|
});
|
2013-03-26 19:33:11 +00:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should check whether record not exist', function(done) {
|
|
|
|
User.destroyAll(function() {
|
|
|
|
User.exists(42, function(err, exists) {
|
|
|
|
should.not.exist(err);
|
2013-03-27 00:50:34 +00:00
|
|
|
exists.should.not.be.ok;
|
2013-03-26 19:33:11 +00:00
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-03-26 20:50:13 +00:00
|
|
|
|
2013-03-26 19:33:11 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
function seed(done) {
|
|
|
|
var count = 0;
|
|
|
|
var beatles = [
|
2013-03-26 20:50:13 +00:00
|
|
|
{
|
2013-03-26 19:33:11 +00:00
|
|
|
name: 'John Lennon',
|
|
|
|
mail: 'john@b3atl3s.co.uk',
|
|
|
|
role: 'lead',
|
|
|
|
order: 2
|
|
|
|
}, {
|
|
|
|
name: 'Paul McCartney',
|
|
|
|
mail: 'paul@b3atl3s.co.uk',
|
|
|
|
role: 'lead',
|
|
|
|
order: 1
|
|
|
|
},
|
|
|
|
{name: 'George Harrison', order: 5},
|
|
|
|
{name: 'Ringo Starr', order: 6},
|
|
|
|
{name: 'Pete Best', order: 4},
|
|
|
|
{name: 'Stuart Sutcliffe', order: 3}
|
|
|
|
];
|
|
|
|
User.destroyAll(function() {
|
|
|
|
beatles.forEach(function(beatle) {
|
|
|
|
User.create(beatle, ok);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
function ok() {
|
|
|
|
if (++count === beatles.length) {
|
|
|
|
done();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|