await page().waitForSelector('#app')
})
- const classWhenTransitionStart = async (
- btnSelector: string,
- containerSelector: string,
- ) => {
- return page().evaluate(
+ const transitionStart = (btnSelector: string, containerSelector: string) =>
+ page().evaluate(
([btnSel, containerSel]) => {
;(document.querySelector(btnSel) as HTMLElement)!.click()
return Promise.resolve().then(() => {
},
[btnSelector, containerSelector],
)
- }
+
+ const waitForElement = (
+ selector: string,
+ text: string,
+ classNames: string[], // if empty, check for no classes
+ timeout = 2000,
+ ) =>
+ page().waitForFunction(
+ (sel, expectedText, expectedClasses) => {
+ const el = document.querySelector(sel)!
+ const hasClasses =
+ expectedClasses.length === 0
+ ? el.classList.length === 0
+ : expectedClasses.every(c => el.classList.contains(c))
+ const hasText = el?.textContent?.includes(expectedText)
+ return !!el && hasClasses && hasText
+ },
+ { timeout },
+ selector,
+ text,
+ classNames,
+ )
test(
'should work with v-show',
// leave
expect(
- (await classWhenTransitionStart(btnSelector, containerSelector))
- .classNames,
+ (await transitionStart(btnSelector, containerSelector)).classNames,
).toStrictEqual(['v-leave-from', 'v-leave-active'])
await nextFrame()
// enter
expect(
- (await classWhenTransitionStart(btnSelector, containerSelector))
- .classNames,
+ (await transitionStart(btnSelector, containerSelector)).classNames,
).toStrictEqual(['v-enter-from', 'v-enter-active'])
await nextFrame()
// leave
expect(
- (await classWhenTransitionStart(btnSelector, containerSelector))
- .classNames,
+ (await transitionStart(btnSelector, containerSelector)).classNames,
).toStrictEqual(['v-leave-from', 'v-leave-active'])
await nextFrame()
// enter
expect(
- (await classWhenTransitionStart(btnSelector, containerSelector))
- .classNames,
+ (await transitionStart(btnSelector, containerSelector)).classNames,
).toStrictEqual(['v-enter-from', 'v-enter-active'])
await nextFrame()
// change key
expect(
- (await classWhenTransitionStart(btnSelector, containerSelector))
- .classNames,
+ (await transitionStart(btnSelector, containerSelector)).classNames,
).toStrictEqual(['v-leave-from', 'v-leave-active'])
await nextFrame()
// change key again
expect(
- (await classWhenTransitionStart(btnSelector, containerSelector))
- .classNames,
+ (await transitionStart(btnSelector, containerSelector)).classNames,
).toStrictEqual(['v-leave-from', 'v-leave-active'])
await nextFrame()
async () => {
const btnSelector = '.out-in > button'
const containerSelector = '.out-in > div'
+ const childSelector = `${containerSelector} > div`
expect(await html(containerSelector)).toBe(`<div>vapor compB</div>`)
// compB -> compA
+ // compB leave
expect(
- (await classWhenTransitionStart(btnSelector, containerSelector))
- .innerHTML,
+ (await transitionStart(btnSelector, containerSelector)).innerHTML,
).toBe(`<div class="fade-leave-from fade-leave-active">vapor compB</div>`)
await nextFrame()
`<div class="fade-leave-active fade-leave-to">vapor compB</div>`,
)
- await page().waitForSelector(`${containerSelector} > div.fade-enter-from`)
- expect(await html(containerSelector)).toBe(
- `<div class="fade-enter-from fade-enter-active">vapor compA</div>`,
- )
+ // compA enter
+ await waitForElement(childSelector, 'vapor compA', [
+ 'fade-enter-from',
+ 'fade-enter-active',
+ ])
await nextFrame()
expect(await html(containerSelector)).toBe(
)
// compA -> compB
+ // compA leave
expect(
- (await classWhenTransitionStart(btnSelector, containerSelector))
- .innerHTML,
+ (await transitionStart(btnSelector, containerSelector)).innerHTML,
).toBe(`<div class="fade-leave-from fade-leave-active">vapor compA</div>`)
await nextFrame()
`<div class="fade-leave-active fade-leave-to">vapor compA</div>`,
)
- await transitionFinish()
+ // compB enter
+ await waitForElement(childSelector, 'vapor compB', [
+ 'fade-enter-from',
+ 'fade-enter-active',
+ ])
+
await nextFrame()
expect(await html(containerSelector)).toBe(
`<div class="fade-enter-active fade-enter-to">vapor compB</div>`,
)
await transitionFinish()
- await nextFrame()
expect(await html(containerSelector)).toBe(
`<div class="">vapor compB</div>`,
)
E2E_TIMEOUT,
)
- test.todo(
+ test(
'should work with in-out mode',
async () => {
const btnSelector = '.in-out > button'
const containerSelector = '.in-out > div'
+ const childSelector = `${containerSelector} > div`
expect(await html(containerSelector)).toBe(`<div>vapor compB</div>`)
// compA enter
- const { innerHTML } = await classWhenTransitionStart(
- btnSelector,
- containerSelector,
- )
- expect(innerHTML).toBe(
+ expect(
+ (await transitionStart(btnSelector, containerSelector)).innerHTML,
+ ).toBe(
`<div>vapor compB</div><div class="fade-enter-from fade-enter-active">vapor compA</div>`,
)
`<div>vapor compB</div><div class="fade-enter-active fade-enter-to">vapor compA</div>`,
)
- await transitionFinish()
- expect(await html(containerSelector)).toBe(
- `<div>vapor compB</div><div class="">vapor compA</div>`,
- )
-
// compB leave
- expect(await html(containerSelector)).toBe(
- `<div class="fade-leave-from fade-leave-active">vapor compB</div><div class="">vapor compA</div>`,
- )
+ await waitForElement(childSelector, 'vapor compB', [
+ 'fade-leave-from',
+ 'fade-leave-active',
+ ])
await nextFrame()
expect(await html(containerSelector)).toBe(
)
await transitionFinish()
- await nextFrame()
expect(await html(containerSelector)).toBe(
`<div class="">vapor compA</div>`,
)