test(header): migrate to generators (#27311)

Issue number: N/A

---------

<!-- Please refer to our contributing documentation for any questions on
submitting a pull request, or let us know here if you need any help:
https://ionicframework.com/docs/building/contributing -->

<!-- Some docs updates need to be made in the `ionic-docs` repo, in a
separate PR. See
https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#modifying-documentation
for details. -->

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->

Header tests us legacy syntax

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Header tests us generator syntax

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!-- If this introduces a breaking change, please describe the impact
and migration path for existing applications below. -->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->
This commit is contained in:
Liam DeBeasi
2023-04-27 17:42:00 -04:00
committed by GitHub
parent 43a61b0e46
commit e3a0935c95
51 changed files with 160 additions and 164 deletions

View File

@ -1,34 +0,0 @@
import AxeBuilder from '@axe-core/playwright';
import { expect } from '@playwright/test';
import { test } from '@utils/test/playwright';
test.describe('header: a11y', () => {
test.beforeEach(async ({ skip }) => {
skip.rtl();
skip.mode('md');
});
test('should not have accessibility violations', async ({ page }) => {
await page.goto(`/src/components/header/test/a11y`);
const headers = page.locator('ion-header');
await expect(headers.first()).toHaveAttribute('role', 'banner');
await expect(headers.last()).toHaveAttribute('role', 'none');
const results = await new AxeBuilder({ page }).analyze();
expect(results.violations).toEqual([]);
});
test('should allow for custom role', async ({ page }) => {
/**
* Note: This example should not be used in production.
* This only serves to check that `role` can be customized.
*/
await page.setContent(`
<ion-header role="heading"></ion-header>
`);
const header = page.locator('ion-header');
await expect(header).toHaveAttribute('role', 'heading');
});
});

View File

@ -0,0 +1,34 @@
import AxeBuilder from '@axe-core/playwright';
import { expect } from '@playwright/test';
import { configs, test } from '@utils/test/playwright';
configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => {
test.describe(title('header: a11y'), () => {
test('should not have accessibility violations', async ({ page }) => {
await page.goto(`/src/components/header/test/a11y`, config);
const headers = page.locator('ion-header');
await expect(headers.first()).toHaveAttribute('role', 'banner');
await expect(headers.last()).toHaveAttribute('role', 'none');
const results = await new AxeBuilder({ page }).analyze();
expect(results.violations).toEqual([]);
});
test('should allow for custom role', async ({ page }) => {
/**
* Note: This example should not be used in production.
* This only serves to check that `role` can be customized.
*/
await page.setContent(
`
<ion-header role="heading"></ion-header>
`,
config
);
const header = page.locator('ion-header');
await expect(header).toHaveAttribute('role', 'heading');
});
});
});

View File

