@@ -31,6 +31,51 @@ describe("update", () => {
31
31
return response . end ( "rejected status code test" )
32
32
}
33
33
34
+ if ( request . url === "/no-location-header" ) {
35
+ response . writeHead ( 301 )
36
+ response . writeHead ( 301 , "testing" , {
37
+ location : "" ,
38
+ } )
39
+ return response . end ( "rejected status code test" )
40
+ }
41
+
42
+ if ( request . url === "/location-redirect" ) {
43
+ const latest : LatestResponse = {
44
+ name : "4.0.2" ,
45
+ }
46
+ response . writeHead ( 200 )
47
+ return response . end ( JSON . stringify ( latest ) )
48
+ }
49
+
50
+ if ( request . url === "/with-location-header" ) {
51
+ response . writeHead ( 301 )
52
+ response . writeHead ( 301 , "testing" , {
53
+ location : "/location-redirect" ,
54
+ } )
55
+
56
+ return response . end ( )
57
+ }
58
+
59
+ // NOTES subpath match /redirect/${number}
60
+ // if number === 0, resolve it
61
+ if ( request . url . match ( / \/ r e d i r e c t \/ [ 0 - 9 ] / ) ) {
62
+ if ( request . url === "/redirect/0" ) {
63
+ response . writeHead ( 200 )
64
+ return response . end ( "done" )
65
+ }
66
+
67
+ // Subtract 1 from the current redirect number
68
+ // i.e. /redirect/10 -> /redirect/9 -> /redirect/8
69
+ const urlSplit = request . url . split ( "/" )
70
+ const currentRedirectNumber = urlSplit [ urlSplit . length - 1 ]
71
+ const newRedirectNumber = parseInt ( currentRedirectNumber ) + 1
72
+
73
+ response . writeHead ( 302 , "testing" , {
74
+ location : `/redirect/${ String ( newRedirectNumber ) } ` ,
75
+ } )
76
+ return response . end ( "" )
77
+ }
78
+
34
79
// Anything else is a 404.
35
80
response . writeHead ( 404 )
36
81
response . end ( "not found" )
@@ -84,6 +129,7 @@ describe("update", () => {
84
129
} )
85
130
86
131
beforeEach ( ( ) => {
132
+ jest . clearAllMocks ( )
87
133
spy = [ ]
88
134
} )
89
135
@@ -194,4 +240,45 @@ describe("update", () => {
194
240
} )
195
241
}
196
242
} )
243
+
244
+ it ( "should reject if no location header provided" , async ( ) => {
245
+ if ( isAddressInfo ( _address ) ) {
246
+ const mockURL = `http://${ _address . address } :${ _address . port } /no-location-header`
247
+ let provider = new UpdateProvider ( mockURL , settings ( ) )
248
+ let update = await provider . getUpdate ( true )
249
+
250
+ expect ( update . version ) . toBe ( "unknown" )
251
+ expect ( logger . error ) . toHaveBeenCalled ( )
252
+ expect ( logger . error ) . toHaveBeenCalledWith ( "Failed to get latest version" , {
253
+ identifier : "error" ,
254
+ value : `received redirect with no location header` ,
255
+ } )
256
+ }
257
+ } )
258
+
259
+ it ( "should resolve the request with response.headers.location" , async ( ) => {
260
+ if ( isAddressInfo ( _address ) ) {
261
+ const mockURL = `http://${ _address . address } :${ _address . port } /with-location-header`
262
+ let provider = new UpdateProvider ( mockURL , settings ( ) )
263
+ let update = await provider . getUpdate ( true )
264
+
265
+ expect ( logger . error ) . not . toHaveBeenCalled ( )
266
+ expect ( update . version ) . toBe ( "4.0.2" )
267
+ }
268
+ } )
269
+
270
+ it ( "should reject if more than 10 redirects" , async ( ) => {
271
+ if ( isAddressInfo ( _address ) ) {
272
+ const mockURL = `http://${ _address . address } :${ _address . port } /redirect/10`
273
+ let provider = new UpdateProvider ( mockURL , settings ( ) )
274
+ let update = await provider . getUpdate ( true )
275
+
276
+ expect ( update . version ) . toBe ( "unknown" )
277
+ expect ( logger . error ) . toHaveBeenCalled ( )
278
+ expect ( logger . error ) . toHaveBeenCalledWith ( "Failed to get latest version" , {
279
+ identifier : "error" ,
280
+ value : `reached max redirects` ,
281
+ } )
282
+ }
283
+ } )
197
284
} )
0 commit comments