fetch-test-server
Version:
Test node.js HTTP servers using the fetch API
73 lines (56 loc) • 1.86 kB
JavaScript
var debug = require('debug');
var http = require('http');
var nodeFetch = require('node-fetch');
var log = debug('fetch-test-server');
function TestServer(app) {
if (!(this instanceof TestServer)) {
return new TestServer();
}
// allow custom promise
if (!TestServer.Promise) {
throw new Error('native promise missing, set TestServer.Promise to your favorite alternative');
}
this.Promise = TestServer.Promise;
this.server = http.createServer(app);
['delete', 'get', 'head', 'options', 'patch', 'post', 'put'].forEach((method) => {
this[method] = (path, options) =>
this.fetch(path, Object.assign({}, options, { method: method.toUpperCase() }));
});
Object.defineProperty(this, 'address', {
get: function address() {
var port = this.server.address().port;
return `http://localhost:${port}`;
}
});
}
TestServer.prototype.listen = function listen() {
if (!this.listener) {
this.listener = new this.Promise((resolve, reject) => {
this.server.listen(0, () => resolve())
.on('error', (err) => reject(err));
});
}
return this.listener;
};
TestServer.prototype.close = function close() {
this.listener = null;
return new this.Promise((resolve, reject) => {
this.server.close((err) => (err ? reject(err) : resolve()));
});
};
TestServer.prototype.fetch = function fetch(path, opts) {
return this.listen().then(() => {
var url = `${this.address}${path}`;
var options = Object.assign({ headers: {} }, opts);
// automatic JSON encoding
if (typeof options.body === 'object') {
options.headers['Content-Type'] = 'application/json';
options.body = JSON.stringify(options.body);
}
log(url, options);
return nodeFetch(url, options);
});
};
// expose Promise
TestServer.Promise = global.Promise;
module.exports = TestServer;