@ -1,44 +1,54 @@
import { expect } from '@playwright/test';
import { test } from '@utils/test/playwright';
import { configs, test } from '@utils/test/playwright';
test.describe('header: basic', () => {
test.describe('header: rendering', () => {
configs().forEach(({ title, screenshot, config }) => {
test.describe(title('header: rendering'), () => {
test('should not have visual regressions with basic header', async ({ page }) => {
await page.setContent(`
await page.setContent(
`
<ion-header>
<ion-toolbar>
<ion-title>Header - Default</ion-title>
</ion-toolbar>
</ion-header>
`);
`,
config
);
const header = page.locator('ion-header');
await expect(header).toHaveScreenshot(`header-diff-${page.getSnapshotSettings()}.png`);
await expect(header).toHaveScreenshot(screenshot(`header-diff`));
});
});
});
test.describe('header: feature rendering', () => {
test.beforeEach(({ skip }) => {
skip.rtl();
});
configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('header: feature rendering'), () => {
test('should not have visual regressions with no border', async ({ page }) => {
await page.setContent(`
await page.setContent(
`
<ion-header class="ion-no-border">
<ion-toolbar>
<ion-title>Header - No Border</ion-title>
</ion-toolbar>
</ion-header>
`);
`,
config
);
const header = page.locator('ion-header');
await expect(header).toHaveScreenshot(`header-no-border-diff-${page.getSnapshotSettings()}.png`);
await expect(header).toHaveScreenshot(screenshot(`header-no-border-diff`));
});
});
});
test('should not have visual regressions with translucent header', async ({ page, skip }) => {
skip.mode('md', 'Translucent effect is only available in iOS mode.');
await page.setContent(`
/**
* Translucent effect is only available in iOS mode.
*/
configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('header: translucent'), () => {
test('should not have visual regressions with translucent header', async ({ page }) => {
await page.setContent(
`
<ion-header translucent="true">
<div style="position: absolute; top: 0; left: 0; right: 0; bottom: 0">
<img style="transform: rotate(145deg) scale(1.5)" src="/src/components/header/test/img.jpg" />
@ -47,16 +57,17 @@ test.describe('header: basic', () => {
<ion-title>Header - Translucent</ion-title>
</ion-toolbar>
</ion-header>
`);
`,
config
);
const header = page.locator('ion-header');
await expect(header).toHaveScreenshot(`header-translucent-diff-${page.getSnapshotSettings()}.png`);
await expect(header).toHaveScreenshot(screenshot(`header-translucent-diff`));
});
test('should not have visual regressions with translucent header with color', async ({ page, skip }) => {
skip.mode('md', 'Translucent effect is only available in iOS mode.');
await page.setContent(`
test('should not have visual regressions with translucent header with color', async ({ page }) => {
await page.setContent(
`
<ion-header translucent="true">
<div style="position: absolute; top: 0; left: 0; right: 0; bottom: 0">
<img style="transform: rotate(145deg) scale(1.5)" src="/src/components/header/test/img.jpg" />
@ -65,10 +76,12 @@ test.describe('header: basic', () => {
<ion-title>Header - Translucent</ion-title>
</ion-toolbar>
</ion-header>
`);
`,
config
);
const header = page.locator('ion-header');
await expect(header).toHaveScreenshot(`header-translucent-color-diff-${page.getSnapshotSettings()}.png`);
await expect(header).toHaveScreenshot(screenshot(`header-translucent-color-diff`));
});
});
});

View File

@ -1,45 +0,0 @@
import { expect } from '@playwright/test';
import { test } from '@utils/test/playwright';
test.describe('header: condense', () => {
test('should be hidden from screen readers when collapsed', async ({ page, skip }) => {
skip.mode('md');
skip.rtl();
await page.goto('/src/components/header/test/condense');
const largeTitleHeader = page.locator('#largeTitleHeader');
const smallTitleHeader = page.locator('#smallTitleHeader');
const content = page.locator('ion-content');
await expect(smallTitleHeader).toHaveAttribute('aria-hidden', 'true');
await expect(largeTitleHeader).toHaveScreenshot(
`header-condense-large-title-initial-diff-${page.getSnapshotSettings()}.png`,
{ animations: 'disabled' }
);
await content.evaluate(async (el: HTMLIonContentElement) => {
await el.scrollToBottom();
});
await page.waitForSelector('#largeTitleHeader.header-collapse-condense-inactive');
await expect(smallTitleHeader).toHaveScreenshot(
`header-condense-large-title-collapsed-diff-${page.getSnapshotSettings()}.png`,
{ animations: 'disabled' }
);
/**
* Playwright can't do .not.toHaveAttribute() because a value is expected,
* and toHaveAttribute can't accept a value of type null.
*/
const ariaHidden = await smallTitleHeader.getAttribute('aria-hidden');
expect(ariaHidden).toBeNull();
await content.evaluate(async (el: HTMLIonContentElement) => {
await el.scrollToTop();
});
await page.waitForSelector('#smallTitleHeader.header-collapse-condense-inactive');
await expect(smallTitleHeader).toHaveAttribute('aria-hidden', 'true');
});
});

View File

@ -0,0 +1,38 @@
import { expect } from '@playwright/test';
import { configs, test } from '@utils/test/playwright';
configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('header: condense'), () => {
test('should be hidden from screen readers when collapsed', async ({ page }) => {
await page.goto('/src/components/header/test/condense', config);
const largeTitleHeader = page.locator('#largeTitleHeader');
const smallTitleHeader = page.locator('#smallTitleHeader');
const content = page.locator('ion-content');
await expect(smallTitleHeader).toHaveAttribute('aria-hidden', 'true');
await expect(largeTitleHeader).toHaveScreenshot(screenshot(`header-condense-large-title-initial-diff`));
await content.evaluate(async (el: HTMLIonContentElement) => {
await el.scrollToBottom();
});
await page.waitForSelector('#largeTitleHeader.header-collapse-condense-inactive');
await expect(smallTitleHeader).toHaveScreenshot(screenshot(`header-condense-large-title-collapsed-diff`));
/**
* Playwright can't do .not.toHaveAttribute() because a value is expected,
* and toHaveAttribute can't accept a value of type null.
*/
const ariaHidden = await smallTitleHeader.getAttribute('aria-hidden');
expect(ariaHidden).toBeNull();
await content.evaluate(async (el: HTMLIonContentElement) => {
await el.scrollToTop();
});
await page.waitForSelector('#smallTitleHeader.header-collapse-condense-inactive');
await expect(smallTitleHeader).toHaveAttribute('aria-hidden', 'true');
});
});
});

