40 lines
1.0 KiB
TypeScript
40 lines
1.0 KiB
TypeScript
import http from 'node:http';
|
|
import type { Express } from 'express';
|
|
|
|
export interface RunningTestServer {
|
|
baseUrl: string;
|
|
close: () => Promise<void>;
|
|
}
|
|
|
|
export function startTestServer(app: Express): Promise<RunningTestServer> {
|
|
return new Promise((resolve, reject) => {
|
|
const server = http.createServer(app);
|
|
|
|
server.once('error', reject);
|
|
server.listen(0, '127.0.0.1', () => {
|
|
server.off('error', reject);
|
|
const address = server.address();
|
|
|
|
if (typeof address !== 'object' || address === null) {
|
|
server.close();
|
|
reject(new Error('Test server did not expose a listening address.'));
|
|
return;
|
|
}
|
|
|
|
resolve({
|
|
baseUrl: `http://127.0.0.1:${address.port}`,
|
|
close: () =>
|
|
new Promise((closeResolve, closeReject) => {
|
|
server.close((error) => {
|
|
if (error) {
|
|
closeReject(error);
|
|
return;
|
|
}
|
|
closeResolve();
|
|
});
|
|
}),
|
|
});
|
|
});
|
|
});
|
|
}
|