modella-resource
Version:
Expose Modella models via RESTful resource middleware.
254 lines (234 loc) • 7.06 kB
JavaScript
/**
* modella-resource tests
*/
var express = require('express')
, plugin = require('../lib/resource')
, modella = require('modella')
, should = require('should')
, request = require('supertest');
describe('module', function() {
it('exports modella plugin', function(done) {
should.exist(plugin);
plugin.should.be.a('function');
done();
});
});
describe('plugin', function() {
var User = modella('User').use(plugin()).attr('id').attr('name');
var app = express();
app
.use(express.bodyParser())
.get('/users', User.middleware.index)
.get('/users/:id', User.middleware.show)
.post('/users', User.middleware.create)
.put('/users/:id', User.middleware.update)
.del('/users/:id', User.middleware.destroy)
.del('/users', User.middleware.destroyAll)
.use(function(err, req, res, next) {
if (err) {
return res.json(500, { error: err.message });
}
next();
});
it('creates actions middleware for model', function(done) {
User.should.have.property('middleware');
User.middleware.should.have.property('index');
User.middleware.should.have.property('show');
User.middleware.should.have.property('create');
User.middleware.should.have.property('update');
User.middleware.should.have.property('destroy');
User.middleware.should.have.property('destroyAll');
done();
});
describe('.index()', function() {
it('responds to GET /users', function(done) {
User.all = function(query, callback) {
callback(null, []);
};
request(app)
.get('/users')
.set('Accept', 'application/json')
.expect(200)
.end(function(err, res) {
if (err) return done(err);
done();
});
});
it('passes error along to response', function(done) {
User.all = function(query, callback) {
callback(new Error("uh oh"));
};
request(app)
.get('/users')
.set('Accept', 'application/json')
.expect(500)
.end(function(err, res) {
if (err) return done(err);
res.body.should.have.property('error');
done();
});
});
});
describe('.show()', function(done) {
it('responds to GET /users/123', function(done) {
User.find = function(id, callback) {
callback(null, { id: 123, name: "bob" });
};
request(app)
.get('/users/123')
.set('Accept', 'application/json')
.end(function(err, res) {
if (err) return done(err);
res.body.should.have.property('id', 123);
res.body.should.have.property('name', 'bob');
done();
});
});
it('passes error along to response', function(done) {
User.find = function(callback) {
callback(new Error("uh oh"));
};
request(app)
.get('/users/123')
.set('Accept', 'application/json')
.expect(500)
.end(function(err, res) {
if (err) return done(err);
res.body.should.have.property('error');
done();
});
});
});
describe('.create()', function(done) {
it('responds to POST /users', function(done) {
var update = User.update;
User.update = function(cb) {
cb(null, { id: 123, name: "bob" });
};
request(app)
.post('/users')
.send({ id: 123, name: "bob" })
.set('Accept', 'application/json')
.end(function(err, res) {
User.update = update;
if (err) return done(err);
res.status.should.equal(200);
res.body.should.have.property('id', 123);
done();
});
});
it('passes error along to response', function(done) {
request(app)
.post('/users')
.set('Accept', 'application/json')
.expect(500)
.end(function(err, res) {
if (err) return done(err);
res.body.should.have.property('error');
done();
});
});
});
describe('.update()', function(done) {
it('responds to PUT /users/123', function(done) {
User.find = function(id, callback) {
callback(null, new User({ id: 123, name: "bob" }));
};
var update = User.update;
User.update = function(cb) {
cb(null, { id: 123, name: "jeff" });
};
request(app)
.put('/users/123')
.send({ name: "jeff" })
.set('Accept', 'application/json')
.end(function(err, res) {
User.update = update;
if (err) return done(err);
res.body.should.have.property('id', 123);
res.body.should.have.property('name', 'jeff');
done();
});
});
it('passes error along to response', function(done) {
User.find = function(id, callback) {
callback(new Error("uh oh"));
};
request(app)
.put('/users/123')
.send({ name: "jeff" })
.set('Accept', 'application/json')
.expect(500)
.end(function(err, res) {
if (err) return done(err);
res.body.should.have.property('error');
done();
});
});
});
describe('.destroy()', function(done) {
var user = new User({ id: 123, name: "jeff" });
it('responds to DELETE /users/123', function(done) {
User.find = function(id, callback) {
callback(null, user);
};
user.remove = function(callback) {
callback(null);
};
request(app)
.del('/users/123')
.set('Accept', 'application/json')
.end(function(err, res) {
if (err) return done(err);
res.status.should.equal(204);
done();
});
});
it('passes error along to response', function(done) {
User.find = function(id, callback) {
callback();
};
user.remove = function(callback) {
callback(new Error("uh oh"));
};
request(app)
.del('/users/123')
.set('Accept', 'application/json')
.expect(500)
.end(function(err, res) {
if (err) return done(err);
res.body.should.have.property('error');
done();
});
});
});
describe('.destroyAll()', function(done) {
it('responds to DELETE /users', function(done) {
User.removeAll = function(query, callback) {
callback();
};
request(app)
.del('/users')
.set('Accept', 'application/json')
.end(function(err, res) {
if (err) return done(err);
res.status.should.equal(204);
done();
});
});
it('passes error along to response', function(done) {
User.removeAll = function(query, callback) {
callback(new Error("uh oh"));
};
request(app)
.del('/users')
.set('Accept', 'application/json')
.expect(500)
.end(function(err, res) {
if (err) return done(err);
res.body.should.have.property('error');
done();
});
});
});
});