import * as http from 'http'; import * as net from 'net' import express from 'express'; type HandlerFunc = (req: express.Request, res: express.Response) => void; export default class TestServer { private http?: http.Server; private app: express.Application; constructor( private port = 0, private address = '127.0.0.1', ){ this.app = express(); } handle(path: string, f: HandlerFunc): TestServer { this.app.get(path, f); return this; } receiveContent(path: string, content: string): TestServer { this.app.get(path, (_req: express.Request, res: express.Response) => { res.status(200).send(content) }); return this; } url(path = '/'): string { if (!this.http) { throw new Error('http server not started'); } const addr = this.http.address() as net.AddressInfo; return `http://${addr.address}:${addr.port}${path}` } start(): Promise { if (this.http) { throw new Error('http server already started'); } this.http = http.createServer(this.app) return new Promise((resolve) => { this.http!!.listen(this.port, this.address, () => { resolve(); }) }); } stop(): Promise { if (!this.http) { return Promise.resolve(); } return new Promise((resolve) => { this.http!!.close(() => { this.http = undefined; resolve(); }); }) } }