Skip to content

Commit b791c57

Browse files
committed
tests for ssr bundle renderer
1 parent 43fabd5 commit b791c57

File tree

6 files changed

+114
-15
lines changed

6 files changed

+114
-15
lines changed

src/server/create-bundle-renderer.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ export function createBundleRendererCreator (createRenderer) {
66
const renderer = createRenderer(rendererOptions)
77
return {
88
renderToString: (context, cb) => {
9+
if (typeof context === 'function') {
10+
cb = context
11+
context = {}
12+
}
913
runInVm(code, context).then(app => {
1014
renderer.renderToString(app, cb)
1115
}).catch(cb)

src/server/run-in-vm.js

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,25 @@ function createContext (context) {
1212
setTimeout,
1313
console,
1414
process,
15-
__VUE_SSR_CONTEXT__: context || {}
15+
__VUE_SSR_CONTEXT__: context
1616
}
1717
sandbox.global = sandbox
1818
return sandbox
1919
}
2020

21-
export default function runInVm (code, _context) {
22-
const wrapper = NativeModule.wrap(code)
23-
const context = createContext(_context)
24-
const compiledWrapper = vm.runInNewContext(wrapper, context, {
25-
filename: '__vue_ssr_bundle__',
26-
displayErrors: true
21+
export default function runInVm (code, _context = {}) {
22+
return new Promise((resolve, reject) => {
23+
const wrapper = NativeModule.wrap(code)
24+
const context = createContext(_context)
25+
const compiledWrapper = vm.runInNewContext(wrapper, context, {
26+
filename: '__vue_ssr_bundle__',
27+
displayErrors: true
28+
})
29+
const m = { exports: {}}
30+
compiledWrapper.call(m.exports, m.exports, require, m)
31+
const res = Object.prototype.hasOwnProperty.call(m.exports, 'default')
32+
? m.exports.default
33+
: m
34+
resolve(typeof res === 'function' ? res(_context) : res)
2735
})
28-
const m = { exports: {}}
29-
compiledWrapper.call(m.exports, m.exports, require, m)
30-
const res = Object.prototype.hasOwnProperty.call(m.exports, 'default')
31-
? m.exports.default
32-
: m
33-
// ensure returning a Promise
34-
return Promise.resolve(res)
3536
}

test/ssr/fixtures/app.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import Vue from '../../../dist/vue.common.js'
2+
3+
export default context => {
4+
return new Promise(resolve => {
5+
context.msg = 'hello'
6+
resolve(new Vue({
7+
render (h) {
8+
return h('div', context.url)
9+
}
10+
}))
11+
})
12+
}

test/ssr/fixtures/error.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
throw new Error('foo')

test/ssr/jasmine.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
"spec_files": [
44
"ssr-env.spec.js",
55
"ssr-string.spec.js",
6-
"ssr-stream.spec.js"
6+
"ssr-stream.spec.js",
7+
"ssr-bundle-render.spec.js"
78
],
89
"helpers": [
910
"../../node_modules/babel-register/lib/node.js"

test/ssr/ssr-bundle-render.spec.js

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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+
6+
const rendererCache = {}
7+
function createRenderer (file, cb) {
8+
if (rendererCache[file]) {
9+
return cb(rendererCache[file])
10+
}
11+
const compiler = webpack({
12+
target: 'node',
13+
entry: path.resolve(__dirname, 'fixtures', file),
14+
output: {
15+
path: '/',
16+
filename: 'bundle.js',
17+
libraryTarget: 'commonjs2'
18+
},
19+
module: {
20+
loaders: [{ test: /\.js$/, loader: 'babel' }]
21+
}
22+
})
23+
const fs = new MemoeryFS()
24+
compiler.outputFileSystem = fs
25+
compiler.run((err, stats) => {
26+
expect(err).toBeFalsy()
27+
expect(stats.errors).toBeFalsy()
28+
const code = fs.readFileSync('/bundle.js', 'utf-8')
29+
const renderer = rendererCache[file] = createBundleRenderer(code)
30+
cb(renderer)
31+
})
32+
}
33+
34+
describe('SSR: bundle renderer', () => {
35+
it('renderToString', done => {
36+
createRenderer('app.js', renderer => {
37+
const context = { url: '/test' }
38+
renderer.renderToString(context, (err, res) => {
39+
expect(res).toBe('<div server-rendered="true">&sol;test</div>')
40+
expect(context.msg).toBe('hello')
41+
done()
42+
})
43+
})
44+
})
45+
46+
it('renderToStream', done => {
47+
createRenderer('app.js', renderer => {
48+
const context = { url: '/test' }
49+
const stream = renderer.renderToStream(context)
50+
let res = ''
51+
stream.on('data', chunk => {
52+
res += chunk.toString()
53+
})
54+
stream.on('end', () => {
55+
expect(res).toBe('<div server-rendered="true">&sol;test</div>')
56+
expect(context.msg).toBe('hello')
57+
done()
58+
})
59+
})
60+
})
61+
62+
it('renderToString catch error', done => {
63+
createRenderer('error.js', renderer => {
64+
renderer.renderToString(err => {
65+
expect(err.message).toBe('foo')
66+
done()
67+
})
68+
})
69+
})
70+
71+
it('renderToStream catch error', done => {
72+
createRenderer('error.js', renderer => {
73+
const stream = renderer.renderToStream()
74+
stream.on('error', err => {
75+
expect(err.message).toBe('foo')
76+
done()
77+
})
78+
})
79+
})
80+
})

0 commit comments

Comments
 (0)