View File

@ -1,27 +0,0 @@
import { expect } from '@playwright/test';
import { test } from '@utils/test/playwright';
test.describe('header: fade', () => {
test.beforeEach(({ skip }) => {
skip.rtl();
});
test('should not have visual regressions with fade header', async ({ page, skip }) => {
skip.mode('md', 'Translucent effect is only available in iOS mode.');
await page.goto('/src/components/header/test/fade');
const header = page.locator('ion-header');
await expect(header).toHaveScreenshot(`header-fade-not-blurred-diff-${page.getSnapshotSettings()}.png`, {
animations: 'disabled',
});
const content = page.locator('ion-content');
await content.evaluate((el: HTMLIonContentElement) => el.scrollToBottom(0));
await page.waitForChanges();
await expect(header).toHaveScreenshot(`header-fade-blurred-diff-${page.getSnapshotSettings()}.png`, {
animations: 'disabled',
});
});
});

View File

@ -0,0 +1,22 @@
import { expect } from '@playwright/test';
import { configs, test } from '@utils/test/playwright';
/**
* Translucent effect is only available in iOS mode.
*/
configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('header: fade'), () => {
test('should not have visual regressions with fade header', async ({ page }) => {
await page.goto('/src/components/header/test/fade', config);
const header = page.locator('ion-header');
await expect(header).toHaveScreenshot(screenshot(`header-fade-not-blurred-diff`));
const content = page.locator('ion-content');
await content.evaluate((el: HTMLIonContentElement) => el.scrollToBottom(0));
await page.waitForChanges();
await expect(header).toHaveScreenshot(screenshot(`header-fade-blurred-diff`));
});
});
});

View File

@ -1,32 +0,0 @@
import { expect } from '@playwright/test';
import { test } from '@utils/test/playwright';
test.describe('header: scroll-target', () => {
test.beforeEach(({ skip }) => {
skip.rtl();
});
/**
* This test suite verifies that the fade effect for iOS is working correctly
* when the `ion-header` is using a custom scroll target with the `.ion-content-scroll-host`
* selector.
*/
test('should not have visual regressions with custom scroll target header', async ({ page, skip }) => {
skip.mode('md', 'Translucent effect is only available in iOS mode.');
await page.goto('/src/components/header/test/scroll-target');
const header = page.locator('ion-header');
await expect(header).toHaveScreenshot(`header-scroll-target-not-blurred-diff-${page.getSnapshotSettings()}.png`, {
animations: 'disabled',
});
const scrollTarget = page.locator('#scroll-target');
await scrollTarget.evaluate((el: HTMLDivElement) => (el.scrollTop = el.scrollHeight));
await page.waitForChanges();
await expect(header).toHaveScreenshot(`header-scroll-target-blurred-diff-${page.getSnapshotSettings()}.png`, {
animations: 'disabled',
});
});
});

View File

@ -0,0 +1,27 @@
import { expect } from '@playwright/test';
import { configs, test } from '@utils/test/playwright';
/**
* Translucent effect is only available in iOS mode.
*/
configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
test.describe(title('header: scroll-target'), () => {
/**
* This test suite verifies that the fade effect for iOS is working correctly
* when the `ion-header` is using a custom scroll target with the `.ion-content-scroll-host`
* selector.
*/
test('should not have visual regressions with custom scroll target header', async ({ page }) => {
await page.goto('/src/components/header/test/scroll-target', config);
const header = page.locator('ion-header');
await expect(header).toHaveScreenshot(screenshot(`header-scroll-target-not-blurred-diff`));
const scrollTarget = page.locator('#scroll-target');
await scrollTarget.evaluate((el: HTMLDivElement) => (el.scrollTop = el.scrollHeight));
await page.waitForChanges();
await expect(header).toHaveScreenshot(screenshot(`header-scroll-target-blurred-diff`));
});
});
});