vdomInterop.spec.ts 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. import path from 'node:path'
  2. import {
  3. E2E_TIMEOUT,
  4. setupPuppeteer,
  5. } from '../../../packages/vue/__tests__/e2e/e2eUtils'
  6. import connect from 'connect'
  7. import sirv from 'sirv'
  8. const {
  9. page,
  10. click,
  11. text,
  12. enterValue,
  13. html,
  14. transitionStart,
  15. waitForElement,
  16. nextFrame,
  17. timeout,
  18. } = setupPuppeteer()
  19. let server: any
  20. const port = '8193'
  21. beforeAll(() => {
  22. server = connect()
  23. .use(sirv(path.resolve(import.meta.dirname, '../dist')))
  24. .listen(port)
  25. process.on('SIGTERM', () => server && server.close())
  26. })
  27. afterAll(() => {
  28. server.close()
  29. })
  30. beforeEach(async () => {
  31. const baseUrl = `http://localhost:${port}/interop/`
  32. await page().goto(baseUrl)
  33. await page().waitForSelector('#app')
  34. })
  35. const duration = process.env.CI ? 200 : 50
  36. const buffer = process.env.CI ? 50 : 20
  37. const transitionFinish = (time = duration) => timeout(time + buffer)
  38. describe('vdom / vapor interop', () => {
  39. test(
  40. 'should work',
  41. async () => {
  42. expect(await text('.vapor > h2')).toContain('Vapor component in VDOM')
  43. expect(await text('.vapor-prop')).toContain('hello')
  44. const t = await text('.vdom-slot-in-vapor-default')
  45. expect(t).toContain('slot prop: slot prop')
  46. expect(t).toContain('component prop: hello')
  47. await click('.change-vdom-slot-in-vapor-prop')
  48. expect(await text('.vdom-slot-in-vapor-default')).toContain(
  49. 'slot prop: changed',
  50. )
  51. expect(await text('.vdom-slot-in-vapor-test')).toContain('A test slot')
  52. await click('.toggle-vdom-slot-in-vapor')
  53. expect(await text('.vdom-slot-in-vapor-test')).toContain(
  54. 'fallback content',
  55. )
  56. await click('.toggle-vdom-slot-in-vapor')
  57. expect(await text('.vdom-slot-in-vapor-test')).toContain('A test slot')
  58. expect(await text('.vdom > h2')).toContain('VDOM component in Vapor')
  59. expect(await text('.vdom-prop')).toContain('hello')
  60. const tt = await text('.vapor-slot-in-vdom-default')
  61. expect(tt).toContain('slot prop: slot prop')
  62. expect(tt).toContain('component prop: hello')
  63. await click('.change-vapor-slot-in-vdom-prop')
  64. expect(await text('.vapor-slot-in-vdom-default')).toContain(
  65. 'slot prop: changed',
  66. )
  67. expect(await text('.vapor-slot-in-vdom-test')).toContain('fallback')
  68. await click('.toggle-vapor-slot-in-vdom-default')
  69. expect(await text('.vapor-slot-in-vdom-default')).toContain(
  70. 'default slot fallback',
  71. )
  72. await click('.toggle-vapor-slot-in-vdom-default')
  73. await enterValue('input', 'bye')
  74. expect(await text('.vapor-prop')).toContain('bye')
  75. expect(await text('.vdom-slot-in-vapor-default')).toContain('bye')
  76. expect(await text('.vdom-prop')).toContain('bye')
  77. expect(await text('.vapor-slot-in-vdom-default')).toContain('bye')
  78. },
  79. E2E_TIMEOUT,
  80. )
  81. describe('vdom transition', () => {
  82. test(
  83. 'render vapor component',
  84. async () => {
  85. const btnSelector = '.trans-vapor > button'
  86. const containerSelector = '.trans-vapor > div'
  87. expect(await html(containerSelector)).toBe(`<div>vapor compA</div>`)
  88. // comp leave
  89. expect(
  90. (await transitionStart(btnSelector, containerSelector)).innerHTML,
  91. ).toBe(
  92. `<div class="v-leave-from v-leave-active">vapor compA</div><!---->`,
  93. )
  94. await nextFrame()
  95. expect(await html(containerSelector)).toBe(
  96. `<div class="v-leave-active v-leave-to">vapor compA</div><!---->`,
  97. )
  98. await transitionFinish()
  99. expect(await html(containerSelector)).toBe(`<!---->`)
  100. // comp enter
  101. expect(
  102. (await transitionStart(btnSelector, containerSelector)).innerHTML,
  103. ).toBe(`<div class="v-enter-from v-enter-active">vapor compA</div>`)
  104. await nextFrame()
  105. expect(await html(containerSelector)).toBe(
  106. `<div class="v-enter-active v-enter-to">vapor compA</div>`,
  107. )
  108. await transitionFinish()
  109. expect(await html(containerSelector)).toBe(
  110. `<div class="">vapor compA</div>`,
  111. )
  112. },
  113. E2E_TIMEOUT,
  114. )
  115. test(
  116. 'switch between vdom/vapor component (out-in mode)',
  117. async () => {
  118. const btnSelector = '.trans-vdom-vapor-out-in > button'
  119. const containerSelector = '.trans-vdom-vapor-out-in > div'
  120. const childSelector = `${containerSelector} > div`
  121. expect(await html(containerSelector)).toBe(`<div>vdom comp</div>`)
  122. // switch to vapor comp
  123. // vdom comp leave
  124. expect(
  125. (await transitionStart(btnSelector, containerSelector)).innerHTML,
  126. ).toBe(
  127. `<div class="fade-leave-from fade-leave-active">vdom comp</div><!---->`,
  128. )
  129. await nextFrame()
  130. expect(await html(containerSelector)).toBe(
  131. `<div class="fade-leave-active fade-leave-to">vdom comp</div><!---->`,
  132. )
  133. // vapor comp enter
  134. await waitForElement(childSelector, 'vapor compA', [
  135. 'fade-enter-from',
  136. 'fade-enter-active',
  137. ])
  138. await nextFrame()
  139. expect(await html(containerSelector)).toBe(
  140. `<div class="fade-enter-active fade-enter-to">vapor compA</div>`,
  141. )
  142. await transitionFinish()
  143. expect(await html(containerSelector)).toBe(
  144. `<div class="">vapor compA</div>`,
  145. )
  146. // switch to vdom comp
  147. // vapor comp leave
  148. expect(
  149. (await transitionStart(btnSelector, containerSelector)).innerHTML,
  150. ).toBe(
  151. `<div class="fade-leave-from fade-leave-active">vapor compA</div><!---->`,
  152. )
  153. await nextFrame()
  154. expect(await html(containerSelector)).toBe(
  155. `<div class="fade-leave-active fade-leave-to">vapor compA</div><!---->`,
  156. )
  157. // vdom comp enter
  158. await waitForElement(childSelector, 'vdom comp', [
  159. 'fade-enter-from',
  160. 'fade-enter-active',
  161. ])
  162. await nextFrame()
  163. expect(await html(containerSelector)).toBe(
  164. `<div class="fade-enter-active fade-enter-to">vdom comp</div>`,
  165. )
  166. await transitionFinish()
  167. expect(await html(containerSelector)).toBe(
  168. `<div class="">vdom comp</div>`,
  169. )
  170. },
  171. E2E_TIMEOUT,
  172. )
  173. })
  174. describe('vdom transition-group', () => {
  175. test(
  176. 'render vapor component',
  177. async () => {
  178. const btnSelector = '.trans-group-vapor > button'
  179. const containerSelector = '.trans-group-vapor > div'
  180. expect(await html(containerSelector)).toBe(
  181. `<div><div>a</div></div>` +
  182. `<div><div>b</div></div>` +
  183. `<div><div>c</div></div>`,
  184. )
  185. // insert
  186. expect(
  187. (await transitionStart(btnSelector, containerSelector)).innerHTML,
  188. ).toBe(
  189. `<div><div>a</div></div>` +
  190. `<div><div>b</div></div>` +
  191. `<div><div>c</div></div>` +
  192. `<div class="test-enter-from test-enter-active"><div>d</div></div>` +
  193. `<div class="test-enter-from test-enter-active"><div>e</div></div>`,
  194. )
  195. await nextFrame()
  196. expect(await html(containerSelector)).toBe(
  197. `<div><div>a</div></div>` +
  198. `<div><div>b</div></div>` +
  199. `<div><div>c</div></div>` +
  200. `<div class="test-enter-active test-enter-to"><div>d</div></div>` +
  201. `<div class="test-enter-active test-enter-to"><div>e</div></div>`,
  202. )
  203. await transitionFinish()
  204. expect(await html(containerSelector)).toBe(
  205. `<div><div>a</div></div>` +
  206. `<div><div>b</div></div>` +
  207. `<div><div>c</div></div>` +
  208. `<div class=""><div>d</div></div>` +
  209. `<div class=""><div>e</div></div>`,
  210. )
  211. },
  212. E2E_TIMEOUT,
  213. )
  214. })
  215. })