Skip to content

Commit c16773e

Browse files
committed
tests: remove usage of express in cloud-metadata tests
1 parent 31ca241 commit c16773e

File tree

1 file changed

+57
-3
lines changed

1 file changed

+57
-3
lines changed

test/cloud-metadata/_lib.js

+57-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66

77
'use strict';
8-
const express = require('express');
8+
const http = require('http');
99
const fixtures = require('./_fixtures');
1010

1111
// how many seconds to wait for a "slow" server
@@ -211,7 +211,7 @@ function createTestServer(provider, fixtureName) {
211211
if (!fixture) {
212212
throw new Error(`Unknown ${provider} fixture named ${fixtureName}`);
213213
}
214-
const app = express();
214+
const app = createApp();
215215
return addRoutesToExpressApp(app, provider, fixture);
216216
}
217217

@@ -229,7 +229,7 @@ function createSlowTestServer(provider, fixtureName) {
229229
if (!fixture) {
230230
throw new Error(`Unknown ${provider} fixture named ${fixtureName}`);
231231
}
232-
const app = express();
232+
const app = createApp();
233233
return addSlowRoutesToExpressApp(app, provider, fixture);
234234
}
235235

@@ -243,6 +243,60 @@ function loadFixtureData(provider, fixtureName) {
243243
return fixture;
244244
}
245245

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+
246300
module.exports = {
247301
createTestServer,
248302
createSlowTestServer,

0 commit comments

Comments
 (0)