webStream.spec.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /**
  2. * @jest-environment node
  3. */
  4. import { createApp, h, defineAsyncComponent } from 'vue'
  5. import { ReadableStream, TransformStream } from 'stream/web'
  6. import { pipeToWebWritable, renderToWebStream } from '../src'
  7. beforeEach(() => {
  8. global.ReadableStream = ReadableStream
  9. })
  10. afterEach(() => {
  11. // @ts-ignore
  12. delete global.ReadableStream
  13. })
  14. test('renderToWebStream', async () => {
  15. const Async = defineAsyncComponent(() =>
  16. Promise.resolve({
  17. render: () => h('div', 'async')
  18. })
  19. )
  20. const App = {
  21. render: () => [h('div', 'parent'), h(Async)]
  22. }
  23. const stream = renderToWebStream(createApp(App))
  24. const reader = stream.getReader()
  25. const decoder = new TextDecoder()
  26. let res = ''
  27. await reader.read().then(function read({ done, value }): any {
  28. if (!done) {
  29. res += decoder.decode(value)
  30. return reader.read().then(read)
  31. }
  32. })
  33. expect(res).toBe(`<!--[--><div>parent</div><div>async</div><!--]-->`)
  34. })
  35. test('pipeToWebWritable', async () => {
  36. const Async = defineAsyncComponent(() =>
  37. Promise.resolve({
  38. render: () => h('div', 'async')
  39. })
  40. )
  41. const App = {
  42. render: () => [h('div', 'parent'), h(Async)]
  43. }
  44. const { readable, writable } = new TransformStream()
  45. pipeToWebWritable(createApp(App), {}, writable)
  46. const reader = readable.getReader()
  47. const decoder = new TextDecoder()
  48. let res = ''
  49. await reader.read().then(function read({ done, value }): any {
  50. if (!done) {
  51. res += decoder.decode(value)
  52. return reader.read().then(read)
  53. }
  54. })
  55. expect(res).toBe(`<!--[--><div>parent</div><div>async</div><!--]-->`)
  56. })