Skip to content

Commit

Permalink
add error-handling capabilities.
Browse files Browse the repository at this point in the history
  • Loading branch information
cainus committed Jun 10, 2013
1 parent 0842af7 commit bdd80c7
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 14 deletions.
5 changes: 4 additions & 1 deletion lib/JsonResponder.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@ var JsonResponder = function(req, res){
this.res = res;
};

JsonResponder.connectMiddleware = function(namespace){
JsonResponder.connectMiddleware = function(namespace, errorHandler){
namespace = namespace || 'status';
return function(req, res, next){
res[namespace] = new JsonResponder(req, res);
if (errorHandler && (typeof errorHandler === 'function')){
res[namespace].on('error', errorHandler);
}
next();
};
};
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"http",
"hypermedia"
],
"version": "0.0.2",
"version": "0.1.0",
"bugs": {
"url": "https://github.com/cainus/json-status/issues"
},
Expand All @@ -30,6 +30,7 @@
"mockery": "1.1.2",
"hottap": "1.0.0",
"mocha": "1.8.1",
"connect": "~2.7.11",
"should": "1.1.0"
},
"engines": {
Expand Down
90 changes: 78 additions & 12 deletions test/JsonResponder.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
var should = require('should');
var JsonResponder = require('../index');
var connect = require('connect');
var request = require('request');
var JsonStatus = require('../index');

var FakeResponse = function(){
this.status = null;
Expand All @@ -18,12 +20,12 @@ var FakeResponse = function(){
};
};

describe("JsonResponder", function(){
describe("JsonStatus", function(){

describe("#internalServerError", function(){
it ("sets the status to 500 when the detail is a simple object", function(done){
var fakeRes = new FakeResponse();
var responder = new JsonResponder({}, fakeRes);
var responder = new JsonStatus({}, fakeRes);
var expected = {type : 500,
message : 'Internal Server Error',
detail : {}};
Expand All @@ -42,7 +44,7 @@ describe("JsonResponder", function(){
});
it ("sets the status to 500 when the detail is a 'circular' object", function(done){
var fakeRes = new FakeResponse();
var responder = new JsonResponder({}, fakeRes);
var responder = new JsonStatus({}, fakeRes);
var circular = {};
circular.circular = circular; // this is circular, in case that's not obvious
var expected = {type : 500,
Expand All @@ -62,10 +64,43 @@ describe("JsonResponder", function(){
response.error.should.eql(expected);
});
});
it ("emits error events in the case of errors", function(done){
var server = connect.createServer();
var responseSent = false;
var errorEventSent = false;
var middleware = JsonStatus.connectMiddleware('status', function(data){
should.exist(data.req);
should.exist(data.res);
data.type.should.equal(500);
data.message.should.equal('Internal Server Error');
data.detail.should.equal('some error!');
if (responseSent){
return done();
}
errorEventSent = true;
});
server.use(middleware);
server.use(function(req, res){
res.status.internalServerError("some error!");
});
server.listen(8082, function(){
request('http://localhost:8082/', function(err, res, body){
res.statusCode.should.equal(500);
JSON.parse(body).should.eql(
{"error":{"type":500,
"message":"Internal Server Error",
"detail":"some error!"}});
if (errorEventSent){
return done();
}
responseSent = true;
});
});
});
describe("#badRequest", function(){
it ("sets the status to 400", function(done){
var fakeRes = new FakeResponse();
var responder = new JsonResponder({}, fakeRes);
var responder = new JsonStatus({}, fakeRes);
var expected = {type : 400,
message : 'Bad Request',
detail : 'bad request'};
Expand All @@ -86,7 +121,7 @@ describe("JsonResponder", function(){
describe("#accepted", function(){
it ("sets the status to 202", function(){
var fakeRes = new FakeResponse();
var responder = new JsonResponder({}, fakeRes);
var responder = new JsonStatus({}, fakeRes);
responder.accepted();
fakeRes.status.should.equal(202);
fakeRes.ended.should.equal(true);
Expand All @@ -95,7 +130,7 @@ describe("JsonResponder", function(){
describe("#noContent", function(){
it ("sets the status to 204", function(){
var fakeRes = new FakeResponse();
var responder = new JsonResponder({}, fakeRes);
var responder = new JsonStatus({}, fakeRes);
responder.noContent();
fakeRes.status.should.equal(204);
fakeRes.ended.should.equal(true);
Expand All @@ -104,7 +139,7 @@ describe("JsonResponder", function(){
describe("#resetContent", function(){
it ("sets the status to 205", function(){
var fakeRes = new FakeResponse();
var responder = new JsonResponder({}, fakeRes);
var responder = new JsonStatus({}, fakeRes);
responder.resetContent();
fakeRes.status.should.equal(205);
fakeRes.ended.should.equal(true);
Expand All @@ -113,7 +148,7 @@ describe("JsonResponder", function(){
describe("#movedPermanently", function(){
it ("sets the Location header and sets the status to 301", function(){
var fakeRes = new FakeResponse();
var responder = new JsonResponder({}, fakeRes);
var responder = new JsonStatus({}, fakeRes);
responder.movedPermanently("SOMEURL");
fakeRes.headers.Location.should.equal("SOMEURL");
fakeRes.status.should.equal(301);
Expand All @@ -123,7 +158,7 @@ describe("JsonResponder", function(){
describe("#OPTIONS", function(){
it ("sets the Allow header and sets the status to 200", function(){
var fakeRes = new FakeResponse();
var responder = new JsonResponder({}, fakeRes);
var responder = new JsonStatus({}, fakeRes);
responder.OPTIONS(["GET", "POST"]);
fakeRes.headers.Allow.should.equal("GET,POST");
fakeRes.status.should.equal(200);
Expand All @@ -134,7 +169,7 @@ describe("JsonResponder", function(){
describe("#redirect", function(){
it ("sets the Location header and sets the status to 301", function(){
var fakeRes = new FakeResponse();
var responder = new JsonResponder({}, fakeRes);
var responder = new JsonStatus({}, fakeRes);
responder.movedPermanently("SOMEURL");
fakeRes.headers.Location.should.equal("SOMEURL");
fakeRes.status.should.equal(301);
Expand All @@ -144,11 +179,42 @@ describe("JsonResponder", function(){
describe("#created", function(){
it ("sets the Location header and sets the status to 201", function(){
var fakeRes = new FakeResponse();
var responder = new JsonResponder({}, fakeRes);
var responder = new JsonStatus({}, fakeRes);
responder.created("SOMEURL");
fakeRes.headers.Location.should.equal("SOMEURL");
fakeRes.status.should.equal(201);
fakeRes.ended.should.equal(true);
});
});
describe("connectMiddleware", function(){
it ("adds a 'status' object to the response object", function(done){
var server = connect.createServer();
server.use(JsonStatus.connectMiddleware());
server.use(function(req, res){
res.status.accepted();
});
server.listen(8080, function(){
request('http://localhost:8080/', function(err, res, body){
res.statusCode.should.equal(202);
body.should.equal('');
done();
});
});
});
it ("allows you to set the name of the 'status' object", function(done){
var server = connect.createServer();
server.use(JsonStatus.connectMiddleware("ohyeah"));
server.use(function(req, res){
res.ohyeah.accepted();
});
server.listen(8081, function(){
request('http://localhost:8081/', function(err, res, body){
res.statusCode.should.equal(202);
body.should.equal('');
done();
});
});
});

});
});

0 comments on commit bdd80c7

Please sign in to comment.