Skip to content

Commit 2fd3600

Browse files
committed
Add test to validate open vs run mode behaviors
1 parent a2d9520 commit 2fd3600

File tree

3 files changed

+77
-46
lines changed

3 files changed

+77
-46
lines changed

npm/webpack-dev-server/test/devServer-e2e.spec.ts

+74-46
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import path from 'path'
22
import { expect } from 'chai'
33
import { once, EventEmitter } from 'events'
44
import http from 'http'
5-
import fs from 'fs'
5+
import fs from 'fs-extra'
66

77
import { devServer } from '..'
88
import { restoreLoadHook } from '../src/helpers/sourceRelativeWebpackModules'
99
import './support'
10+
import type { ConfigHandler } from '../src/devServer'
1011

1112
const requestSpecFile = (file: string, port: number) => {
1213
return new Promise((res) => {
@@ -34,7 +35,7 @@ const requestSpecFile = (file: string, port: number) => {
3435

3536
const root = path.join(__dirname, '..')
3637

37-
const webpackConfig = {
38+
const webpackConfig: ConfigHandler = {
3839
devServer: { static: { directory: root } },
3940
}
4041

@@ -48,6 +49,20 @@ const createSpecs = (name: string): Cypress.Cypress['spec'][] => {
4849
]
4950
}
5051

52+
type DevServerCloseFn = Awaited<ReturnType<typeof devServer>>['close']
53+
54+
const closeServer = async (closeFn: DevServerCloseFn) => {
55+
await new Promise<void>((resolve, reject) => {
56+
closeFn((err?: Error) => {
57+
if (err) {
58+
return reject(err)
59+
}
60+
61+
resolve()
62+
})
63+
})
64+
}
65+
5166
const cypressConfig = {
5267
projectRoot: root,
5368
supportFile: '',
@@ -78,15 +93,7 @@ describe('#devServer', () => {
7893

7994
expect(response).to.eq('const foo = () => {}\n')
8095

81-
await new Promise<void>((resolve, reject) => {
82-
close((err) => {
83-
if (err) {
84-
return reject(err)
85-
}
86-
87-
resolve()
88-
})
89-
})
96+
await closeServer(close)
9097
})
9198

9299
it('serves specs in directory with [] chars via a webpack dev server', async () => {
@@ -101,9 +108,7 @@ describe('#devServer', () => {
101108

102109
expect(response).to.eq(`it('this is a spec with a path containing []', () => {})\n`)
103110

104-
return new Promise((res) => {
105-
close(() => res())
106-
})
111+
return closeServer(close)
107112
})
108113

109114
it('serves specs in directory with non English chars via a webpack dev server', async () => {
@@ -118,9 +123,7 @@ describe('#devServer', () => {
118123

119124
expect(response).to.eq(`it('サイプレス', () => {})\n`)
120125

121-
return new Promise((res) => {
122-
close(() => res())
123-
})
126+
return closeServer(close)
124127
})
125128

126129
it('serves specs in directory with ... in the file name via a webpack dev server', async () => {
@@ -135,9 +138,7 @@ describe('#devServer', () => {
135138

136139
expect(response).to.eq(`it('...bar', () => {})\n`)
137140

138-
return new Promise((res) => {
139-
close(() => res())
140-
})
141+
return closeServer(close)
141142
})
142143

143144
it('serves a file with spaces via a webpack dev server', async () => {
@@ -152,9 +153,7 @@ describe('#devServer', () => {
152153

153154
expect(response).to.eq(`it('this is a spec with a path containing a space', () => {})\n`)
154155

155-
return new Promise((res) => {
156-
close(() => res())
157-
})
156+
return closeServer(close)
158157
})
159158

160159
it('emits dev-server:compile:success event on successful compilation', async () => {
@@ -167,15 +166,8 @@ describe('#devServer', () => {
167166
})
168167

169168
await once(devServerEvents, 'dev-server:compile:success')
170-
await new Promise<void>((resolve, reject) => {
171-
close((err) => {
172-
if (err) {
173-
return reject(err)
174-
}
175169

176-
resolve()
177-
})
178-
})
170+
await closeServer(close)
179171
})
180172

181173
it('touches browser.js when a spec file is added and recompile', async function () {
@@ -205,14 +197,58 @@ describe('#devServer', () => {
205197

206198
expect(oldmtime).to.not.equal(updatedmtime)
207199

208-
await new Promise<void>((resolve, reject) => {
209-
close((err) => {
210-
if (err) {
211-
return reject(err)
200+
await closeServer(close)
201+
})
202+
203+
;[{
204+
title: 'does not watch/recompile files in `run` mode',
205+
isRunMode: true,
206+
updateExpected: false,
207+
message: 'Files should not be watched in `run` mode',
208+
}, {
209+
title: 'watches and recompiles files on change in `open` mode',
210+
isRunMode: false,
211+
updateExpected: true,
212+
message: 'Files should be watched and automatically rebuild on update in `open` mode',
213+
}].forEach(({ title, isRunMode, updateExpected, message }) => {
214+
it(title, async () => {
215+
const originalContent = await fs.readFile(`./test/fixtures/dependency.js`)
216+
217+
try {
218+
cypressConfig.devServerPublicPathRoute = '/__cypress/src'
219+
cypressConfig.isTextTerminal = isRunMode
220+
const devServerEvents = new EventEmitter()
221+
const { close, port } = await devServer({
222+
webpackConfig: {},
223+
cypressConfig,
224+
specs: createSpecs('bar.spec.js'),
225+
devServerEvents,
226+
})
227+
228+
// Wait for initial "ready" from server
229+
await once(devServerEvents, 'dev-server:compile:success')
230+
231+
// Get the initial version of the bundled spec
232+
const original = await requestSpecFile('/__cypress/src/spec-0.js', port)
233+
234+
// Update a dependency of the spec
235+
await fs.writeFile('./test/fixtures/dependency.js', `window.TEST = true;${originalContent}`)
236+
// Brief wait to give server time to detect changes
237+
await new Promise((resolve) => setTimeout(resolve, 500))
238+
239+
// Re-fetch the spec
240+
const updated = await requestSpecFile('/__cypress/src/spec-0.js', port)
241+
242+
if (updateExpected) {
243+
expect(original, message).not.to.equal(updated)
244+
} else {
245+
expect(original, message).to.equal(updated)
212246
}
213247

214-
resolve()
215-
})
248+
await closeServer(close)
249+
} finally {
250+
fs.writeFile('./test/fixtures/dependency.js', originalContent)
251+
}
216252
})
217253
})
218254

@@ -231,15 +267,7 @@ describe('#devServer', () => {
231267

232268
expect(response).to.eq('const foo = () => {}\n')
233269

234-
await new Promise<void>((resolve, reject) => {
235-
close((err) => {
236-
if (err) {
237-
return reject(err)
238-
}
239-
240-
resolve()
241-
})
242-
})
270+
await closeServer(close)
243271
})
244272
})
245273
.timeout(5000)
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1+
import './dependency'
2+
13
const bar = () => {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export {}

0 commit comments

Comments
 (0)