| /** |
| * @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 './global-types'; |
| import puppeteer, { Page } from 'puppeteer'; |
| |
| describe('pkgsite (desktop)', () => { |
| let page: Page; |
| beforeEach(async () => { |
| page = await newPage(); |
| await page.goto(baseURL + '/golang.org/x/pkgsite'); |
| await prepare(page); |
| }); |
| |
| afterEach(async () => { |
| await page.close(); |
| }); |
| |
| test('accessibility tree', async () => { |
| const a11yTree = await page.accessibility.snapshot(); |
| expect(a11yTree).toMatchSnapshot(); |
| }); |
| |
| test('full page', async () => { |
| const image = await page.screenshot({ fullPage: true }); |
| expect(image).toMatchImageSnapshot({}); |
| }); |
| |
| test('fixed header appears after scrolling', async () => { |
| await page.evaluate(() => window.scrollTo({ top: 250 })); |
| const image = await page.screenshot(); |
| expect(image).toMatchImageSnapshot(); |
| }); |
| |
| test('readme expand and collapse', async () => { |
| await page.click(select('readme-expand')); |
| await page.evaluate(() => window.scrollTo({ top: 0 })); |
| const expanded = await page.screenshot({ fullPage: true }); |
| expect(expanded).toMatchImageSnapshot(); |
| await page.click(select('readme-collapse')); |
| await page.evaluate(() => window.scrollTo({ top: 0 })); |
| const collapsed = await page.screenshot({ fullPage: true }); |
| expect(collapsed).toMatchImageSnapshot(); |
| }); |
| |
| test('directories expand and collapse', async () => { |
| await page.click(select('directories-toggle')); |
| await page.evaluate(() => window.scrollTo({ top: 0 })); |
| const expanded = await page.screenshot({ fullPage: true }); |
| expect(expanded).toMatchImageSnapshot(); |
| await page.click(select('directories-toggle')); |
| await page.evaluate(() => window.scrollTo({ top: 0 })); |
| const collapsed = await page.screenshot({ fullPage: true }); |
| expect(collapsed).toMatchImageSnapshot(); |
| }); |
| |
| test('jump to without identifiers', async () => { |
| await page.click(select('jump-to-button')); |
| await page.evaluate(() => window.scrollTo({ top: 0 })); |
| const expanded = await page.screenshot(); |
| expect(expanded).toMatchImageSnapshot(); |
| await page.click(select('close-dialog')); |
| await page.evaluate(() => window.scrollTo({ top: 0 })); |
| const collapsed = await page.screenshot(); |
| expect(collapsed).toMatchImageSnapshot(); |
| }); |
| }); |
| |
| describe('pkgsite (mobile)', () => { |
| let page: Page; |
| beforeAll(async () => { |
| page = await newPage(); |
| await page.emulate(puppeteer.devices['Pixel 2']); |
| await page.goto(baseURL + '/golang.org/x/pkgsite'); |
| await prepare(page); |
| }); |
| |
| afterAll(async () => { |
| await page.close(); |
| }); |
| |
| test('accessibility tree', async () => { |
| const a11yTree = await page.accessibility.snapshot(); |
| expect(a11yTree).toMatchSnapshot(); |
| }); |
| |
| test('full page', async () => { |
| const image = await page.screenshot({ fullPage: true }); |
| expect(image).toMatchImageSnapshot(); |
| }); |
| |
| test('fixed header appears after scrolling', async () => { |
| await page.evaluate(() => window.scrollTo({ top: 250 })); |
| const image = await page.screenshot(); |
| expect(image).toMatchImageSnapshot(); |
| }); |
| }); |
| |
| describe('derrors', () => { |
| let page: Page; |
| beforeAll(async () => { |
| page = await newPage(); |
| await page.goto(baseURL + '/golang.org/x/pkgsite/internal/derrors'); |
| await prepare(page); |
| }); |
| |
| afterAll(async () => { |
| await page.close(); |
| }); |
| |
| test('accessibility tree', async () => { |
| const a11yTree = await page.accessibility.snapshot(); |
| expect(a11yTree).toMatchSnapshot(); |
| }); |
| |
| test('full page', async () => { |
| const image = await page.screenshot({ fullPage: true }); |
| expect(image).toMatchImageSnapshot(); |
| }); |
| |
| test.each` |
| href |
| ${'#section-documentation'} |
| ${'#pkg-overview'} |
| ${'#pkg-index'} |
| ${'#pkg-constants'} |
| ${'#pkg-variables'} |
| ${'#pkg-functions'} |
| ${'#Add'} |
| ${'#pkg-types'} |
| ${'#StackError'} |
| ${'#NewStackError'} |
| ${'#section-sourcefiles'} |
| `('doc outline $href', async ({ href }) => { |
| await page.click(`[href="${href}"][role="treeitem"]`); |
| const image = await page.screenshot(); |
| expect(image).toMatchImageSnapshot(); |
| }); |
| |
| test('jump to with identifiers', async () => { |
| await page.click(select('jump-to-button')); |
| const expanded = await page.screenshot(); |
| expect(expanded).toMatchImageSnapshot(); |
| await page.keyboard.type('Wrap'); |
| const inputWrap = await page.screenshot(); |
| expect(inputWrap).toMatchImageSnapshot(); |
| await page.keyboard.press('Enter'); |
| const wrap = await page.screenshot(); |
| expect(wrap).toMatchImageSnapshot(); |
| }); |
| }); |
| |
| test('no page errors', () => { |
| expect(pageErrors).toHaveLength(0); |
| }); |
| |
| /** |
| * select will create a data-test-id attribute selector for a given test id. |
| * @param testId the test id of the element to select. |
| * @param rest a place to add combinators and additional selectors. |
| * @returns an attribute selector. |
| */ |
| function select(testId: string, rest = ''): string { |
| return `[data-test-id="${testId}"] ${rest}`; |
| } |
| |
| /** |
| * prepare gets the page ready for snapshot testing by rewriting highly |
| * variable page content to constant values. |
| * @param page The page to prepare |
| */ |
| async function prepare(page: Page): Promise<void> { |
| await Promise.all([ |
| // Add styles to disable animation transitions. |
| page.addStyleTag({ |
| content: ` |
| *, |
| *::after, |
| *::before { |
| transition-delay: 0s !important; |
| transition-duration: 0s !important; |
| animation-delay: -0.0001s !important; |
| animation-duration: 0s !important; |
| animation-play-state: paused !important; |
| }`, |
| }), |
| page.$eval( |
| select('UnitHeader-version', 'a'), |
| el => |
| ((el as HTMLElement).innerHTML = |
| '<span class="UnitHeader-detailItemSubtle">Version: </span>v0.0.0') |
| ), |
| page.$eval( |
| select('UnitHeader-commitTime'), |
| el => ((el as HTMLElement).innerHTML = 'Published: Apr 16, 2021') |
| ), |
| page.$$eval(select('UnitHeader-imports', 'a'), els => |
| els.map(el => (el.innerHTML = 'Imports: 0')) |
| ), |
| page.$$eval(select('UnitHeader-importedby', 'a'), els => |
| els.map(el => (el.innerHTML = 'Imported by: 0')) |
| ), |
| ]); |
| } |