| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949 |
- import path from 'node:path'
- import {
- E2E_TIMEOUT,
- setupPuppeteer,
- } from '../../../packages/vue/__tests__/e2e/e2eUtils'
- import connect from 'connect'
- import sirv from 'sirv'
- import { nextTick } from 'vue'
- const {
- page,
- classList,
- timeout,
- isVisible,
- html,
- nextFrame,
- transitionStart,
- waitForInnerHTML,
- click,
- domClick,
- } = setupPuppeteer()
- const duration = process.env.CI ? 200 : 50
- const buffer = process.env.CI ? 50 : 20
- describe('vapor transition', () => {
- let server: any
- const port = '8195'
- beforeAll(() => {
- server = connect()
- .use(sirv(path.resolve(import.meta.dirname, '../dist')))
- .listen(port)
- process.on('SIGTERM', () => server && server.close())
- })
- afterAll(() => {
- server.close()
- })
- beforeEach(async () => {
- const baseUrl = `http://localhost:${port}/transition/`
- await page().evaluateOnNewDocument(dur => {
- ;(window as any).__TRANSITION_DURATION__ = dur
- }, duration)
- await page().goto(baseUrl)
- await page().waitForSelector('#app')
- })
- describe('transition with v-if', () => {
- test(
- 'basic transition',
- async () => {
- const btnSelector = '.if-basic > button'
- const containerSelector = '.if-basic > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- `<div class="test">content</div>`,
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).outerHTML,
- ).toBe(`<div class="test v-leave-from v-leave-active">content</div>`)
- await waitForInnerHTML(
- containerSelector,
- `<div class="test v-leave-active v-leave-to">content</div>`,
- )
- await waitForInnerHTML(containerSelector, ``)
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).outerHTML,
- ).toBe(`<div class="test v-enter-from v-enter-active">content</div>`)
- await waitForInnerHTML(
- containerSelector,
- `<div class="test v-enter-active v-enter-to">content</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'named transition',
- async () => {
- const btnSelector = '.if-named > button'
- const containerSelector = '.if-named > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).outerHTML,
- ).toBe(
- `<div class="test test-leave-from test-leave-active">content</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).outerHTML,
- ).toBe(
- `<div class="test test-enter-from test-enter-active">content</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'custom transition classes',
- async () => {
- const btnSelector = '.if-custom-classes > button'
- const containerSelector = '.if-custom-classes > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).outerHTML,
- ).toBe(`<div class="test bye-from bye-active">content</div>`)
- await waitForInnerHTML(
- containerSelector,
- '<div class="test bye-active bye-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).outerHTML,
- ).toBe(`<div class="test hello-from hello-active">content</div>`)
- await waitForInnerHTML(
- containerSelector,
- '<div class="test hello-active hello-to">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'transition with dynamic name',
- async () => {
- const btnSelector = '.if-dynamic-name > button.toggle'
- const btnChangeNameSelector = '.if-dynamic-name > button.change'
- const containerSelector = '.if-dynamic-name > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).outerHTML,
- ).toBe(
- `<div class="test test-leave-from test-leave-active">content</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- await domClick(btnChangeNameSelector)
- await waitForInnerHTML(btnChangeNameSelector, 'changed')
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'changed-enter-from', 'changed-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test changed-enter-active changed-enter-to">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'transition events without appear',
- async () => {
- const btnSelector = '.if-events-without-appear > button'
- const containerSelector = '.if-events-without-appear > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('withoutAppear')
- })
- expect(calls).toStrictEqual(['beforeLeave', 'onLeave'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- expect(
- await page().evaluate(() => {
- return (window as any).getCalls('withoutAppear')
- }),
- ).not.contain('afterLeave')
- await waitForInnerHTML(containerSelector, '')
- expect(
- await page().evaluate(() => {
- return (window as any).getCalls('withoutAppear')
- }),
- ).toStrictEqual(['beforeLeave', 'onLeave', 'afterLeave'])
- await page().evaluate(() => {
- ;(window as any).resetCalls('withoutAppear')
- })
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- calls = await page().evaluate(() => {
- return (window as any).getCalls('withoutAppear')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">content</div>',
- )
- expect(
- await page().evaluate(() => {
- return (window as any).getCalls('withoutAppear')
- }),
- ).not.contain('afterEnter')
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- expect(
- await page().evaluate(() => {
- return (window as any).getCalls('withoutAppear')
- }),
- ).toStrictEqual(['beforeEnter', 'onEnter', 'afterEnter'])
- },
- E2E_TIMEOUT,
- )
- test(
- 'events with arguments',
- async () => {
- const btnSelector = '.if-events-with-args > button'
- const containerSelector = '.if-events-with-args > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- await click(btnSelector)
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('withArgs')
- })
- expect(calls).toStrictEqual(['beforeLeave', 'onLeave'])
- expect(await classList(childSelector)).toStrictEqual([
- 'test',
- 'before-leave',
- 'leave',
- ])
- await timeout(200 + buffer)
- calls = await page().evaluate(() => {
- return (window as any).getCalls('withArgs')
- })
- expect(calls).toStrictEqual(['beforeLeave', 'onLeave', 'afterLeave'])
- expect(await html(containerSelector)).toBe('')
- await page().evaluate(() => {
- ;(window as any).resetCalls('withArgs')
- })
- // enter
- await click(btnSelector)
- calls = await page().evaluate(() => {
- return (window as any).getCalls('withArgs')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter'])
- expect(await classList(childSelector)).toStrictEqual([
- 'test',
- 'before-enter',
- 'enter',
- ])
- await timeout(200 + buffer)
- calls = await page().evaluate(() => {
- return (window as any).getCalls('withArgs')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter', 'afterEnter'])
- expect(await html(containerSelector)).toBe(
- '<div class="test before-enter enter after-enter">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'onEnterCancelled',
- async () => {
- const btnSelector = '.if-enter-cancelled > button'
- const containerSelector = '.if-enter-cancelled > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe('')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">content</div>',
- )
- // cancel (leave)
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('enterCancel')
- })
- expect(calls).toStrictEqual(['enterCancelled'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- },
- E2E_TIMEOUT,
- )
- test(
- 'transition on appear',
- async () => {
- const btnSelector = '.if-appear > button'
- const containerSelector = '.if-appear > div'
- const childSelector = `${containerSelector} > div`
- // appear
- expect(await classList(childSelector)).contains('test-appear-active')
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'transition events with appear',
- async () => {
- const btnSelector = '.if-events-with-appear > button'
- const containerSelector = '.if-events-with-appear > div'
- const childSelector = `${containerSelector} > div`
- // appear
- expect(await classList(childSelector)).contains('test-appear-active')
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('withAppear')
- })
- expect(calls).toStrictEqual(['beforeAppear', 'onAppear'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- calls = await page().evaluate(() => {
- return (window as any).getCalls('withAppear')
- })
- expect(calls).toStrictEqual(['beforeAppear', 'onAppear', 'afterAppear'])
- await page().evaluate(() => {
- ;(window as any).resetCalls('withAppear')
- })
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- calls = await page().evaluate(() => {
- return (window as any).getCalls('withAppear')
- })
- expect(calls).toStrictEqual(['beforeLeave', 'onLeave'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- calls = await page().evaluate(() => {
- return (window as any).getCalls('withAppear')
- })
- expect(calls).not.contain('afterLeave')
- await waitForInnerHTML(containerSelector, '')
- calls = await page().evaluate(() => {
- return (window as any).getCalls('withAppear')
- })
- expect(calls).toStrictEqual(['beforeLeave', 'onLeave', 'afterLeave'])
- await page().evaluate(() => {
- ;(window as any).resetCalls('withAppear')
- })
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- calls = await page().evaluate(() => {
- return (window as any).getCalls('withAppear')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">content</div>',
- )
- calls = await page().evaluate(() => {
- return (window as any).getCalls('withAppear')
- })
- expect(calls).not.contain('afterEnter')
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- calls = await page().evaluate(() => {
- return (window as any).getCalls('withAppear')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter', 'afterEnter'])
- },
- E2E_TIMEOUT,
- )
- test(
- 'css: false',
- async () => {
- const btnSelector = '.if-css-false > button'
- const containerSelector = '.if-css-false > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- await click(btnSelector)
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('cssFalse')
- })
- expect(calls).toStrictEqual(['beforeLeave', 'onLeave', 'afterLeave'])
- expect(await html(containerSelector)).toBe('')
- await page().evaluate(() => {
- ;(window as any).resetCalls('cssFalse')
- })
- // enter
- await transitionStart(btnSelector, childSelector)
- calls = await page().evaluate(() => {
- return (window as any).getCalls('cssFalse')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter', 'afterEnter'])
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'no transition detected',
- async () => {
- const btnSelector = '.if-no-trans > button'
- const containerSelector = '.if-no-trans > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe('<div>content</div>')
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['noop-leave-from', 'noop-leave-active'])
- await waitForInnerHTML(containerSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['noop-enter-from', 'noop-enter-active'])
- await waitForInnerHTML(containerSelector, '<div class="">content</div>')
- },
- E2E_TIMEOUT,
- )
- test(
- 'animations',
- async () => {
- const btnSelector = '.if-ani > button'
- const containerSelector = '.if-ani > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe('<div>content</div>')
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test-anim-leave-from', 'test-anim-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test-anim-leave-active test-anim-leave-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test-anim-enter-from', 'test-anim-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test-anim-enter-active test-anim-enter-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '<div class="">content</div>')
- },
- E2E_TIMEOUT,
- )
- test(
- 'explicit transition type',
- async () => {
- const btnSelector = '.if-ani-explicit-type > button'
- const containerSelector = '.if-ani-explicit-type > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe('<div>content</div>')
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual([
- 'test-anim-long-leave-from',
- 'test-anim-long-leave-active',
- ])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test-anim-long-leave-active test-anim-long-leave-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual([
- 'test-anim-long-enter-from',
- 'test-anim-long-enter-active',
- ])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test-anim-long-enter-active test-anim-long-enter-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '<div class="">content</div>')
- },
- E2E_TIMEOUT,
- )
- test(
- 'transition on SVG elements',
- async () => {
- const btnSelector = '.svg > button'
- const containerSelector = '.svg > #container'
- expect(await html(containerSelector)).toBe(
- '<circle cx="0" cy="0" r="10" class="test"></circle>',
- )
- // leave
- await click(btnSelector)
- await waitForInnerHTML(
- containerSelector,
- '<circle cx="0" cy="0" r="10" class="test test-leave-from test-leave-active"></circle>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<circle cx="0" cy="0" r="10" class="test test-leave-active test-leave-to"></circle>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- await click(btnSelector)
- await waitForInnerHTML(
- containerSelector,
- '<circle cx="0" cy="0" r="10" class="test test-enter-from test-enter-active"></circle>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<circle cx="0" cy="0" r="10" class="test test-enter-active test-enter-to"></circle>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<circle cx="0" cy="0" r="10" class="test"></circle>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'custom transition higher-order component',
- async () => {
- const btnSelector = '.if-high-order > button'
- const containerSelector = '.if-high-order > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'transition on child components with empty root node',
- async () => {
- const btnSelector = '.if-empty-root > button.toggle'
- const btnChangeSelector = '.if-empty-root > button.change'
- const containerSelector = '.if-empty-root > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe('')
- // change view -> 'two'
- await click(btnChangeSelector)
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">two</div>',
- )
- await waitForInnerHTML(containerSelector, '<div class="test">two</div>')
- // change view -> 'one'
- await click(btnChangeSelector)
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">two</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- },
- E2E_TIMEOUT,
- )
- test(
- 'transition with v-if at component root-level',
- async () => {
- const btnSelector = '.if-at-component-root-level > button.toggle'
- const btnChangeSelector = '.if-at-component-root-level > button.change'
- const containerSelector = '.if-at-component-root-level > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe('')
- // change view -> 'two'
- await click(btnChangeSelector)
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">two</div>',
- )
- await waitForInnerHTML(containerSelector, '<div class="test">two</div>')
- // change view -> 'one'
- await click(btnChangeSelector)
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">two</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- },
- E2E_TIMEOUT,
- )
- test(
- 'wrapping transition + fallthrough attrs',
- async () => {
- const btnSelector = '.if-fallthrough-attr > button'
- const containerSelector = '.if-fallthrough-attr > div'
- expect(await html(containerSelector)).toBe('<div foo="1">content</div>')
- await click(btnSelector)
- // toggle again before leave finishes
- await nextTick()
- await click(btnSelector)
- await waitForInnerHTML(
- containerSelector,
- '<div foo="1" class="">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'transition + fallthrough attrs (in-out mode)',
- async () => {
- const btnSelector = '.if-fallthrough-attr-in-out > button'
- const containerSelector = '.if-fallthrough-attr-in-out > div'
- expect(await html(containerSelector)).toBe('<div foo="1">one</div>')
- // toggle
- await click(btnSelector)
- await nextTick()
- await waitForInnerHTML(
- containerSelector,
- '<div foo="1" class="">two</div>',
- )
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('ifInOut')
- })
- expect(calls).toStrictEqual([
- 'beforeEnter',
- 'onEnter',
- 'afterEnter',
- 'beforeLeave',
- 'onLeave',
- 'afterLeave',
- ])
- expect(await html(containerSelector)).toBe(
- '<div foo="1" class="">two</div>',
- )
- // clear calls
- await page().evaluate(() => {
- ;(window as any).resetCalls('ifInOut')
- })
- // toggle back
- await click(btnSelector)
- await nextTick()
- await waitForInnerHTML(
- containerSelector,
- '<div foo="1" class="">one</div>',
- )
- calls = await page().evaluate(() => {
- return (window as any).getCalls('ifInOut')
- })
- expect(calls).toStrictEqual([
- 'beforeEnter',
- 'onEnter',
- 'afterEnter',
- 'beforeLeave',
- 'onLeave',
- 'afterLeave',
- ])
- expect(await html(containerSelector)).toBe(
- '<div foo="1" class="">one</div>',
- )
- },
- E2E_TIMEOUT,
- )
- })
- describe('transition with KeepAlive', () => {
- test('unmount innerChild (out-in mode)', async () => {
- const btnSelector = '.keep-alive > button'
- const containerSelector = '.keep-alive > div'
- await waitForInnerHTML(containerSelector, '<div>0</div>')
- await click(btnSelector)
- await waitForInnerHTML(containerSelector, '')
- const calls = await page().evaluate(() => {
- return (window as any).getCalls('unmount')
- })
- expect(calls).toStrictEqual(['TrueBranch'])
- })
- // #11775
- test(
- 'switch child then update include (out-in mode)',
- async () => {
- const containerSelector = '.keep-alive-update-include > div'
- const btnSwitchToB = '.keep-alive-update-include > #switchToB'
- const btnSwitchToA = '.keep-alive-update-include > #switchToA'
- const btnSwitchToC = '.keep-alive-update-include > #switchToC'
- expect(await html(containerSelector)).toBe('<div>CompA</div>')
- await click(btnSwitchToB)
- await nextTick()
- await click(btnSwitchToC)
- await waitForInnerHTML(containerSelector, '<div class="">CompC</div>')
- await click(btnSwitchToA)
- await waitForInnerHTML(containerSelector, '<div class="">CompA</div>')
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('unmount')
- })
- expect(calls).toStrictEqual(['CompC unmounted'])
- // Unlike vdom, CompA does not update because there are no state changes
- // expect CompA only update once
- // calls = await page().evaluate(() => {
- // return (window as any).getCalls('updated')
- // })
- // expect(calls).toStrictEqual(['CompA updated'])
- },
- E2E_TIMEOUT,
- )
- // #10827
- test(
- 'switch and update child then update include (out-in mode)',
- async () => {
- const containerSelector = '.keep-alive-switch-then-update-include > div'
- const btnSwitchToA =
- '.keep-alive-switch-then-update-include > #switchToA'
- const btnSwitchToB =
- '.keep-alive-switch-then-update-include > #switchToB'
- expect(await html(containerSelector)).toBe('<div>CompA2</div>')
- await click(btnSwitchToB)
- await waitForInnerHTML(containerSelector, '<div class="">CompB2</div>')
- await click(btnSwitchToA)
- await waitForInnerHTML(containerSelector, '<div class="">CompA2</div>')
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('unmount')
- })
- expect(calls).toStrictEqual(['CompB2 unmounted'])
- },
- E2E_TIMEOUT,
- )
- // #12860
- // TODO: getCurrentInstance is no longer works inside Vapor components;
- // need use an alternative method for testing here.
- // Verified locally in the playground — no memory leak was observed.
- test.todo(
- 'unmount children',
- async () => {
- // const unmountSpy = vi.fn()
- // let storageContainer: ElementHandle<HTMLDivElement>
- // const setStorageContainer = (container: any) =>
- // (storageContainer = container)
- // await page().exposeFunction('unmountSpy', unmountSpy)
- // await page().exposeFunction('setStorageContainer', setStorageContainer)
- // await page().evaluate(() => {
- // const { unmountSpy, setStorageContainer } = window as any
- // const { createApp, ref, h, onUnmounted, getCurrentInstance } = (
- // window as any
- // ).Vue
- // createApp({
- // template: `
- // <div id="container">
- // <transition>
- // <KeepAlive :include="includeRef">
- // <TrueBranch v-if="toggle"></TrueBranch>
- // </KeepAlive>
- // </transition>
- // </div>
- // <button id="toggleBtn" @click="click">button</button>
- // `,
- // components: {
- // TrueBranch: {
- // name: 'TrueBranch',
- // setup() {
- // const instance = getCurrentInstance()
- // onUnmounted(() => {
- // unmountSpy()
- // setStorageContainer(instance.__keepAliveStorageContainer)
- // })
- // const count = ref(0)
- // return () => h('div', count.value)
- // },
- // },
- // },
- // setup: () => {
- // const includeRef = ref(['TrueBranch'])
- // const toggle = ref(true)
- // const click = () => {
- // toggle.value = !toggle.value
- // if (toggle.value) {
- // includeRef.value = ['TrueBranch']
- // } else {
- // includeRef.value = []
- // }
- // }
- // return { toggle, click, unmountSpy, includeRef }
- // },
- // }).mount('#app')
- // })
- // await transitionFinish()
- // expect(await html('#container')).toBe('<div>0</div>')
- // await click('#toggleBtn')
- // await transitionFinish()
- // expect(await html('#container')).toBe('<!--v-if-->')
- // expect(unmountSpy).toBeCalledTimes(1)
- // expect(await storageContainer!.evaluate(x => x.innerHTML)).toBe(``)
- },
- E2E_TIMEOUT,
- )
- // #13153
- test(
- 'move kept-alive node before v-show transition leave finishes',
- async () => {
- const containerSelector = '.keep-alive-move-before-leave-finishes > div'
- const btnToggle = '.keep-alive-move-before-leave-finishes > button'
- const changeShowBtn = `${containerSelector} #changeShowBtn`
- expect(await html(containerSelector)).toBe(
- `<div><h2>I should show</h2></div>` +
- `<h2>This is page1</h2>` +
- `<button id="changeShowBtn">true</button>`,
- )
- // trigger v-show transition leave
- await click(changeShowBtn)
- await waitForInnerHTML(
- containerSelector,
- `<div class="test-leave-from test-leave-active"><h2>I shouldn't show </h2></div>` +
- `<h2>This is page1</h2>` +
- `<button id="changeShowBtn">false</button>`,
- )
- // switch to page2, before leave finishes
- // expect v-show element's display to be none
- await click(btnToggle)
- await nextTick()
- await waitForInnerHTML(
- containerSelector,
- `<div class="test-leave-from test-leave-active" style="display: none;"><h2>I shouldn't show </h2></div>` +
- `<h2>This is page2</h2>`,
- )
- // switch back to page1
- // expect v-show element's display to be none
- await click(btnToggle)
- await nextTick()
- await waitForInnerHTML(
- containerSelector,
- `<div class="test-enter-from test-enter-active" style="display: none;"><h2>I shouldn't show </h2></div>` +
- `<h2>This is page1</h2>` +
- `<button id="changeShowBtn">false</button>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="" style="display: none;"><h2>I shouldn't show </h2></div>` +
- `<h2>This is page1</h2>` +
- `<button id="changeShowBtn">false</button>`,
- )
- },
- E2E_TIMEOUT,
- )
- })
- describe.todo('transition with Suspense', () => {})
- describe('transition with Teleport', () => {
- test(
- 'apply transition to teleport child',
- async () => {
- const btnSelector = '.with-teleport > button'
- const containerSelector = '.with-teleport > .container'
- const targetSelector = `.with-teleport > .target`
- await waitForInnerHTML(containerSelector, '')
- await waitForInnerHTML(targetSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, `${targetSelector} div`))
- .classNames,
- ).toStrictEqual(['test', 'v-enter-from', 'v-enter-active'])
- await waitForInnerHTML(
- targetSelector,
- '<div class="test v-enter-active v-enter-to">vapor compB</div>',
- )
- await waitForInnerHTML(
- targetSelector,
- '<div class="test">vapor compB</div>',
- )
- expect(await html(containerSelector)).toBe('')
- // leave
- expect(
- (await transitionStart(btnSelector, `${targetSelector} div`))
- .classNames,
- ).toStrictEqual(['test', 'v-leave-from', 'v-leave-active'])
- await waitForInnerHTML(
- targetSelector,
- '<div class="test v-leave-active v-leave-to">vapor compB</div>',
- )
- await waitForInnerHTML(targetSelector, '')
- expect(await html(containerSelector)).toBe('')
- },
- E2E_TIMEOUT,
- )
- })
- describe('transition with AsyncComponent', () => {
- test('apply transition to inner component', async () => {
- const btnSelector = '.async > button'
- const containerSelector = '.async > div'
- expect(await html(containerSelector)).toBe('')
- // toggle
- await click(btnSelector)
- await nextTick()
- // not yet resolved
- expect(await html(containerSelector)).toBe('')
- // wait resolving
- await timeout(50)
- // enter (resolved)
- expect(await html(containerSelector)).toBe(
- '<div class="v-enter-from v-enter-active">vapor compA</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="v-enter-active v-enter-to">vapor compA</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="">vapor compA</div>',
- )
- // leave
- await click(btnSelector)
- await nextTick()
- expect(await html(containerSelector)).toBe(
- '<div class="v-leave-from v-leave-active">vapor compA</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="v-leave-active v-leave-to">vapor compA</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter again
- await click(btnSelector)
- // use the already resolved component
- expect(await html(containerSelector)).toBe(
- '<div class="v-enter-from v-enter-active">vapor compA</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="v-enter-active v-enter-to">vapor compA</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="">vapor compA</div>',
- )
- })
- test('apply transition to pre-resolved async component', async () => {
- const btnSelector = '.async-resolved > button'
- const containerSelector = '.async-resolved #container'
- const hiddenCompSelector = '.async-resolved #hidden-async'
- // Wait for the hidden AsyncCompResolved to resolve and render
- await waitForInnerHTML(
- hiddenCompSelector,
- '<div style="display: none;">vapor compA</div>',
- )
- expect(await html(containerSelector)).toBe('')
- await click(btnSelector)
- expect(await html(containerSelector)).toBe(
- '<div class="v-enter-from v-enter-active">vapor compA</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="v-enter-active v-enter-to">vapor compA</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="">vapor compA</div>',
- )
- // leave
- await click(btnSelector)
- await nextTick()
- expect(await html(containerSelector)).toBe(
- '<div class="v-leave-from v-leave-active">vapor compA</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="v-leave-active v-leave-to">vapor compA</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter again
- await click(btnSelector)
- expect(await html(containerSelector)).toBe(
- '<div class="v-enter-from v-enter-active">vapor compA</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="v-enter-active v-enter-to">vapor compA</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="">vapor compA</div>',
- )
- })
- })
- describe('transition with v-show', () => {
- test(
- 'named transition with v-show',
- async () => {
- const btnSelector = '.show-named > button'
- const containerSelector = '.show-named > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- expect(await isVisible(childSelector)).toBe(true)
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test" style="display: none;">content</div>',
- )
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to" style="">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test" style="">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'transition events with v-show',
- async () => {
- const btnSelector = '.show-events > button'
- const containerSelector = '.show-events > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('show')
- })
- expect(calls).toStrictEqual(['beforeLeave', 'onLeave'])
- calls = await page().evaluate(() => {
- return (window as any).getCalls('show')
- })
- expect(calls).not.contain('afterLeave')
- await waitForInnerHTML(
- containerSelector,
- '<div class="test" style="display: none;">content</div>',
- )
- calls = await page().evaluate(() => {
- return (window as any).getCalls('show')
- })
- expect(calls).toStrictEqual(['beforeLeave', 'onLeave', 'afterLeave'])
- // clear calls
- await page().evaluate(() => {
- ;(window as any).resetCalls('show')
- })
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to" style="">content</div>',
- )
- calls = await page().evaluate(() => {
- return (window as any).getCalls('show')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test" style="">content</div>',
- )
- calls = await page().evaluate(() => {
- return (window as any).getCalls('show')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter', 'afterEnter'])
- },
- E2E_TIMEOUT,
- )
- test(
- 'onLeaveCancelled (v-show only)',
- async () => {
- const btnSelector = '.show-leave-cancelled > button'
- const containerSelector = '.show-leave-cancelled > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- // cancel (enter)
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('showLeaveCancel')
- })
- expect(calls).toStrictEqual(['leaveCancelled'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to" style="">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test" style="">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'transition on appear with v-show',
- async () => {
- const btnSelector = '.show-appear > button'
- const containerSelector = '.show-appear > div'
- const childSelector = `${containerSelector} > div`
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('showAppear')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter'])
- // appear
- expect(await classList(childSelector)).contains('test-appear-active')
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- calls = await page().evaluate(() => {
- return (window as any).getCalls('showAppear')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter', 'afterEnter'])
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test" style="display: none;">content</div>',
- )
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to" style="">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test" style="">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'transition events should not call onEnter with v-show false',
- async () => {
- const btnSelector = '.show-appear-not-enter > button'
- const containerSelector = '.show-appear-not-enter > div'
- const childSelector = `${containerSelector} > div`
- expect(await isVisible(childSelector)).toBe(false)
- let calls = await page().evaluate(() => {
- return (window as any).getCalls('notEnter')
- })
- expect(calls).toStrictEqual([])
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- calls = await page().evaluate(() => {
- return (window as any).getCalls('notEnter')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to" style="">content</div>',
- )
- calls = await page().evaluate(() => {
- return (window as any).getCalls('notEnter')
- })
- expect(calls).not.contain('afterEnter')
- await waitForInnerHTML(
- containerSelector,
- '<div class="test" style="">content</div>',
- )
- calls = await page().evaluate(() => {
- return (window as any).getCalls('notEnter')
- })
- expect(calls).toStrictEqual(['beforeEnter', 'onEnter', 'afterEnter'])
- },
- E2E_TIMEOUT,
- )
- })
- describe('explicit durations', () => {
- test(
- 'single value',
- async () => {
- const btnSelector = '.duration-single-value > button'
- const containerSelector = '.duration-single-value > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'enter with explicit durations',
- async () => {
- const btnSelector = '.duration-enter > button'
- const containerSelector = '.duration-enter > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'leave with explicit durations',
- async () => {
- const btnSelector = '.duration-leave > button'
- const containerSelector = '.duration-leave > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'separate enter and leave',
- async () => {
- const btnSelector = '.duration-enter-leave > button'
- const containerSelector = '.duration-enter-leave > div'
- const childSelector = `${containerSelector} > div`
- expect(await html(containerSelector)).toBe(
- '<div class="test">content</div>',
- )
- // leave
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-leave-from', 'test-leave-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-leave-active test-leave-to">content</div>',
- )
- await waitForInnerHTML(containerSelector, '')
- // enter
- expect(
- (await transitionStart(btnSelector, childSelector)).classNames,
- ).toStrictEqual(['test', 'test-enter-from', 'test-enter-active'])
- await waitForInnerHTML(
- containerSelector,
- '<div class="test test-enter-active test-enter-to">content</div>',
- )
- await waitForInnerHTML(
- containerSelector,
- '<div class="test">content</div>',
- )
- },
- E2E_TIMEOUT,
- )
- })
- test(
- 'should work with keyed element',
- async () => {
- const btnSelector = '.keyed > button'
- const containerSelector = '.keyed > h1'
- await waitForInnerHTML(containerSelector, '0')
- // change key
- expect(
- (await transitionStart(btnSelector, containerSelector)).classNames,
- ).toStrictEqual(['v-leave-from', 'v-leave-active'])
- await nextFrame()
- expect(await classList(containerSelector)).toStrictEqual([
- 'v-leave-active',
- 'v-leave-to',
- ])
- await waitForInnerHTML(containerSelector, '1')
- // change key again
- expect(
- (await transitionStart(btnSelector, containerSelector)).classNames,
- ).toStrictEqual(['v-leave-from', 'v-leave-active'])
- await nextFrame()
- expect(await classList(containerSelector)).toStrictEqual([
- 'v-leave-active',
- 'v-leave-to',
- ])
- await waitForInnerHTML(containerSelector, '2')
- },
- E2E_TIMEOUT,
- )
- test(
- 'should work with out-in mode',
- async () => {
- const btnSelector = '.out-in > button'
- const containerSelector = '.out-in > div'
- expect(await html(containerSelector)).toBe(`<div>vapor compB</div>`)
- // compB -> compA
- // compB leave
- expect(
- (await transitionStart(btnSelector, containerSelector)).innerHTML,
- ).toBe(`<div class="fade-leave-from fade-leave-active">vapor compB</div>`)
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-leave-active fade-leave-to">vapor compB</div>`,
- )
- // compA enter
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-enter-from fade-enter-active">vapor compA</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-enter-active fade-enter-to">vapor compA</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="">vapor compA</div>`,
- )
- // compA -> compB
- // compA leave
- expect(
- (await transitionStart(btnSelector, containerSelector)).innerHTML,
- ).toBe(`<div class="fade-leave-from fade-leave-active">vapor compA</div>`)
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-leave-active fade-leave-to">vapor compA</div>`,
- )
- // compB enter
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-enter-from fade-enter-active">vapor compB</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-enter-active fade-enter-to">vapor compB</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="">vapor compB</div>`,
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'should work with in-out mode',
- async () => {
- const btnSelector = '.in-out > button'
- const containerSelector = '.in-out > div'
- expect(await html(containerSelector)).toBe(`<div>vapor compB</div>`)
- // compA enter
- expect(
- (await transitionStart(btnSelector, containerSelector)).innerHTML,
- ).toBe(
- `<div>vapor compB</div><div class="fade-enter-from fade-enter-active">vapor compA</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div>vapor compB</div><div class="fade-enter-active fade-enter-to">vapor compA</div>`,
- )
- // compB leave
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-leave-from fade-leave-active">vapor compB</div><div class="">vapor compA</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-leave-active fade-leave-to">vapor compB</div><div class="">vapor compA</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="">vapor compA</div>`,
- )
- },
- E2E_TIMEOUT,
- )
- // tests for using vdom component in createVaporApp + vaporInteropPlugin
- describe('interop', () => {
- test(
- 'render vdom component',
- async () => {
- const btnSelector = '.vdom > button'
- const containerSelector = '.vdom > div'
- expect(await html(containerSelector)).toBe(`<div>vdom comp</div>`)
- // comp leave
- expect(
- (await transitionStart(btnSelector, containerSelector)).innerHTML,
- ).toBe(`<div class="v-leave-from v-leave-active">vdom comp</div>`)
- await waitForInnerHTML(
- containerSelector,
- `<div class="v-leave-active v-leave-to">vdom comp</div>`,
- )
- await waitForInnerHTML(containerSelector, ``)
- // comp enter
- expect(
- (await transitionStart(btnSelector, containerSelector)).innerHTML,
- ).toBe(`<div class="v-enter-from v-enter-active">vdom comp</div>`)
- await waitForInnerHTML(
- containerSelector,
- `<div class="v-enter-active v-enter-to">vdom comp</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="">vdom comp</div>`,
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'switch between vdom/vapor component (out-in mode)',
- async () => {
- const btnSelector = '.vdom-vapor-out-in > button'
- const containerSelector = '.vdom-vapor-out-in > div'
- expect(await html(containerSelector)).toBe(`<div>vdom comp</div>`)
- // switch to vapor comp
- // vdom comp leave
- expect(
- (await transitionStart(btnSelector, containerSelector)).innerHTML,
- ).toBe(`<div class="fade-leave-from fade-leave-active">vdom comp</div>`)
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-leave-active fade-leave-to">vdom comp</div>`,
- )
- // vapor comp enter
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-enter-from fade-enter-active">vapor compA</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-enter-active fade-enter-to">vapor compA</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="">vapor compA</div>`,
- )
- // switch to vdom comp
- // vapor comp leave
- expect(
- (await transitionStart(btnSelector, containerSelector)).innerHTML,
- ).toBe(
- `<div class="fade-leave-from fade-leave-active">vapor compA</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-leave-active fade-leave-to">vapor compA</div>`,
- )
- // vdom comp enter
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-enter-from fade-enter-active">vdom comp</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-enter-active fade-enter-to">vdom comp</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="">vdom comp</div>`,
- )
- },
- E2E_TIMEOUT,
- )
- test(
- 'switch between vdom/vapor component (in-out mode)',
- async () => {
- const btnSelector = '.vdom-vapor-in-out > button'
- const containerSelector = '.vdom-vapor-in-out > div'
- expect(await html(containerSelector)).toBe(`<div>vapor compA</div>`)
- // switch to vdom comp
- // vdom comp enter
- expect(
- (await transitionStart(btnSelector, containerSelector)).innerHTML,
- ).toBe(
- `<div>vapor compA</div><div class="fade-enter-from fade-enter-active">vdom comp</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div>vapor compA</div><div class="fade-enter-active fade-enter-to">vdom comp</div>`,
- )
- // vapor comp leave
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-leave-from fade-leave-active">vapor compA</div><div class="">vdom comp</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-leave-active fade-leave-to">vapor compA</div><div class="">vdom comp</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="">vdom comp</div>`,
- )
- // switch to vapor comp
- // vapor comp enter
- expect(
- (await transitionStart(btnSelector, containerSelector)).innerHTML,
- ).toBe(
- `<div class="">vdom comp</div><div class="fade-enter-from fade-enter-active">vapor compA</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="">vdom comp</div><div class="fade-enter-active fade-enter-to">vapor compA</div>`,
- )
- // vdom comp leave
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-leave-from fade-leave-active">vdom comp</div><div class="">vapor compA</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="fade-leave-active fade-leave-to">vdom comp</div><div class="">vapor compA</div>`,
- )
- await waitForInnerHTML(
- containerSelector,
- `<div class="">vapor compA</div>`,
- )
- },
- E2E_TIMEOUT,
- )
- })
- })
|