feat(ct): rerender to update (#17972)

This commit is contained in:
sand4rt 2022-10-11 04:56:33 +02:00 committed by GitHub
parent 3592269caf
commit 1a43af3fb6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 47 additions and 47 deletions

View file

@ -45,7 +45,7 @@ export interface MountOptions {
interface MountResult extends Locator { interface MountResult extends Locator {
unmount(): Promise<void>; unmount(): Promise<void>;
rerender(component: JSX.Element): Promise<void>; update(component: JSX.Element): Promise<void>;
} }
export interface ComponentFixtures { export interface ComponentFixtures {

View file

@ -83,6 +83,6 @@ window.playwrightUnmount = async rootElement => {
throw new Error('Component was not mounted'); throw new Error('Component was not mounted');
}; };
window.playwrightRerender = async (rootElement, component) => { window.playwrightUpdate = async (rootElement, component) => {
ReactDOM.render(render(/** @type {Component} */(component)), rootElement); ReactDOM.render(render(/** @type {Component} */(component)), rootElement);
}; };

View file

@ -51,7 +51,7 @@ export interface MountOptions<Component extends SvelteComponent = SvelteComponen
interface MountResult<Component extends SvelteComponent> extends Locator { interface MountResult<Component extends SvelteComponent> extends Locator {
unmount(): Promise<void>; unmount(): Promise<void>;
rerender(options: Omit<MountOptions<Component>, 'hooksConfig'|'slots'>): Promise<void> update(options: Omit<MountOptions<Component>, 'hooksConfig'|'slots'>): Promise<void>
} }
interface ComponentFixtures { interface ComponentFixtures {

View file

@ -114,7 +114,7 @@ window.playwrightUnmount = async rootElement => {
svelteComponent.$destroy(); svelteComponent.$destroy();
}; };
window.playwrightRerender = async (rootElement, component) => { window.playwrightUpdate = async (rootElement, component) => {
const svelteComponent = /** @type {SvelteComponent} */ (rootElement[svelteComponentKey]); const svelteComponent = /** @type {SvelteComponent} */ (rootElement[svelteComponentKey]);
if (!svelteComponent) if (!svelteComponent)
throw new Error('Component was not mounted'); throw new Error('Component was not mounted');

View file

@ -50,12 +50,12 @@ export interface MountOptions<Props = Record<string, unknown>> {
interface MountResult<Props = Record<string, unknown>> extends Locator { interface MountResult<Props = Record<string, unknown>> extends Locator {
unmount(): Promise<void>; unmount(): Promise<void>;
rerender(options: Omit<MountOptions<Props>, 'hooksConfig'>): Promise<void> update(options: Omit<MountOptions<Props>, 'hooksConfig'>): Promise<void>
} }
interface MountResultJsx extends Locator { interface MountResultJsx extends Locator {
unmount(): Promise<void>; unmount(): Promise<void>;
rerender(component: JSX.Element): Promise<void> update(component: JSX.Element): Promise<void>
} }
export interface ComponentFixtures { export interface ComponentFixtures {

View file

@ -201,7 +201,7 @@ window.playwrightUnmount = async rootElement => {
app.unmount(); app.unmount();
}; };
window.playwrightRerender = async (rootElement, options) => { window.playwrightUpdate = async (rootElement, options) => {
const wrapper = rootElement[wrapperKey]; const wrapper = rootElement[wrapperKey];
if (!wrapper) if (!wrapper)
throw new Error('Component was not mounted'); throw new Error('Component was not mounted');

View file

@ -50,12 +50,12 @@ export interface MountOptions<Props = Record<string, unknown>> {
interface MountResult<Props = Record<string, unknown>> extends Locator { interface MountResult<Props = Record<string, unknown>> extends Locator {
unmount(): Promise<void>; unmount(): Promise<void>;
rerender(options: Omit<MountOptions<Props>, 'hooksConfig'>): Promise<void> update(options: Omit<MountOptions<Props>, 'hooksConfig'>): Promise<void>
} }
interface MountResultJsx extends Locator { interface MountResultJsx extends Locator {
unmount(): Promise<void>; unmount(): Promise<void>;
rerender(component: JSX.Element): Promise<void> update(component: JSX.Element): Promise<void>
} }
export interface ComponentFixtures { export interface ComponentFixtures {

View file

@ -171,7 +171,7 @@ window.playwrightUnmount = async rootElement => {
component.$el.remove(); component.$el.remove();
}; };
window.playwrightRerender = async (element, options) => { window.playwrightUpdate = async (element, options) => {
const wrapper = /** @type {any} */(element)[wrapperKey]; const wrapper = /** @type {any} */(element)[wrapperKey];
if (!wrapper) if (!wrapper)
throw new Error('Component was not mounted'); throw new Error('Component was not mounted');

View file

@ -21,7 +21,7 @@ let boundCallbacksForMount: Function[] = [];
interface MountResult extends Locator { interface MountResult extends Locator {
unmount(locator: Locator): Promise<void>; unmount(locator: Locator): Promise<void>;
rerender(options: Omit<MountOptions, 'hooksConfig'> | string | JsxComponent): Promise<void>; update(options: Omit<MountOptions, 'hooksConfig'> | string | JsxComponent): Promise<void>;
} }
export const fixtures: Fixtures< export const fixtures: Fixtures<
@ -60,9 +60,9 @@ export const fixtures: Fixtures<
await window.playwrightUnmount(rootElement); await window.playwrightUnmount(rootElement);
}); });
}, },
rerender: async (options: JsxComponent | Omit<MountOptions, 'hooksConfig'>) => { update: async (options: JsxComponent | Omit<MountOptions, 'hooksConfig'>) => {
if (isJsxApi(options)) return await innerRerender(page, options); if (isJsxApi(options)) return await innerUpdate(page, options);
await innerRerender(page, component, options); await innerUpdate(page, component, options);
} }
}); });
}); });
@ -74,7 +74,7 @@ function isJsxApi(options: Record<string, unknown>): options is JsxComponent {
return options?.kind === 'jsx'; return options?.kind === 'jsx';
} }
async function innerRerender(page: Page, jsxOrType: JsxComponent | string, options: Omit<MountOptions, 'hooksConfig'> = {}): Promise<void> { async function innerUpdate(page: Page, jsxOrType: JsxComponent | string, options: Omit<MountOptions, 'hooksConfig'> = {}): Promise<void> {
const component = createComponent(jsxOrType, options); const component = createComponent(jsxOrType, options);
wrapFunctions(component, page, boundCallbacksForMount); wrapFunctions(component, page, boundCallbacksForMount);
@ -94,7 +94,7 @@ async function innerRerender(page: Page, jsxOrType: JsxComponent | string, optio
unwrapFunctions(component); unwrapFunctions(component);
const rootElement = document.getElementById('root')!; const rootElement = document.getElementById('root')!;
return await window.playwrightRerender(rootElement, component); return await window.playwrightUpdate(rootElement, component);
}, { component }); }, { component });
} }

