/**
 * @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 './global-types';
import * as pg from './helpers/page';
import * as pkgsite from './helpers/pkgsite.page';

let page: Page;

beforeAll(async () => {
  page = await pg.newPage();
  await page.goto('/golang.org/x/pkgsite');
  await pkgsite.prepare(page);
});

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

test('fixed header appears after scrolling', async () => {
  await page.evaluate(() => window.scrollTo({ top: 250 }));
  const image = await page.screenshot();
  expect(image).toMatchImageSnapshot();
  await page.evaluate(() => window.scrollTo({ top: 0 }));
});

describe('readme', () => {
  test('expands', async () => {
    await page.click(pg.select('readme-expand'));
    await page.evaluate(() => window.scrollTo({ top: 0 }));
    const expanded = await page.screenshot({ fullPage: true });
    expect(expanded).toMatchImageSnapshot();
  });

  test('collapses', async () => {
    await page.click(pg.select('readme-collapse'));
    await page.evaluate(() => window.scrollTo({ top: 0 }));
    const collapsed = await page.screenshot({ fullPage: true });
    expect(collapsed).toMatchImageSnapshot();
  });
});

describe('directories', () => {
  test('expand', async () => {
    await page.click(pg.select('directories-toggle'));
    await page.evaluate(() => window.scrollTo({ top: 0 }));
    const expanded = await page.screenshot({ fullPage: true });
    expect(expanded).toMatchImageSnapshot();
  });

  test('collapse', async () => {
    await page.click(pg.select('directories-toggle'));
    await page.evaluate(() => window.scrollTo({ top: 0 }));
    const collapsed = await page.screenshot({ fullPage: true });
    expect(collapsed).toMatchImageSnapshot();
  });
});

describe('jump to modal', () => {
  test('opens', async () => {
    await page.click(pg.select('jump-to-button'));
    await page.evaluate(() => window.scrollTo({ top: 0 }));
    const expanded = await page.screenshot();
    expect(expanded).toMatchImageSnapshot();
  });

  test('closes', async () => {
    await page.click(pg.select('close-dialog'));
    await page.evaluate(() => window.scrollTo({ top: 0 }));
    const collapsed = await page.screenshot();
    expect(collapsed).toMatchImageSnapshot();
  });
});

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