mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-11-08 15:51:16 +08:00
chore(core): type checking for unit tests (#28529)
Issue number: N/A --------- <!-- 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. --> Type checking inside of the Stencil unit tests have been disabled for a long time. This has resulted in a difficult developer experience and numerous issues (both types and implementation) within our unit tests. ## What is the new behavior? <!-- Please describe the behavior or changes that are being added by this PR. --> - Type checking is now enabled for all Stencil unit tests - Tests have been updated to resolve type errors and implementation errors - Many `as any` casts were introduced, as many legacy tests test invalid configurations of functions that require it (for example passing `undefined` to an argument that cannot be `undefined`). ## 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. --> To test this PR you can checkout the branch locally. Install dependencies in the `/core` directory to make sure you are on at least `@stencil/core@4.7.2`. Opening either a `.spec.ts` or `.spec.tsx` file, validate that your IDE detects types and can provide auto completions for jest global types. If you desire, you can provide an invalid type and try building the project - you will observe the build will fail due to the invalid type.
This commit is contained in:
@ -1,8 +1,8 @@
|
||||
import { h } from '@stencil/core';
|
||||
import { newSpecPage } from '@stencil/core/testing';
|
||||
import { Toast } from '../toast';
|
||||
|
||||
import { config } from '../../../global/config';
|
||||
import { toastController } from '../../../utils/overlays';
|
||||
import { Toast } from '../toast';
|
||||
|
||||
describe('toast: custom html', () => {
|
||||
it('should not allow for custom html by default', async () => {
|
||||
@ -11,8 +11,8 @@ describe('toast: custom html', () => {
|
||||
html: `<ion-toast message="<button class='custom-html'>Custom Text</button>"></ion-toast>`,
|
||||
});
|
||||
|
||||
const toast = page.body.querySelector('ion-toast');
|
||||
const content = toast.shadowRoot.querySelector('.toast-message');
|
||||
const toast = page.body.querySelector('ion-toast')!;
|
||||
const content = toast.shadowRoot!.querySelector('.toast-message')!;
|
||||
expect(content.textContent).toContain('Custom Text');
|
||||
expect(content.querySelector('button.custom-html')).toBe(null);
|
||||
});
|
||||
@ -24,8 +24,8 @@ describe('toast: custom html', () => {
|
||||
html: `<ion-toast message="<button class='custom-html'>Custom Text</button>"></ion-toast>`,
|
||||
});
|
||||
|
||||
const toast = page.body.querySelector('ion-toast');
|
||||
const content = toast.shadowRoot.querySelector('.toast-message');
|
||||
const toast = page.body.querySelector('ion-toast')!;
|
||||
const content = toast.shadowRoot!.querySelector('.toast-message')!;
|
||||
expect(content.textContent).toContain('Custom Text');
|
||||
expect(content.querySelector('button.custom-html')).not.toBe(null);
|
||||
});
|
||||
@ -37,8 +37,8 @@ describe('toast: custom html', () => {
|
||||
html: `<ion-toast message="<button class='custom-html'>Custom Text</button>"></ion-toast>`,
|
||||
});
|
||||
|
||||
const toast = page.body.querySelector('ion-toast');
|
||||
const content = toast.shadowRoot.querySelector('.toast-message');
|
||||
const toast = page.body.querySelector('ion-toast')!;
|
||||
const content = toast.shadowRoot!.querySelector('.toast-message')!;
|
||||
expect(content.textContent).toContain('Custom Text');
|
||||
expect(content.querySelector('button.custom-html')).toBe(null);
|
||||
});
|
||||
@ -56,9 +56,9 @@ describe('toast: a11y smoke test', () => {
|
||||
html: `<ion-toast message="Message" header="Header"></ion-toast>`,
|
||||
});
|
||||
|
||||
const toast = page.body.querySelector('ion-toast');
|
||||
const header = toast.shadowRoot.querySelector('.toast-header');
|
||||
const message = toast.shadowRoot.querySelector('.toast-message');
|
||||
const toast = page.body.querySelector('ion-toast')!;
|
||||
const header = toast.shadowRoot!.querySelector('.toast-header')!;
|
||||
const message = toast.shadowRoot!.querySelector('.toast-message')!;
|
||||
|
||||
expect(header.getAttribute('aria-hidden')).toBe('true');
|
||||
expect(message.getAttribute('aria-hidden')).toBe('true');
|
||||
@ -74,7 +74,7 @@ describe('toast: a11y smoke test', () => {
|
||||
`,
|
||||
});
|
||||
|
||||
const toast = page.body.querySelector('ion-toast');
|
||||
const toast = page.body.querySelector('ion-toast')!;
|
||||
|
||||
/**
|
||||
* Wait for present method to resolve
|
||||
@ -83,8 +83,8 @@ describe('toast: a11y smoke test', () => {
|
||||
await toast.present();
|
||||
await page.waitForChanges();
|
||||
|
||||
const header = toast.shadowRoot.querySelector('.toast-header');
|
||||
const message = toast.shadowRoot.querySelector('.toast-message');
|
||||
const header = toast.shadowRoot!.querySelector('.toast-header')!;
|
||||
const message = toast.shadowRoot!.querySelector('.toast-message')!;
|
||||
|
||||
expect(header.getAttribute('aria-hidden')).toBe(null);
|
||||
expect(message.getAttribute('aria-hidden')).toBe(null);
|
||||
@ -98,7 +98,7 @@ describe('toast: duration config', () => {
|
||||
html: `<ion-toast></ion-toast>`,
|
||||
});
|
||||
|
||||
const toast = page.body.querySelector('ion-toast');
|
||||
const toast = page.body.querySelector('ion-toast')!;
|
||||
|
||||
expect(toast.duration).toBe(0);
|
||||
});
|
||||
@ -111,7 +111,7 @@ describe('toast: duration config', () => {
|
||||
html: `<ion-toast></ion-toast>`,
|
||||
});
|
||||
|
||||
const toast = page.body.querySelector('ion-toast');
|
||||
const toast = page.body.querySelector('ion-toast')!;
|
||||
|
||||
expect(toast.duration).toBe(5000);
|
||||
});
|
||||
@ -121,10 +121,10 @@ describe('toast: htmlAttributes', () => {
|
||||
it('should correctly inherit attributes on host', async () => {
|
||||
const page = await newSpecPage({
|
||||
components: [Toast],
|
||||
template: () => <ion-toast htmlAttributes={{ 'data-testid': 'basic-toast' }}></ion-toast>,
|
||||
template: () => <ion-toast overlayIndex={1} htmlAttributes={{ 'data-testid': 'basic-toast' }}></ion-toast>,
|
||||
});
|
||||
|
||||
const toast = page.body.querySelector('ion-toast');
|
||||
const toast = page.body.querySelector('ion-toast')!;
|
||||
|
||||
await expect(toast.getAttribute('data-testid')).toBe('basic-toast');
|
||||
});
|
||||
@ -134,12 +134,12 @@ describe('toast: button cancel', () => {
|
||||
it('should render the cancel button with part button-cancel', async () => {
|
||||
const page = await newSpecPage({
|
||||
components: [Toast],
|
||||
template: () => <ion-toast buttons={[{ text: 'Cancel', role: 'cancel' }]}></ion-toast>,
|
||||
template: () => <ion-toast overlayIndex={1} buttons={[{ text: 'Cancel', role: 'cancel' }]}></ion-toast>,
|
||||
});
|
||||
|
||||
const toast = page.body.querySelector('ion-toast');
|
||||
const toast = page.body.querySelector('ion-toast')!;
|
||||
|
||||
const buttonCancel = toast?.shadowRoot?.querySelector('.toast-button-cancel');
|
||||
const buttonCancel = toast.shadowRoot!.querySelector('.toast-button-cancel')!;
|
||||
|
||||
expect(buttonCancel.getAttribute('part')).toBe('button cancel');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user