Skip to content

Commit f69231f

Browse files
committed
test(serve): test proxy option
1 parent aa07942 commit f69231f

File tree

5 files changed

+403
-36
lines changed

5 files changed

+403
-36
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
"globby": "^8.0.1",
5050
"http-server": "^0.11.1",
5151
"jest": "^22.1.4",
52+
"json-server": "^0.12.2",
5253
"lerna": "^2.8.0",
5354
"lint-staged": "^6.0.1",
5455
"memfs": "^2.6.0",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
jest.setTimeout(30000)
2+
3+
const request = require('request-promise-native')
4+
const { defaultPreset } = require('@vue/cli/lib/options')
5+
const create = require('@vue/cli-test-utils/createTestProject')
6+
const serve = require('@vue/cli-test-utils/serveWithPuppeteer')
7+
const createJSONServer = require('@vue/cli-test-utils/createJSONServer')
8+
9+
let mockServer1
10+
let mockServer2
11+
12+
beforeAll(done => {
13+
mockServer1 = createJSONServer({
14+
'posts': [
15+
{ 'id': 1, 'title': 'server-one', 'author': 'typicode' }
16+
]
17+
}).listen(3000, () => {
18+
mockServer2 = createJSONServer({
19+
'posts': [
20+
{ 'id': 1, 'title': 'server-two', 'author': 'typicode' }
21+
]
22+
}).listen(3001, done)
23+
})
24+
})
25+
26+
afterAll(() => {
27+
mockServer1.close()
28+
mockServer2.close()
29+
})
30+
31+
let newId = 1
32+
async function assertProxy (url, title) {
33+
const res = await request({
34+
url: `${url}posts/1`,
35+
json: true
36+
})
37+
expect(res.title).toBe(title)
38+
39+
// POST
40+
newId++
41+
await request({
42+
url: `${url}posts`,
43+
json: true,
44+
method: 'POST',
45+
body: {
46+
id: newId,
47+
title: 'new',
48+
author: 'test'
49+
}
50+
})
51+
52+
const newPost = await request({
53+
url: `${url}posts/${newId}`,
54+
json: true
55+
})
56+
expect(newPost.title).toBe('new')
57+
}
58+
59+
test('serve with single proxy', async () => {
60+
const project = await create('single-proxy', defaultPreset)
61+
62+
await project.write('vue.config.js', `
63+
module.exports = {
64+
devServer: {
65+
proxy: 'http://localhost:3000'
66+
}
67+
}
68+
`)
69+
70+
await serve(
71+
() => project.run('vue-cli-service serve'),
72+
({ url }) => assertProxy(url, 'server-one'),
73+
true /* no need for puppeteer */
74+
)
75+
})
76+
77+
test('serve with multi proxies', async () => {
78+
const project = await create('multi-proxy', defaultPreset)
79+
80+
await project.write('vue.config.js', `
81+
module.exports = {
82+
devServer: {
83+
proxy: {
84+
'/one': {
85+
target: 'http://localhost:3000',
86+
pathRewrite: {
87+
'^/one': ''
88+
}
89+
},
90+
'/two': {
91+
target: 'http://localhost:3001',
92+
pathRewrite: {
93+
'^/two': ''
94+
}
95+
}
96+
}
97+
}
98+
}
99+
`)
100+
101+
await serve(
102+
() => project.run('vue-cli-service serve'),
103+
async ({ url }) => {
104+
await assertProxy(`${url}one/`, 'server-one')
105+
await assertProxy(`${url}two/`, 'server-two')
106+
},
107+
true /* no need for puppeteer */
108+
)
109+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const jsonServer = require('json-server')
2+
3+
const defaultData = () => ({
4+
'posts': [
5+
{ 'id': 1, 'title': 'json-server', 'author': 'typicode' }
6+
],
7+
'comments': [
8+
{ 'id': 1, 'body': 'some comment', 'postId': 1 }
9+
],
10+
'profile': { 'name': 'typicode' }
11+
})
12+
13+
module.exports = function createJSONServer (data = defaultData()) {
14+
const server = jsonServer.create()
15+
const router = jsonServer.router(data)
16+
const middlewares = jsonServer.defaults()
17+
18+
server.use(middlewares)
19+
server.use(router)
20+
return server
21+
}

packages/@vue/cli-test-utils/serveWithPuppeteer.js

+19-14
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const stripAnsi = require('strip-ansi')
22
const launchPuppeteer = require('./launchPuppeteer')
33

4-
module.exports = async function serveWithPuppeteer (serve, test) {
4+
module.exports = async function serveWithPuppeteer (serve, test, noPuppeteer) {
55
let activeBrowser
66
let activeChild
77

@@ -43,22 +43,27 @@ module.exports = async function serveWithPuppeteer (serve, test) {
4343
// when running test in vscode terminal(zsh)
4444
url = stripAnsi(url)
4545

46-
// start browser
47-
const { page, browser } = await launchPuppeteer(url)
48-
activeBrowser = browser
46+
if (noPuppeteer) {
47+
await test({ url })
48+
} else {
49+
// start browser
50+
const { page, browser } = await launchPuppeteer(url)
51+
activeBrowser = browser
4952

50-
const helpers = createHelpers(page)
53+
const helpers = createHelpers(page)
5154

52-
await test({
53-
browser,
54-
page,
55-
url,
56-
nextUpdate,
57-
helpers
58-
})
55+
await test({
56+
browser,
57+
page,
58+
url,
59+
nextUpdate,
60+
helpers
61+
})
62+
63+
await browser.close()
64+
activeBrowser = null
65+
}
5966

60-
await browser.close()
61-
activeBrowser = null
6267
// on appveyor, the spawned server process doesn't exit
6368
// and causes the build to hang.
6469
child.stdin.write('close')

0 commit comments

Comments
 (0)