/**
 * @license
 * Copyright 2021 The Go Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style
 * license that can be found in the LICENSE file.
 */

const puppeteer = require('puppeteer');
const NodeEnvironment = require('jest-environment-node');

const {
  AUTHORIZATION = null,
  BASE_URL = 'http://host.docker.internal:8080',
  // PORT default value should match ./global-setup.ts.
  PORT = 3000,
} = process.env;

/**
 * PuppeteerEnvironment is a custom jest test environment. It extends the node
 * test environment to initialize global variables, connect puppeteer on
 * the host machine to the chromium instance running in docker, and add
 * authorization to requests when the AUTHORIZATION env var is set.
 */
class PuppeteerEnvironment extends NodeEnvironment {
  constructor(config) {
    super(config);
    this.global.baseURL = BASE_URL;
    this.global.pageErrors = [];
    this.global.newPage = async () => {
      const page = await this.global.browser.newPage();
      if (AUTHORIZATION) {
        await page.setRequestInterception(true);
        page.on('request', r => {
          const url = new URL(r.url());
          let headers = r.headers();
          if (url.origin === BASE_URL) {
            headers = { ...r.headers(), Authorization: `Bearer ${AUTHORIZATION}` };
          }
          r.continue({ headers });
        });
      }
      page.on('pageerror', err => {
        this.global.pageErrors.push(err);
      });
      return page;
    };
  }

  async setup() {
    await super.setup();
    this.global.browser = await puppeteer.connect({
      browserWSEndpoint: `ws://localhost:${PORT}`,
      defaultViewport: { height: 800, width: 1280 },
    });
  }

  async teardown() {
    await super.teardown();
    await this.global.browser.disconnect();
  }
}

module.exports = PuppeteerEnvironment;