View file

@ -40,6 +40,6 @@ declare global {
interface Window { interface Window {
playwrightMount(component: Component, rootElement: Element, hooksConfig: any): Promise<void>; playwrightMount(component: Component, rootElement: Element, hooksConfig: any): Promise<void>;
playwrightUnmount(rootElement: Element): Promise<void>; playwrightUnmount(rootElement: Element): Promise<void>;
playwrightRerender(rootElement: Element, component: Component): Promise<void>; playwrightUpdate(rootElement: Element, component: Component): Promise<void>;
} }
} }

View file

@ -17,7 +17,7 @@ test('renderer updates props without remounting', async ({ mount }) => {
const component = await mount(<Counter count={9001} />) const component = await mount(<Counter count={9001} />)
await expect(component.locator('#props')).toContainText('9001') await expect(component.locator('#props')).toContainText('9001')
await component.rerender(<Counter count={1337} />) await component.update(<Counter count={1337} />)
await expect(component).not.toContainText('9001') await expect(component).not.toContainText('9001')
await expect(component.locator('#props')).toContainText('1337') await expect(component.locator('#props')).toContainText('1337')
@ -28,7 +28,7 @@ test('renderer updates callbacks without remounting', async ({ mount }) => {
const component = await mount(<Counter />) const component = await mount(<Counter />)
const messages: string[] = [] const messages: string[] = []
await component.rerender(<Counter onClick={message => { await component.update(<Counter onClick={message => {
messages.push(message) messages.push(message)
}} />) }} />)
await component.click(); await component.click();
@ -41,7 +41,7 @@ test('renderer updates slots without remounting', async ({ mount }) => {
const component = await mount(<Counter>Default Slot</Counter>) const component = await mount(<Counter>Default Slot</Counter>)
await expect(component).toContainText('Default Slot') await expect(component).toContainText('Default Slot')
await component.rerender(<Counter>Test Slot</Counter>) await component.update(<Counter>Test Slot</Counter>)
await expect(component).not.toContainText('Default Slot') await expect(component).not.toContainText('Default Slot')
await expect(component).toContainText('Test Slot') await expect(component).toContainText('Test Slot')

View file

@ -20,7 +20,7 @@ test('renderer updates props without remounting', async ({ mount }) => {
const component = await mount(<Counter count={9001} />) const component = await mount(<Counter count={9001} />)
await expect(component.locator('#props')).toContainText('9001') await expect(component.locator('#props')).toContainText('9001')
await component.rerender(<Counter count={1337} />) await component.update(<Counter count={1337} />)
await expect(component).not.toContainText('9001') await expect(component).not.toContainText('9001')
await expect(component.locator('#props')).toContainText('1337') await expect(component.locator('#props')).toContainText('1337')
@ -31,7 +31,7 @@ test('renderer updates callbacks without remounting', async ({ mount }) => {
const component = await mount(<Counter />) const component = await mount(<Counter />)
const messages: string[] = [] const messages: string[] = []
await component.rerender(<Counter onClick={message => { await component.update(<Counter onClick={message => {
messages.push(message) messages.push(message)
}} />) }} />)
await component.click(); await component.click();
@ -44,7 +44,7 @@ test('renderer updates slots without remounting', async ({ mount }) => {
const component = await mount(<Counter>Default Slot</Counter>) const component = await mount(<Counter>Default Slot</Counter>)
await expect(component).toContainText('Default Slot') await expect(component).toContainText('Default Slot')
await component.rerender(<Counter>Test Slot</Counter>) await component.update(<Counter>Test Slot</Counter>)
await expect(component).not.toContainText('Default Slot') await expect(component).not.toContainText('Default Slot')
await expect(component).toContainText('Test Slot') await expect(component).toContainText('Test Slot')

View file

@ -39,7 +39,7 @@ test('renderer updates props without remounting', async ({ mount }) => {
}) })
await expect(component.locator('#props')).toContainText('9001') await expect(component.locator('#props')).toContainText('9001')
await component.rerender({ await component.update({
props: { count: 1337 } props: { count: 1337 }
}) })
await expect(component).not.toContainText('9001') await expect(component).not.toContainText('9001')
@ -52,7 +52,7 @@ test('renderer updates event listeners without remounting', async ({ mount }) =>
const component = await mount(Counter) const component = await mount(Counter)
const messages: string[] = [] const messages: string[] = []
await component.rerender({ await component.update({
on: { on: {
submit: (data: string) => messages.push(data) submit: (data: string) => messages.push(data)
} }

View file

@ -40,7 +40,7 @@ test('renderer updates props without remounting', async ({ mount }) => {
}) })
await expect(component.locator('#props')).toContainText('9001') await expect(component.locator('#props')).toContainText('9001')
await component.rerender({ await component.update({
props: { count: 1337 } props: { count: 1337 }
}) })
await expect(component).not.toContainText('9001') await expect(component).not.toContainText('9001')
@ -53,7 +53,7 @@ test('renderer updates event listeners without remounting', async ({ mount }) =>
const component = await mount(Counter) const component = await mount(Counter)
const messages: string[] = [] const messages: string[] = []
await component.rerender({ await component.update({
on: { on: {
submit: (data: string) => messages.push(data) submit: (data: string) => messages.push(data)
} }

View file

@ -17,10 +17,10 @@ test('renderer and keep the component instance intact', async ({ mount }) => {
const component = await mount(<Counter count={9001} />); const component = await mount(<Counter count={9001} />);
await expect(component.locator('#rerender-count')).toContainText('9001') await expect(component.locator('#rerender-count')).toContainText('9001')
await component.rerender(<Counter count={1337} />) await component.update(<Counter count={1337} />)
await expect(component.locator('#rerender-count')).toContainText('1337') await expect(component.locator('#rerender-count')).toContainText('1337')
await component.rerender(<Counter count={42} />) await component.update(<Counter count={42} />)
await expect(component.locator('#rerender-count')).toContainText('42') await expect(component.locator('#rerender-count')).toContainText('42')
await expect(component.locator('#remount-count')).toContainText('1') await expect(component.locator('#remount-count')).toContainText('1')

View file

@ -27,10 +27,10 @@ test('renderer and keep the component instance intact', async ({ mount }) => {
}); });
await expect(component.locator('#rerender-count')).toContainText('9001') await expect(component.locator('#rerender-count')).toContainText('9001')
await component.rerender({ props: { count: 1337 } }) await component.update({ props: { count: 1337 } })
await expect(component.locator('#rerender-count')).toContainText('1337') await expect(component.locator('#rerender-count')).toContainText('1337')
await component.rerender({ props: { count: 42 } }) await component.update({ props: { count: 42 } })
await expect(component.locator('#rerender-count')).toContainText('42') await expect(component.locator('#rerender-count')).toContainText('42')
await expect(component.locator('#remount-count')).toContainText('1') await expect(component.locator('#remount-count')).toContainText('1')

View file

@ -17,7 +17,7 @@ test('renderer updates props without remounting', async ({ mount }) => {
const component = await mount(<Counter count={9001} />) const component = await mount(<Counter count={9001} />)
await expect(component.locator('#props')).toContainText('9001') await expect(component.locator('#props')).toContainText('9001')
await component.rerender(<Counter count={1337} />) await component.update(<Counter count={1337} />)
await expect(component).not.toContainText('9001') await expect(component).not.toContainText('9001')
await expect(component.locator('#props')).toContainText('1337') await expect(component.locator('#props')).toContainText('1337')
@ -28,7 +28,7 @@ test('renderer updates event listeners without remounting', async ({ mount }) =>
const component = await mount(<Counter />) const component = await mount(<Counter />)
const messages = [] const messages = []
await component.rerender(<Counter v-on:submit={count => { await component.update(<Counter v-on:submit={count => {
messages.push(count) messages.push(count)
}} />) }} />)
await component.click(); await component.click();
@ -41,7 +41,7 @@ test('renderer updates slots without remounting', async ({ mount }) => {
const component = await mount(<Counter>Default Slot</Counter>) const component = await mount(<Counter>Default Slot</Counter>)
await expect(component).toContainText('Default Slot') await expect(component).toContainText('Default Slot')
await component.rerender(<Counter> await component.update(<Counter>
<template v-slot:main>Test Slot</template> <template v-slot:main>Test Slot</template>
</Counter>) </Counter>)
await expect(component).not.toContainText('Default Slot') await expect(component).not.toContainText('Default Slot')

View file

@ -25,7 +25,7 @@ test('renderer updates props without remounting', async ({ mount }) => {
}) })
await expect(component.locator('#props')).toContainText('9001') await expect(component.locator('#props')).toContainText('9001')
await component.rerender({ await component.update({
props: { count: 1337 } props: { count: 1337 }
}) })
await expect(component).not.toContainText('9001') await expect(component).not.toContainText('9001')
@ -38,7 +38,7 @@ test('renderer updates event listeners without remounting', async ({ mount }) =>
const component = await mount(Counter) const component = await mount(Counter)
const messages = [] const messages = []
await component.rerender({ await component.update({
on: { on: {
submit: count => messages.push(count) submit: count => messages.push(count)
} }
@ -55,7 +55,7 @@ test('renderer updates slots without remounting', async ({ mount }) => {
}) })
await expect(component).toContainText('Default Slot') await expect(component).toContainText('Default Slot')
await component.rerender({ await component.update({
slots: { main: 'Test Slot' } slots: { main: 'Test Slot' }
}) })
await expect(component).not.toContainText('Default Slot') await expect(component).not.toContainText('Default Slot')

View file

@ -25,7 +25,7 @@ test('renderer updates props without remounting', async ({ mount }) => {
}) })
await expect(component.locator('#props')).toContainText('9001') await expect(component.locator('#props')).toContainText('9001')
await component.rerender({ await component.update({
props: { count: 1337 } props: { count: 1337 }
}) })
await expect(component).not.toContainText('9001') await expect(component).not.toContainText('9001')
@ -38,7 +38,7 @@ test('renderer updates event listeners without remounting', async ({ mount }) =>
const component = await mount(Counter) const component = await mount(Counter)
const messages = [] const messages = []
await component.rerender({ await component.update({
on: { on: {
submit: data => messages.push(data) submit: data => messages.push(data)
} }
@ -55,7 +55,7 @@ test('renderer updates slots without remounting', async ({ mount }) => {
}) })
await expect(component).toContainText('Default Slot') await expect(component).toContainText('Default Slot')
await component.rerender({ await component.update({
slots: { main: 'Test Slot' } slots: { main: 'Test Slot' }
}) })
await expect(component).not.toContainText('Default Slot') await expect(component).not.toContainText('Default Slot')

View file

@ -16,7 +16,7 @@ test('renderer updates props without remounting', async ({ mount }) => {
const component = await mount(<Counter count={9001} />) const component = await mount(<Counter count={9001} />)
await expect(component.locator('#props')).toContainText('9001') await expect(component.locator('#props')).toContainText('9001')
await component.rerender(<Counter count={1337} />) await component.update(<Counter count={1337} />)
await expect(component).not.toContainText('9001') await expect(component).not.toContainText('9001')
await expect(component.locator('#props')).toContainText('1337') await expect(component.locator('#props')).toContainText('1337')
@ -27,7 +27,7 @@ test('renderer updates event listeners without remounting', async ({ mount }) =>
const messages = [] const messages = []
const component = await mount(<Counter />) const component = await mount(<Counter />)
await component.rerender(<Counter v-on:submit={count => { await component.update(<Counter v-on:submit={count => {
messages.push(count) messages.push(count)
}} />) }} />)
await component.click(); await component.click();
@ -40,7 +40,7 @@ test('renderer updates slots without remounting', async ({ mount }) => {
const component = await mount(<Counter>Default Slot</Counter>) const component = await mount(<Counter>Default Slot</Counter>)
await expect(component).toContainText('Default Slot') await expect(component).toContainText('Default Slot')
await component.rerender(<Counter> await component.update(<Counter>
<template v-slot:main>Test Slot</template> <template v-slot:main>Test Slot</template>
</Counter>) </Counter>)
await expect(component).not.toContainText('Default Slot') await expect(component).not.toContainText('Default Slot')

View file

@ -23,7 +23,7 @@ test('renderer updates props without remounting', async ({ mount }) => {
}) })
await expect(component.locator('#props')).toContainText('9001') await expect(component.locator('#props')).toContainText('9001')
await component.rerender({ await component.update({
props: { count: 1337 } props: { count: 1337 }
}) })
await expect(component).not.toContainText('9001') await expect(component).not.toContainText('9001')
@ -36,7 +36,7 @@ test('renderer updates event listeners without remounting', async ({ mount }) =>
const component = await mount(Counter) const component = await mount(Counter)
const messages = [] const messages = []
await component.rerender({ await component.update({
on: { on: {
submit: data => messages.push(data) submit: data => messages.push(data)
} }
@ -53,13 +53,13 @@ test('renderer updates slots without remounting', async ({ mount }) => {
}) })
await expect(component).toContainText('Default Slot') await expect(component).toContainText('Default Slot')
await component.rerender({ await component.update({
slots: { main: 'Test Slot' } slots: { main: 'Test Slot' }
}) })
await expect(component).not.toContainText('Default Slot') await expect(component).not.toContainText('Default Slot')
await expect(component).toContainText('Test Slot') await expect(component).toContainText('Test Slot')
await component.rerender({ await component.update({
slots: { default: 'Default Slot' } slots: { default: 'Default Slot' }
}) })
await expect(component).toContainText('Default Slot') await expect(component).toContainText('Default Slot')