import { createServer } from 'http';
import type { AddressInfo } from 'net';
import type { Express } from 'express';

export const createHttpTestClient = async (app: Express) => {
  const server = createServer(app);

  await new Promise<void>((resolve) => {
    server.listen(0, '127.0.0.1', () => resolve());
  });

  const address = server.address() as AddressInfo;
  const baseUrl = `http://127.0.0.1:${address.port}`;

  const request = (path: string, init?: RequestInit) => fetch(`${baseUrl}${path}`, init);

  const close = async () => {
    await new Promise<void>((resolve, reject) => {
      server.close((error) => {
        if (error) {
          reject(error);
          return;
        }

        resolve();
      });
    });
  };

  return {
    request,
    close,
  };
};
