mongoose-pages
Version:
Developer-friendly pagination plugin for Mongoose ODM
168 lines (131 loc) • 5.11 kB
JavaScript
var assert = require('assert');
var mongoose = require('mongoose');
var mongoosePages = require('../');
var limit, anchorId;
var connection = mongoose.createConnection('mongodb://localhost/mongoose-pages');
var UserSchema = new mongoose.Schema({
username: String,
points: Number,
email: String
})
mongoosePages.anchor(UserSchema);
var User = connection.model('User', UserSchema);
describe('mongoosePages.anchor', function() {
// # make entries in the db, before testing
var numberOfEntries = 27;
before(function(done) {
var populate = function populate(i, total, cb) {
if (i > total) return cb();
var now = Date.now();
var username = 'dancer' + now + Math.floor(Math.random() * 100000000);
var points = Math.floor(now * Math.random()/ 100000000);
var email = now + '@disco.org';
new User({ 'username': username, 'points': points, 'email': email })
.save(function(err) {
if (err) { return cb(err); }
populate(++i, total, cb);
}
)
}
return User.remove({}, function(err) {
if (err) done(err);
populate(1, numberOfEntries, done);
})
})
// # after testing, close the db connection
after(function() { connection.close(); })
//# test cases
it('should get all ' + numberOfEntries + ' users', function(done) {
User.findPaginated({}, function(err, result) {
assert.equal(err, null);
assert.equal(result.documents.length, numberOfEntries);
done(err);
})
})
it('should support conditions', function(done) {
User.findPaginated({ points: { $gt: 5000 } }, function(err, result) {
assert.equal(err, null);
assert.ok(result.documents.length == 5);
done(err);
}, 5)
})
it('should support fields', function(done) {
User.findPaginated({}, 'username', function(err, result) {
assert.equal(err, null);
assert.ok(!result.documents[0].__v);
assert.ok(result.documents[0].username.length);
done(err);
}, 10)
})
it('should support options', function(done) {
User.findPaginated({}, 'username', { limit: 2 }, function(err, result) {
assert.equal(err, null);
assert.ok(result.documents.length == 2);
done(err);
})
})
it('should set `nextAnchorId` and `prevAnchorId` as `undefined` if there is only one page', function(done) {
User.findPaginated({}, function(err, result) {
assert.equal(err, null);
assert.ok(result.nextAnchorId == undefined);
assert.ok(result.prevAnchorId == undefined);
done(err);
})
})
it('should set `nextAnchorId` to a doc id, and `prevAnchorId` to `undefined` on the first page', function(done) {
User.findPaginated({}, function(err, result) {
assert.equal(err, null);
assert.ok(result.prevAnchorId == undefined);
assert.ok(result.nextAnchorId.length == 24);
done(err);
}, 10)
})
it('should get the next 10 users', function(done) {
User.findPaginated({}, function(err, result) {
User.findPaginated({}, function(err, result) {
assert.equal(err, null);
assert.ok(result.prevAnchorId.length == 24);
assert.ok(result.nextAnchorId.length == 24);
assert.equal(result.documents.length, 10);
done(err);
}, 10, result.nextAnchorId)
}, 10)
})
it('should return an empty error for a non-existent id', function(done) {
User.findPaginated({}, function(err, result) {
assert.equal(err, null);
assert.equal(result.documents.length, 0);
done();
}, 10, '999997a2047db76f2c670000')
})
it('should return an error for an invalid id', function(done) {
User.findPaginated({}, function(err, result) {
assert.ok(err);
assert.equal(result, undefined);
done();
}, 10, 'x')
})
describe('page count tests', function () {
it('should have 27 pages', function(done) {
User.findPaginated({}, function(err, result) {
assert.equal(err, null);
assert.equal(result.totalPages, 27);
done(err);
}, 1)
})
it('should have 4 pages', function(done) {
User.findPaginated({}, function(err, result) {
assert.equal(err, null);
assert.equal(result.totalPages, 6);
done(err);
}, 5)
})
it('should have 3 pages', function(done) {
User.findPaginated({}, function(err, result) {
assert.equal(err, null);
assert.equal(result.totalPages, 3);
done(err);
}, 10)
})
})
})