11
2- process . env . NODE_ENV = 'test' ;
2+ process . env . NODE_ENV = 'test'
33
4+ var after = require ( 'after' )
45var assert = require ( 'assert' )
56var errorHandler = require ( '..' )
67var http = require ( 'http' )
7- var request = require ( 'supertest' ) ;
8+ var request = require ( 'supertest' )
89var util = require ( 'util' )
910
1011describe ( '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' , / t e x t \/ h t m l / )
49- . expect ( / < t i t l e > / )
50- . expect ( / E r r o r : b o o m ! / )
51- . expect ( / & n b s p ; & n b s p ; a t / )
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' , / t e x t \/ h t m l / )
109+ . expect ( / < t i t l e > / )
110+ . expect ( / E r r o r : b o o m ! / )
111+ . expect ( / & n b s p ; & n b s p ; a t / )
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' , / a p p l i c a t i o n \/ j s o n / )
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' , / a p p l i c a t i o n \/ j s o n / )
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' , / t e x t \/ p l a i n / )
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' , / t e x t \/ p l a i n / )
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' , / t e x t \/ p l a i n / )
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