import { E2E_TIMEOUT, setupPuppeteer, } from '../../../packages/vue/__tests__/e2e/e2eUtils' import { expect } from 'vitest' import { startE2ETestServer } from './server' const { page, html, transitionStart, waitForInnerHTML } = setupPuppeteer() const appearTransitionStart = (containerSelector: string) => page().evaluate(selector => { ;(window as any).setAppear() return Promise.resolve().then( () => (document.querySelector(selector) as HTMLElement)!.innerHTML, ) }, containerSelector) function toSlug(value: string) { return value .trim() .toLowerCase() .replace(/[^a-z0-9]+/g, '-') .replace(/^-+|-+$/g, '') } function resolveCaseId(testName: string) { const parts = testName .split(' > ') .map(item => item.trim()) .filter(Boolean) const testTitle = parts[parts.length - 1] if (!testTitle) { throw new Error(`[transition-group] Invalid test name: "${testName}"`) } const suiteParts = parts.slice(1, -1) const folderParts = suiteParts.length ? suiteParts : [parts[0]] const folderPath = folderParts.map(toSlug).join('/') return `${folderPath}/${toSlug(testTitle)}` } describe('vapor transition-group', () => { let server: Awaited> let port = 0 beforeAll(async () => { server = await startE2ETestServer('transition-group', import.meta.dirname) port = server.port }) afterAll(() => { server.close() }) beforeEach(async () => { const testName = expect.getState().currentTestName || '' const caseId = resolveCaseId(testName) const baseUrl = `http://localhost:${port}/transition-group/?case=${caseId}` await page().goto(baseUrl) await page().waitForSelector('#app') }) test( 'enter', async () => { const btnSelector = '.enter > button' const containerSelector = '.enter > div' expect(await html(containerSelector)).toBe( `
a
` + `
b
` + `
c
`, ) expect( (await transitionStart(btnSelector, containerSelector)).innerHTML, ).toBe( `
a
` + `
b
` + `
c
` + `
d
` + `
e
`, ) await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
` + `
d
` + `
e
`, ) await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
` + `
d
` + `
e
`, ) }, E2E_TIMEOUT, ) test( 'if + for enter', async () => { const btnSelector = '.if-for-enter > button.toggle' const addBtnSelector = '.if-for-enter > button.add' const containerSelector = '.if-for-enter > div' expect(await html(containerSelector)).toBe(``) expect( (await transitionStart(btnSelector, containerSelector)).innerHTML, ).toBe( ``, ) await waitForInnerHTML( containerSelector, ``, ) await waitForInnerHTML( containerSelector, ``, ) // add a new item expect( (await transitionStart(addBtnSelector, containerSelector)).innerHTML, ).toBe( ``, ) await waitForInnerHTML( containerSelector, ``, ) }, E2E_TIMEOUT, ) test( 'for + if enter', async () => { const btnSelector = '.for-if-enter > button.toggle' const addBtnSelector = '.for-if-enter > button.add' const containerSelector = '.for-if-enter > div' expect(await html(containerSelector)).toBe(``) expect( (await transitionStart(btnSelector, containerSelector)).innerHTML, ).toBe( ``, ) await waitForInnerHTML( containerSelector, ``, ) await waitForInnerHTML( containerSelector, ``, ) // add a new item expect( (await transitionStart(addBtnSelector, containerSelector)).innerHTML, ).toBe( ``, ) await waitForInnerHTML( containerSelector, ``, ) }, E2E_TIMEOUT, ) test( 'leave', async () => { const btnSelector = '.leave > button' const containerSelector = '.leave > div' expect(await html(containerSelector)).toBe( `
a
` + `
b
` + `
c
`, ) expect( (await transitionStart(btnSelector, containerSelector)).innerHTML, ).toBe( `
a
` + `
b
` + `
c
`, ) await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
`, ) await waitForInnerHTML(containerSelector, `
b
`) }, E2E_TIMEOUT, ) test( 'enter + leave', async () => { const btnSelector = '.enter-leave > button' const containerSelector = '.enter-leave > div' expect(await html(containerSelector)).toBe( `
a
` + `
b
` + `
c
`, ) expect( (await transitionStart(btnSelector, containerSelector)).innerHTML, ).toBe( `
a
` + `
b
` + `
c
` + `
d
`, ) await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
` + `
d
`, ) await waitForInnerHTML( containerSelector, `
b
` + `
c
` + `
d
`, ) }, E2E_TIMEOUT, ) test( 'appear', async () => { const btnSelector = '.appear > button' const containerSelector = '.appear > div' expect(await html('.appear')).toBe(``) // appear expect(await appearTransitionStart(containerSelector)).toBe( `
a
` + `
b
` + `
c
`, ) await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
`, ) await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
`, ) // enter expect( (await transitionStart(btnSelector, containerSelector)).innerHTML, ).toBe( `
a
` + `
b
` + `
c
` + `
d
` + `
e
`, ) await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
` + `
d
` + `
e
`, ) await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
` + `
d
` + `
e
`, ) }, E2E_TIMEOUT, ) test( 'move', async () => { const btnSelector = '.move > button' const containerSelector = '.move > div' expect(await html(containerSelector)).toBe( `
a
` + `
b
` + `
c
`, ) expect( (await transitionStart(btnSelector, containerSelector)).innerHTML, ).toBe( `
d
` + `
b
` + `
a
` + `
c
`, ) await waitForInnerHTML( containerSelector, `
d
` + `
b
` + `
a
` + `
c
`, ) await waitForInnerHTML( containerSelector, `
d
` + `
b
` + `
a
`, ) }, E2E_TIMEOUT, ) test('dynamic name', async () => { const btnSelector = '.dynamic-name button.toggleBtn' const btnChangeName = '.dynamic-name button.changeNameBtn' const containerSelector = '.dynamic-name > div' expect(await html(containerSelector)).toBe( `
a
` + `
b
` + `
c
`, ) // invalid name expect( (await transitionStart(btnSelector, containerSelector)).innerHTML, ).toBe(`
b
` + `
c
` + `
a
`) // change name expect( (await transitionStart(btnChangeName, containerSelector)).innerHTML, ).toBe( `
a
` + `
b
` + `
c
`, ) await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
`, ) }) test('events', async () => { const btnSelector = '.events > button' const containerSelector = '.events > div' expect(await html('.events')).toBe(``) // appear expect(await appearTransitionStart(containerSelector)).toBe( `
a
` + `
b
` + `
c
`, ) await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
`, ) let calls = await page().evaluate(() => { return (window as any).getCalls() }) expect(calls).toContain('beforeAppear') expect(calls).toContain('onAppear') expect(calls).not.toContain('afterAppear') await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
`, ) expect( await page().evaluate(() => { return (window as any).getCalls() }), ).toContain('afterAppear') // enter + leave expect( (await transitionStart(btnSelector, containerSelector)).innerHTML, ).toBe( `
a
` + `
b
` + `
c
` + `
d
`, ) calls = await page().evaluate(() => { return (window as any).getCalls() }) expect(calls).toContain('beforeLeave') expect(calls).toContain('onLeave') expect(calls).not.toContain('afterLeave') expect(calls).toContain('beforeEnter') expect(calls).toContain('onEnter') expect(calls).not.toContain('afterEnter') await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
` + `
d
`, ) calls = await page().evaluate(() => { return (window as any).getCalls() }) expect(calls).not.toContain('afterLeave') expect(calls).not.toContain('afterEnter') await waitForInnerHTML( containerSelector, `
b
` + `
c
` + `
d
`, ) calls = await page().evaluate(() => { return (window as any).getCalls() }) expect(calls).toContain('afterLeave') expect(calls).toContain('afterEnter') }) test( 'reusable transition group', async () => { const btnSelector = '.reusable-transition-group > button' const containerSelector = '.reusable-transition-group > div' expect(await html(containerSelector)).toBe( `
a
` + `
b
` + `
c
`, ) expect( (await transitionStart(btnSelector, containerSelector)).innerHTML, ).toBe( `
d
` + `
b
` + `
a
` + `
c
`, ) await waitForInnerHTML( containerSelector, `
d
` + `
b
` + `
a
` + `
c
`, ) await waitForInnerHTML( containerSelector, `
d
` + `
b
` + `
a
`, ) }, E2E_TIMEOUT, ) describe('interop', () => { test('render vdom component', async () => { const btnSelector = '.interop > button' const containerSelector = '.interop > div' expect(await html(containerSelector)).toBe( `
a
` + `
b
` + `
c
`, ) expect( (await transitionStart(btnSelector, containerSelector)).innerHTML, ).toBe( `
a
` + `
b
` + `
c
` + `
d
`, ) await waitForInnerHTML( containerSelector, `
a
` + `
b
` + `
c
` + `
d
`, ) await waitForInnerHTML( containerSelector, `
b
` + `
c
` + `
d
`, ) }) }) })