Skip to content

Commit fb53836

Browse files
committed
tests: refactor test layout
1 parent d46f2b3 commit fb53836

File tree

2 files changed

+142
-108
lines changed

2 files changed

+142
-108
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"escape-html": "1.0.1"
1414
},
1515
"devDependencies": {
16+
"after": "0.8.1",
1617
"istanbul": "0.3.2",
1718
"mocha": "~2.0.1",
1819
"supertest": "~0.15.0"

test/test.js

Lines changed: 141 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11

2-
process.env.NODE_ENV = 'test';
2+
process.env.NODE_ENV = 'test'
33

4+
var after = require('after')
45
var assert = require('assert')
56
var errorHandler = require('..')
67
var http = require('http')
7-
var request = require('supertest');
8+
var request = require('supertest')
89
var util = require('util')
910

1011
describe('errorHandler()', function () {
@@ -17,66 +18,139 @@ describe('errorHandler()', function () {
1718
})
1819

1920
describe('status code', function () {
20-
it('should set the status code to 500 if a non error status code was given', function (done) {
21-
var server = createServer({status: 200})
22-
request(server)
23-
.get('/')
24-
.expect(500, done)
25-
});
21+
describe('when non-error status code', function () {
22+
it('should set the status code to 500', function (done) {
23+
var server = createServer({status: 200})
24+
request(server)
25+
.get('/')
26+
.expect(500, done)
27+
})
28+
})
2629

27-
it('should pass an error status code to the response object', function (done) {
28-
var server = createServer({status: 404})
29-
request(server)
30-
.get('/')
31-
.expect(404, done)
32-
});
33-
});
30+
describe('when err.status exists', function () {
31+
it('should set res.statusCode', function (done) {
32+
var server = createServer({status: 404})
33+
request(server)
34+
.get('/')
35+
.expect(404, done)
36+
})
37+
})
38+
})
39+
40+
describe('error value', function () {
41+
describe('when Error object', function () {
42+
it('should use "stack" property', function (done) {
43+
var error = new TypeError('boom!')
44+
var server = createServer(error)
45+
request(server)
46+
.get('/')
47+
.set('Accept', 'text/plain')
48+
.expect(500, error.stack.toString(), done)
49+
})
50+
})
51+
52+
describe('when string', function () {
53+
it('should pass-through string', function (done) {
54+
var server = createServer('boom!')
55+
request(server)
56+
.get('/')
57+
.set('Accept', 'text/plain')
58+
.expect(500, 'boom!', done)
59+
})
60+
})
61+
62+
describe('when number', function () {
63+
it('should stringify number', function (done) {
64+
var server = createServer(42.1)
65+
request(server)
66+
.get('/')
67+
.set('Accept', 'text/plain')
68+
.expect(500, '42.1', done)
69+
})
70+
})
71+
72+
describe('when object', function () {
73+
it('should use util.inspect', function (done) {
74+
var server = createServer({hop: 'pop'})
75+
request(server)
76+
.get('/')
77+
.set('Accept', 'text/plain')
78+
.expect(500, '{ hop: \'pop\' }', done)
79+
})
80+
})
81+
82+
describe('with "toString" property', function () {
83+
it('should use "toString" value', function (done) {
84+
var server = createServer({toString: function () { return 'boom!' }})
85+
request(server)
86+
.get('/')
87+
.set('Accept', 'text/plain')
88+
.expect(500, 'boom!', done)
89+
})
90+
})
91+
})
3492

3593
describe('response content type', function () {
3694
var error
3795
var server
3896

3997
before(function () {
4098
error = new Error('boom!')
99+
error.description = 'it went this way'
41100
server = createServer(error)
42101
});
43102

44-
it('should return a html response when html is accepted', function (done) {
45-
request(server)
46-
.get('/')
47-
.set('Accept', 'text/html')
48-
.expect('Content-Type', /text\/html/)
49-
.expect(/<title>/)
50-
.expect(/Error: boom!/)
51-
.expect(/ &nbsp; &nbsp;at/)
52-
.end(done)
53-
});
103+
describe('when "Accept: text/html"', function () {
104+
it('should return a html response', function (done) {
105+
request(server)
106+
.get('/')
107+
.set('Accept', 'text/html')
108+
.expect('Content-Type', /text\/html/)
109+
.expect(/<title>/)
110+
.expect(/Error: boom!/)
111+
.expect(/ &nbsp; &nbsp;at/)
112+
.end(done)
113+
})
114+
})
54115

55-
it('should return a json response when json is accepted', function (done) {
56-
request(server)
57-
.get('/')
58-
.set('Accept', 'application/json')
59-
.expect('Content-Type', /application\/json/)
60-
.end(function (err, res) {
61-
if (err) throw err;
62-
var errorMessage = JSON.parse(res.text);
63-
64-
assert.strictEqual(typeof errorMessage, 'object')
65-
assert.deepEqual(Object.keys(errorMessage).sort(), ['error'])
66-
assert.deepEqual(Object.keys(errorMessage.error).sort(), ['message', 'stack'])
67-
68-
done();
69-
});
70-
});
116+
describe('when "Accept: application/json"', function () {
117+
it('should return a json response', function (done) {
118+
var body = {
119+
error: {
120+
message: 'boom!',
121+
description: 'it went this way',
122+
stack: error.stack.toString()
123+
}
124+
}
125+
126+
request(server)
127+
.get('/')
128+
.set('Accept', 'application/json')
129+
.expect('Content-Type', /application\/json/)
130+
.expect(500, body, done)
131+
})
132+
})
71133

72-
it('should return a plain text response when json or html is not accepted', function (done) {
73-
request(server)
74-
.get('/')
75-
.set('Accept', 'bogus')
76-
.expect('Content-Type', /text\/plain/)
77-
.expect(500, error.stack.toString(), done)
78-
});
79-
});
134+
describe('when "Accept: text/plain"', function () {
135+
it('should return a plain text response', function (done) {
136+
request(server)
137+
.get('/')
138+
.set('Accept', 'text/plain')
139+
.expect('Content-Type', /text\/plain/)
140+
.expect(500, error.stack.toString(), done)
141+
})
142+
})
143+
144+
describe('when "Accept: x-unknown"', function () {
145+
it('should return a plain text response', function (done) {
146+
request(server)
147+
.get('/')
148+
.set('Accept', 'x-unknown')
149+
.expect('Content-Type', /text\/plain/)
150+
.expect(500, error.stack.toString(), done)
151+
})
152+
})
153+
})
80154

