5
5
*/
6
6
7
7
'use strict' ;
8
- const express = require ( 'express ' ) ;
8
+ const http = require ( 'http ' ) ;
9
9
const fixtures = require ( './_fixtures' ) ;
10
10
11
11
// how many seconds to wait for a "slow" server
@@ -211,7 +211,7 @@ function createTestServer(provider, fixtureName) {
211
211
if ( ! fixture ) {
212
212
throw new Error ( `Unknown ${ provider } fixture named ${ fixtureName } ` ) ;
213
213
}
214
- const app = express ( ) ;
214
+ const app = createApp ( ) ;
215
215
return addRoutesToExpressApp ( app , provider , fixture ) ;
216
216
}
217
217
@@ -229,7 +229,7 @@ function createSlowTestServer(provider, fixtureName) {
229
229
if ( ! fixture ) {
230
230
throw new Error ( `Unknown ${ provider } fixture named ${ fixtureName } ` ) ;
231
231
}
232
- const app = express ( ) ;
232
+ const app = createApp ( ) ;
233
233
return addSlowRoutesToExpressApp ( app , provider , fixture ) ;
234
234
}
235
235
@@ -243,6 +243,60 @@ function loadFixtureData(provider, fixtureName) {
243
243
return fixture ;
244
244
}
245
245
246
+ /**
247
+ * this function returns a HTTP server which replaces the previous usage of `express`
248
+ * for mocking cloud metadata responses.
249
+ */
250
+ function createApp ( ) {
251
+ const routes = new Map ( ) ;
252
+ const server = http . createServer ( ( req , res ) => {
253
+ const url = new URL ( req . url , 'http://localhost' ) ;
254
+ const path = url . pathname . replace ( / \/ $ / , '' ) ;
255
+ const route = `${ req . method . toUpperCase ( ) } ${ path } ` ;
256
+ const handler = routes . get ( route ) ;
257
+
258
+ if ( typeof handler === 'function' ) {
259
+ // make express like req & res
260
+ const expReq = {
261
+ headers : req . headers ,
262
+ header : ( name ) => req . headers [ name . toLowerCase ( ) ] ,
263
+ query : { } ,
264
+ } ;
265
+ url . searchParams . forEach ( ( val , key ) => {
266
+ expReq . query [ key ] = val ;
267
+ } ) ;
268
+
269
+ const expRes = {
270
+ status : ( num ) => ( res . statusCode = num ) ,
271
+ set : ( key , val ) => res . setHeader ( key , val ) ,
272
+ send : ( data ) => {
273
+ const payload =
274
+ typeof data === 'string' ? data : JSON . stringify ( data ) ;
275
+ res . writeHead ( 200 , {
276
+ 'content-type' : 'application/json' ,
277
+ 'content-length' : payload . length ,
278
+ } ) ;
279
+ res . write ( payload ) ;
280
+ res . end ( ) ;
281
+ } ,
282
+ } ;
283
+
284
+ return handler ( expReq , expRes ) ;
285
+ }
286
+
287
+ res . writeHead ( 404 , 'Not found' ) ;
288
+ res . end ( ) ;
289
+ } ) ;
290
+
291
+ // return express like app object
292
+ return {
293
+ get : ( path , handler ) => routes . set ( `GET ${ path } ` , handler ) ,
294
+ post : ( path , handler ) => routes . set ( `POST ${ path } ` , handler ) ,
295
+ put : ( path , handler ) => routes . set ( `PUT ${ path } ` , handler ) ,
296
+ listen : ( port , cb ) => server . listen ( port , cb ) ,
297
+ } ;
298
+ }
299
+
246
300
module . exports = {
247
301
createTestServer,
248
302
createSlowTestServer,
0 commit comments