/**
 * @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.
 */

import { Page } from 'puppeteer';

import * as pg from './helpers/page';
import * as unit from './helpers/unit.page';
import { testcases, tab } from './unit.testcases';

const { CI = false } = process.env;

let page: Page;

beforeAll(async () => {
  page = await pg.newPage();
  await page.setViewport({ height: 1000, width: 500 });
});

afterAll(async () => {
  await page.close();
});

for (const tc of testcases) {
  // Snapshot top of unit page.
  test(`main - ${tc.name} (${tc.path})`, async () => {
    await page.goto(`${tc.path}`);
    await unit.prepare(page);
    const image = await page.screenshot();
    expect(image).toMatchImageSnapshot({
      customSnapshotIdentifier: unit.snapshotId('mobile', tc.path),
    });
  });

  // Snapshot additional unit page sections.
  for (const id of tc.ids) {
    const path = `${tc.path}${id}`;
    test(`main - ${tc.name} (${path})`, async () => {
      await page.goto(path);
      await unit.prepare(page);
      const image = await page.screenshot();
      expect(image).toMatchImageSnapshot({
        customSnapshotIdentifier: unit.snapshotId('mobile', path),
      });
    });
  }

  // Snapshot additional unit page tabs.
  for (const t of tc.tabs) {
    // Skip versions tab in CI.
    if (CI && t == tab.VERSIONS) continue;
    const path = `${tc.path}?tab=${t}`;
    test(`${t} - ${tc.name} (${path})`, async () => {
      await page.goto(path);
      await unit.prepare(page);
      const image = await page.screenshot();
      expect(image).toMatchImageSnapshot({
        customSnapshotIdentifier: unit.snapshotId('mobile', path),
      });
    });
  }
}

test('no page errors', () => {
  expect(pageErrors).toHaveLength(0);
});