81155
describe('headers sent', function () {
82156
var server
@@ -102,78 +176,37 @@ describe('errorHandler()', function () {
102176
});
103177
});
104178

105-
describe('write error to console.error', function () {
106-
var log
107-
var old
179+
describe('console', function () {
180+
var _consoleerror
108181

109182
before(function () {
110-
old = console.error
111-
console.error = function () {
112-
log = util.format.apply(null, arguments)
113-
}
183+
_consoleerror = console.error
114184
process.env.NODE_ENV = ''
115185
})
116-
beforeEach(function () {
117-
log = undefined
118-
})
119-
after(function () {
120-
console.error = old
186+
afterEach(function () {
187+
console.error = _consoleerror
121188
process.env.NODE_ENV = 'test'
122189
})
123190

124-
it('should write stack', function (done) {
125-
var server = createServer(new Error('boom!'))
126-
request(server)
127-
.get('/')
128-
.expect(500, function (err) {
129-
if (err) return done(err)
130-
assert.equal(log.substr(0, 19), 'Error: boom!\n at')
131-
done()
132-
})
133-
})
191+
it('should output error', function (done) {
192+
var cb = after(2, done)
193+
var error = new Error('boom!')
194+
var server = createServer(error)
134195

135-
it('should stringify primitive', function (done) {
136-
var server = createServer('boom!')
137-
request(server)
138-
.get('/')
139-
.expect(500, function (err) {
140-
if (err) return done(err)
141-
assert.equal(log, 'boom!')
142-
done()
143-
})
144-
})
196+
console.error = function () {
197+
var log = util.format.apply(null, arguments)
145198

146-
it('should stringify plain object', function (done) {
147-
var server = createServer({hop: 'pop'})
148-
request(server)
149-
.get('/')
150-
.expect(500, function (err) {
151-
if (err) return done(err)
152-
assert.equal(log, '{ hop: \'pop\' }')
153-
done()
154-
})
155-
})
199+
if (log !== error.stack.toString()) {
200+
return _consoleerror.apply(this, arguments)
201+
}
156202

157-
it('should stringify number', function (done) {
158-
var server = createServer(42)
159-
request(server)
160-
.get('/')
161-
.expect(500, function (err) {
162-
if (err) return done(err)
163-
assert.equal(log, '42')
164-
done()
165-
})
166-
})
203+
cb()
204+
}
167205

168-
it('should stringify plain object with toString', function (done) {
169-
var server = createServer({toString: function () { return 'boom!' }})
170206
request(server)
171207
.get('/')
172-
.expect(500, function (err) {
173-
if (err) return done(err)
174-
assert.equal(log, 'boom!')
175-
done()
176-
})
208+
.set('Accept', 'text/plain')
209+
.expect(500, error.stack.toString(), cb)
177210
})
178211
})
179212
})

0 commit comments

Comments
 (0)