@@ -6,21 +6,136 @@ var crypto = require('crypto')
6
6
var http = require ( 'http' )
7
7
var request = require ( 'supertest' )
8
8
var zlib = require ( 'zlib' )
9
+ var sinon = require ( 'sinon' )
9
10
10
11
var compression = require ( '..' )
11
12
12
13
describe ( 'compression()' , function ( ) {
13
- it ( 'request should end' , function ( done ) {
14
- var reponseText = 'hello, world'
14
+ describe ( 'should work with valid types (string, Buffer, Uint8Array)' , function ( ) {
15
+ it ( 'res.write(string)' , function ( done ) {
16
+ var server = createServer ( { threshold : 0 } , function ( req , res ) {
17
+ res . setHeader ( 'Content-Type' , 'text/plain' )
18
+ res . end ( 'hello world' )
19
+ } )
20
+
21
+ request ( server )
22
+ . get ( '/' )
23
+ . set ( 'Accept-Encoding' , 'gzip' )
24
+ . expect ( 'Content-Encoding' , 'gzip' )
25
+ . expect ( 200 , done )
26
+ } )
27
+
28
+ it ( 'res.write(Buffer)' , function ( done ) {
29
+ var server = createServer ( { threshold : 0 } , function ( req , res ) {
30
+ res . setHeader ( 'Content-Type' , 'text/plain' )
31
+ res . end ( Buffer . from ( 'hello world' ) )
32
+ } )
33
+
34
+ request ( server )
35
+ . get ( '/' )
36
+ . set ( 'Accept-Encoding' , 'gzip' )
37
+ . expect ( 'Content-Encoding' , 'gzip' )
38
+ . expect ( 200 , done )
39
+ } )
40
+
41
+ it ( 'res.write(Uint8Array)' , function ( done ) {
42
+ var server = createServer ( { threshold : 0 } , function ( req , res ) {
43
+ res . setHeader ( 'Content-Type' , 'text/plain' )
44
+ res . end ( new Uint8Array ( 1 ) )
45
+ } )
46
+
47
+ request ( server )
48
+ . get ( '/' )
49
+ . set ( 'Accept-Encoding' , 'gzip' )
50
+ . expect ( 'Content-Encoding' , 'gzip' )
51
+ . expect ( 200 , done )
52
+ } )
53
+ } )
54
+
55
+ describe ( 'should throw with invalid types' , function ( ) {
56
+ it ( 'res.write(1) should fire ERR_INVALID_ARG_TYPE' , function ( done ) {
57
+ var server = createServer ( { threshold : 0 } , function ( req , res ) {
58
+ res . setHeader ( 'Content-Type' , 'text/plain' )
59
+ try {
60
+ res . write ( 1 )
61
+ } catch ( err ) {
62
+ assert . ok ( err . code === 'ERR_INVALID_ARG_TYPE' )
63
+ res . statusCode = 500
64
+ res . flush ( )
65
+ res . end ( )
66
+ }
67
+ } )
68
+
69
+ request ( server )
70
+ . get ( '/' )
71
+ . set ( 'Accept-Encoding' , 'gzip' )
72
+ . expect ( 500 , done )
73
+ } )
74
+
75
+ it ( 'res.write({}) should fire ERR_INVALID_ARG_TYPE' , function ( done ) {
76
+ var server = createServer ( { threshold : 0 } , function ( req , res ) {
77
+ res . setHeader ( 'Content-Type' , 'text/plain' )
78
+ try {
79
+ res . write ( { } )
80
+ } catch ( err ) {
81
+ assert . ok ( err . code === 'ERR_INVALID_ARG_TYPE' )
82
+ res . statusCode = 500
83
+ res . flush ( )
84
+ res . end ( )
85
+ }
86
+ } )
87
+
88
+ request ( server )
89
+ . get ( '/' )
90
+ . set ( 'Accept-Encoding' , 'gzip' )
91
+ . expect ( 500 , done )
92
+ } )
15
93
94
+ it ( 'res.write(null) should fire ERR_STREAM_NULL_VALUES' , function ( done ) {
95
+ var server = createServer ( { threshold : 0 } , function ( req , res ) {
96
+ res . setHeader ( 'Content-Type' , 'text/plain' )
97
+ try {
98
+ res . write ( null )
99
+ } catch ( err ) {
100
+ assert . ok ( err . code === 'ERR_STREAM_NULL_VALUES' )
101
+ res . statusCode = 500
102
+ res . flush ( )
103
+ res . end ( )
104
+ }
105
+ } )
106
+
107
+ request ( server )
108
+ . get ( '/' )
109
+ . set ( 'Accept-Encoding' , 'gzip' )
110
+ . expect ( 500 , done )
111
+ } )
112
+ } )
113
+
114
+ it ( 'res.write() should throw ERR_STREAM_DESTROYED when destoyed stream' , function ( done ) {
16
115
var server = createServer ( { threshold : 0 } , function ( req , res ) {
17
116
res . setHeader ( 'Content-Type' , 'text/plain' )
117
+ res . end ( 'hello world' )
18
118
19
- res . write ( Buffer . from ( reponseText ) , ( err ) => {
20
- if ( err ) {
21
- console . error ( 'err' , err )
22
- }
119
+ server . on ( 'close' , ( ) => {
120
+ res . write ( 'hello world' , function ( err ) {
121
+ assert . ok ( err . code === 'ERR_STREAM_DESTROYED' )
122
+ } )
123
+ } )
124
+ } )
125
+
126
+ request ( server )
127
+ . get ( '/' )
128
+ . set ( 'Accept-Encoding' , 'gzip' )
129
+ . expect ( shouldHaveHeader ( 'Content-Encoding' ) )
130
+ . expect ( shouldHaveBodyLength ( 'hello world' . length ) )
131
+ . expect ( 200 , done )
132
+ } )
23
133
134
+ it ( 'res.write() should call callback if passsed' , function ( done ) {
135
+ var server = createServer ( { threshold : 0 } , function ( req , res ) {
136
+ res . setHeader ( 'Content-Type' , 'text/plain' )
137
+
138
+ res . write ( 'hello, world' , function ( ) {
24
139
res . end ( )
25
140
} )
26
141
} )
@@ -29,10 +144,32 @@ describe('compression()', function () {
29
144
. get ( '/' )
30
145
. set ( 'Accept-Encoding' , 'gzip' )
31
146
. expect ( shouldHaveHeader ( 'Content-Encoding' ) )
32
- . expect ( shouldHaveBodyLength ( reponseText . length ) )
147
+ . expect ( shouldHaveBodyLength ( 'hello, world' . length ) )
33
148
. expect ( 200 , done )
34
149
} )
35
150
151
+ it ( 'res.write() should call callback with error after end' , function ( done ) {
152
+ var onError = sinon . spy ( function ( err ) {
153
+ assert . ok ( err . code === 'ERR_STREAM_WRITE_AFTER_END' )
154
+ } )
155
+
156
+ var server = createServer ( { threshold : 0 } , function ( req , res ) {
157
+ res . setHeader ( 'Content-Type' , 'text/plain' )
158
+ res . end ( )
159
+
160
+ res . write ( 'hello, world' , onError )
161
+
162
+ process . nextTick ( function ( ) {
163
+ assert . ok ( onError . callCount > 0 )
164
+ } )
165
+ } )
166
+
167
+ request ( server )
168
+ . get ( '/' )
169
+ . set ( 'Accept-Encoding' , 'gzip' )
170
+ . end ( done )
171
+ } )
172
+
36
173
it ( 'should skip HEAD' , function ( done ) {
37
174
var server = createServer ( { threshold : 0 } , function ( req , res ) {
38
175
res . setHeader ( 'Content-Type' , 'text/plain' )
@@ -460,17 +597,28 @@ describe('compression()', function () {
460
597
} )
461
598
462
599
it ( 'should return false writing after end' , function ( done ) {
600
+ var onError = sinon . spy ( function ( err ) {
601
+ assert . ok ( err . code === 'ERR_STREAM_WRITE_AFTER_END' )
602
+ } )
603
+
463
604
var server = createServer ( { threshold : 0 } , function ( req , res ) {
605
+ res . on ( 'error' , onError )
464
606
res . setHeader ( 'Content-Type' , 'text/plain' )
607
+
465
608
res . end ( 'hello, world' )
466
- assert . ok ( res . write ( ) === false )
467
- assert . ok ( res . end ( ) === false )
609
+
610
+ assert . ok ( res . write ( '' , onError ) === false )
611
+
612
+ process . nextTick ( function ( ) {
613
+ assert . ok ( onError . callCount > 0 )
614
+ } )
468
615
} )
469
616
470
617
request ( server )
471
618
. get ( '/' )
472
619
. set ( 'Accept-Encoding' , 'gzip' )
473
- . expect ( 'Content-Encoding' , 'gzip' , done )
620
+ . expect ( 'Content-Encoding' , 'gzip' )
621
+ . end ( done )
474
622
} )
475
623
} )
476
624
@@ -682,9 +830,12 @@ describe('compression()', function () {
682
830
} )
683
831
} )
684
832
685
- function createServer ( opts , fn ) {
833
+ function createServer ( opts , fn , t ) {
686
834
var _compression = compression ( opts )
687
835
return http . createServer ( function ( req , res ) {
836
+ if ( t ) {
837
+ res . on ( 'finish' , function ( ) { console . log ( t . title , 'server closed' ) } )
838
+ }
688
839
_compression ( req , res , function ( err ) {
689
840
if ( err ) {
690
841
res . statusCode = err . status || 500
@@ -705,7 +856,8 @@ function shouldHaveBodyLength (length) {
705
856
706
857
function shouldHaveHeader ( header ) {
707
858
return function ( res ) {
708
- assert . ok ( ( header . toLowerCase ( ) in res . headers ) , 'should have header ' + header )
859
+ var ok = ( header . toLowerCase ( ) in res . headers )
860
+ assert . ok ( ok , 'should have header ' + header )
709
861
}
710
862
}
711
863
0 commit comments