ssr-bundle-render.spec.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import path from 'path'
  2. import webpack from 'webpack'
  3. import MemoeryFS from 'memory-fs'
  4. import { createBundleRenderer } from '../../packages/vue-server-renderer'
  5. const rendererCache = {}
  6. function createRenderer (file, cb, options) {
  7. if (!options && rendererCache[file]) {
  8. return cb(rendererCache[file])
  9. }
  10. const compiler = webpack({
  11. target: 'node',
  12. entry: path.resolve(__dirname, 'fixtures', file),
  13. output: {
  14. path: '/',
  15. filename: 'bundle.js',
  16. libraryTarget: 'commonjs2'
  17. },
  18. module: {
  19. loaders: [{ test: /\.js$/, loader: 'babel' }]
  20. }
  21. })
  22. const fs = new MemoeryFS()
  23. compiler.outputFileSystem = fs
  24. compiler.run((err, stats) => {
  25. expect(err).toBeFalsy()
  26. expect(stats.errors).toBeFalsy()
  27. const code = fs.readFileSync('/bundle.js', 'utf-8')
  28. const renderer = rendererCache[file] = createBundleRenderer(code, options)
  29. cb(renderer)
  30. })
  31. }
  32. describe('SSR: bundle renderer', () => {
  33. it('renderToString', done => {
  34. createRenderer('app.js', renderer => {
  35. const context = { url: '/test' }
  36. renderer.renderToString(context, (err, res) => {
  37. expect(err).toBeNull()
  38. expect(res).toBe('<div server-rendered="true">/test</div>')
  39. expect(context.msg).toBe('hello')
  40. done()
  41. })
  42. })
  43. })
  44. it('renderToStream', done => {
  45. createRenderer('app.js', renderer => {
  46. const context = { url: '/test' }
  47. const stream = renderer.renderToStream(context)
  48. let res = ''
  49. stream.on('data', chunk => {
  50. res += chunk.toString()
  51. })
  52. stream.on('end', () => {
  53. expect(res).toBe('<div server-rendered="true">/test</div>')
  54. expect(context.msg).toBe('hello')
  55. done()
  56. })
  57. })
  58. })
  59. it('renderToString catch error', done => {
  60. createRenderer('error.js', renderer => {
  61. renderer.renderToString(err => {
  62. expect(err.message).toBe('foo')
  63. done()
  64. })
  65. })
  66. })
  67. it('renderToStream catch error', done => {
  68. createRenderer('error.js', renderer => {
  69. const stream = renderer.renderToStream()
  70. stream.on('error', err => {
  71. expect(err.message).toBe('foo')
  72. done()
  73. })
  74. })
  75. })
  76. it('render with cache (get/set)', done => {
  77. const cache = {}
  78. const get = jasmine.createSpy('get')
  79. const set = jasmine.createSpy('set')
  80. const options = {
  81. cache: {
  82. // async
  83. get: (key, cb) => {
  84. setTimeout(() => {
  85. get(key)
  86. cb(cache[key])
  87. }, 0)
  88. },
  89. set: (key, val) => {
  90. set(key, val)
  91. cache[key] = val
  92. }
  93. }
  94. }
  95. createRenderer('cache.js', renderer => {
  96. const expected = '<div server-rendered="true">/test</div>'
  97. const key = 'app::1'
  98. renderer.renderToString((err, res) => {
  99. expect(err).toBeNull()
  100. expect(res).toBe(expected)
  101. expect(get).toHaveBeenCalledWith(key)
  102. expect(set).toHaveBeenCalledWith(key, expected)
  103. expect(cache[key]).toBe(expected)
  104. renderer.renderToString((err, res) => {
  105. expect(err).toBeNull()
  106. expect(res).toBe(expected)
  107. expect(get.calls.count()).toBe(2)
  108. expect(set.calls.count()).toBe(1)
  109. done()
  110. })
  111. })
  112. }, options)
  113. })
  114. it('render with cache (get/set/has)', done => {
  115. const cache = {}
  116. const has = jasmine.createSpy('has')
  117. const get = jasmine.createSpy('get')
  118. const set = jasmine.createSpy('set')
  119. const options = {
  120. cache: {
  121. // async
  122. has: (key, cb) => {
  123. has(key)
  124. cb(!!cache[key])
  125. },
  126. // sync
  127. get: key => {
  128. get(key)
  129. return cache[key]
  130. },
  131. set: (key, val) => {
  132. set(key, val)
  133. cache[key] = val
  134. }
  135. }
  136. }
  137. createRenderer('cache.js', renderer => {
  138. const expected = '<div server-rendered="true">/test</div>'
  139. const key = 'app::1'
  140. renderer.renderToString((err, res) => {
  141. expect(err).toBeNull()
  142. expect(res).toBe(expected)
  143. expect(has).toHaveBeenCalledWith(key)
  144. expect(get).not.toHaveBeenCalled()
  145. expect(set).toHaveBeenCalledWith(key, expected)
  146. expect(cache[key]).toBe(expected)
  147. renderer.renderToString((err, res) => {
  148. expect(err).toBeNull()
  149. expect(res).toBe(expected)
  150. expect(has.calls.count()).toBe(2)
  151. expect(get.calls.count()).toBe(1)
  152. expect(set.calls.count()).toBe(1)
  153. done()
  154. })
  155. })
  156. }, options)
  157. })
  158. })