import http from 'http';
import net from 'net';
import express from 'express';
import { Browser, Page, ElementHandle, Serializable } from 'puppeteer';
import { launchBrowser } from '../../../puppeteer-tests/util';
import { PageObjectElement } from './page_object_element';
import { TestBed, describePageObjectElement } from './page_object_element_test_cases';

describe('PageObjectElement on Puppeter', () => {
  let browser: Browser;
  let page: Page;

  let httpServer: http.Server;
  let testPageUrl: string;
  let testPageHtml: string;

  before(async () => {
    // Configure an Express app to serve the test page.
    const app = express();
    app.get('/', (_, res) => res.send(testPageHtml));

    // Launch HTTP server on random port.
    await new Promise((resolve) => {
      httpServer = app.listen(0, resolve);
    });
    const port = (httpServer!.address() as net.AddressInfo).port;

    // The test page will be served on this URL.
    testPageUrl = `http://localhost:${port}/`;

    // Launch browser.
    browser = await launchBrowser();
  });

  after(async () => {
    // Shut down browser and HTTP server.
    await browser.close();
    await new Promise((resolve) => httpServer.close(resolve));
  });

  beforeEach(async () => { page = await browser.newPage(); });
  afterEach(async () => { await page.close(); });

  // A handle for the top-level element in the HTML provided via the test bed.
  let container: ElementHandle<HTMLElement>;

  const testBed: TestBed = {
    setUpPageObjectElement: async (html: string) => {
      // Set up the test page.
      testPageHtml = `
        <html>
          <head><title>Test page</title></head>
          <body>${html}</body>
        </html>
      `;
      await page.goto(testPageUrl);

      // Make sure there is only one top-level element.
      const elements = await page.$$('body > *');
      if (elements.length !== 1) {
        throw new Error('the given HTML contains more than one top-level element');
      }

      // Retrieve the top-level element and wrap it inside a PageObjectElement.
      container = elements[0];
      return new PageObjectElement(container);
    },

    evaluate: async <T extends Serializable | void = void>(fn: (el: HTMLElement) => T) => {
      return await container.evaluate(fn) as T;
    }
  };

  describePageObjectElement(testBed);
});
