| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842 |
- 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,
- } = 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 click(btnChangeNameSelector)
- await nextTick()
- 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.todo('transition on SVG elements', async () => {}, 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
- 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()
- // different from vdom behavior, the leaving element is removed immediately
- // vdom's behavior is hidden but still in DOM until leave transition finishes
- await waitForInnerHTML(containerSelector, `<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="" 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>',
- )
- })
- })
- 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,
- )
- })
- })
|