9
9
10
10
'use strict' ;
11
11
12
- const chai = require ( 'chai' ) ;
12
+ import { describe , it , expect , beforeEach , afterEach , chai } from 'vitest' ;
13
+ import getPort from "get-port" ;
13
14
chai . use ( require ( 'chai-fs' ) ) ;
14
- const expect = chai . expect ;
15
15
const path = require ( 'path' ) ;
16
16
const testSetup = require ( '../helpers/setup' ) ;
17
17
const fs = require ( 'fs-extra' ) ;
18
+ const { promisify } = require ( 'util' ) ;
18
19
const { exec, execSync, spawn } = require ( 'child_process' ) ;
19
-
20
+ const execAsync = promisify ( exec ) ;
20
21
const projectDir = path . resolve ( __dirname , '../' , '../' ) ;
21
22
22
- describe ( 'bin/encore.js' , function ( ) {
23
- // being functional tests, these can take quite long
24
- this . timeout ( 10000 ) ;
25
-
26
- it ( 'Basic smoke test' , ( done ) => {
27
- testSetup . emptyTmpDir ( ) ;
23
+ describe ( 'bin/encore.js' , { sequential : true , timeout : 10000 } , function ( ) {
24
+ it ( 'Basic smoke test' , async ( ) => {
28
25
const testDir = testSetup . createTestAppDir ( ) ;
29
26
30
27
fs . writeFileSync (
@@ -52,23 +49,19 @@ module.exports = Encore.getWebpackConfig();
52
49
) ;
53
50
54
51
const binPath = path . resolve ( __dirname , '../' , '../' , 'bin' , 'encore.js' ) ;
55
- exec ( `node ${ binPath } dev --context=${ testDir } ` , { cwd : testDir } , ( err , stdout , stderr ) => {
56
- if ( err ) {
57
- throw new Error ( `Error executing encore: ${ err } ${ stderr } ${ stdout } ` ) ;
58
- }
52
+ try {
53
+ const { stdout, stderr } = await execAsync ( `node ${ binPath } dev --context=${ testDir } ` , { cwd : testDir } ) ;
59
54
60
55
expect ( stdout ) . to . contain ( 'Compiled successfully' ) ;
61
-
62
56
expect ( stdout ) . not . to . contain ( 'Hash: ' ) ;
63
57
expect ( stdout ) . not . to . contain ( 'Version: ' ) ;
64
58
expect ( stdout ) . not . to . contain ( 'Time: ' ) ;
65
-
66
- done ( ) ;
67
- } ) ;
59
+ } catch ( err ) {
60
+ throw new Error ( `Error executing encore: ${ err } ${ err . stderr } ${ err . stdout } ` ) ;
61
+ }
68
62
} ) ;
69
63
70
- it ( 'Smoke test using the --json option' , ( done ) => {
71
- testSetup . emptyTmpDir ( ) ;
64
+ it ( 'Smoke test using the --json option' , async ( ) => {
72
65
const testDir = testSetup . createTestAppDir ( ) ;
73
66
74
67
fs . writeFileSync (
@@ -87,10 +80,8 @@ module.exports = Encore.getWebpackConfig();
87
80
) ;
88
81
89
82
const binPath = path . resolve ( __dirname , '../' , '../' , 'bin' , 'encore.js' ) ;
90
- exec ( `node ${ binPath } dev --json --context=${ testDir } ` , { cwd : testDir } , ( err , stdout , stderr ) => {
91
- if ( err ) {
92
- throw new Error ( `Error executing encore: ${ err } ${ stderr } ${ stdout } ` ) ;
93
- }
83
+ try {
84
+ const { stdout, stderr } = await execAsync ( `node ${ binPath } dev --json --context=${ testDir } ` , { cwd : testDir } ) ;
94
85
95
86
let parsedOutput = null ;
96
87
try {
@@ -101,21 +92,18 @@ module.exports = Encore.getWebpackConfig();
101
92
102
93
expect ( parsedOutput ) . to . be . an ( 'object' ) ;
103
94
expect ( parsedOutput . modules ) . to . be . an ( 'array' ) ;
104
-
105
95
// We expect 4 modules there:
106
96
// - webpack/runtime/chunk loaded
107
97
// - webpack/runtime/jsonp chunk loading
108
98
// - webpack/runtime/hasOwnProperty shorthand
109
99
// - ./js/no_require.js
110
100
expect ( parsedOutput . modules . length ) . to . equal ( 4 ) ;
111
-
112
-
113
- done ( ) ;
114
- } ) ;
101
+ } catch ( err ) {
102
+ throw new Error ( `Error executing encore: ${ err } ${ err . stderr } ${ err . stdout } ` ) ;
103
+ }
115
104
} ) ;
116
105
117
- it ( 'Smoke test using the --profile option' , ( done ) => {
118
- testSetup . emptyTmpDir ( ) ;
106
+ it ( 'Smoke test using the --profile option' , async ( ) => {
119
107
const testDir = testSetup . createTestAppDir ( ) ;
120
108
121
109
fs . writeFileSync (
@@ -134,22 +122,19 @@ module.exports = Encore.getWebpackConfig();
134
122
) ;
135
123
136
124
const binPath = path . resolve ( __dirname , '../' , '../' , 'bin' , 'encore.js' ) ;
137
- exec ( `node ${ binPath } dev --profile --context=${ testDir } ` , { cwd : testDir } , ( err , stdout , stderr ) => {
138
- if ( err ) {
139
- throw new Error ( `Error executing encore: ${ err } ${ stderr } ${ stdout } ` ) ;
140
- }
125
+ try {
126
+ const { stdout, stderr } = await execAsync ( `node ${ binPath } dev --profile --context=${ testDir } ` , { cwd : testDir } ) ;
141
127
142
128
expect ( stdout ) . to . contain ( 'resolving: ' ) ;
143
129
expect ( stdout ) . to . contain ( 'restoring: ' ) ;
144
130
expect ( stdout ) . to . contain ( 'integration: ' ) ;
145
131
expect ( stdout ) . to . contain ( 'building: ' ) ;
146
-
147
- done ( ) ;
148
- } ) ;
132
+ } catch ( err ) {
133
+ throw new Error ( `Error executing encore: ${ err } ${ err . stderr } ${ err . stdout } ` ) ;
134
+ }
149
135
} ) ;
150
136
151
- it ( 'Smoke test using the --keep-public-path option' , ( done ) => {
152
- testSetup . emptyTmpDir ( ) ;
137
+ it ( 'Smoke test using the --keep-public-path option' , async ( ) => {
153
138
const testDir = testSetup . createTestAppDir ( ) ;
154
139
155
140
fs . writeFileSync (
@@ -168,17 +153,14 @@ module.exports = Encore.getWebpackConfig();
168
153
) ;
169
154
170
155
const binPath = path . resolve ( __dirname , '../' , '../' , 'bin' , 'encore.js' ) ;
171
- exec ( `node ${ binPath } dev --keep-public-path --context=${ testDir } ` , { cwd : testDir } , ( err , stdout , stderr ) => {
172
- if ( err ) {
173
- throw new Error ( `Error executing encore: ${ err } ${ stderr } ${ stdout } ` ) ;
174
- }
175
-
176
- done ( ) ;
177
- } ) ;
156
+ try {
157
+ await execAsync ( `node ${ binPath } dev --keep-public-path --context=${ testDir } ` , { cwd : testDir } ) ;
158
+ } catch ( err ) {
159
+ throw new Error ( `Error executing encore: ${ err } ${ err . stderr } ${ err . stdout } ` ) ;
160
+ }
178
161
} ) ;
179
162
180
- it ( 'Display an error when calling an unknown method' , ( done ) => {
181
- testSetup . emptyTmpDir ( ) ;
163
+ it ( 'Display an error when calling an unknown method' , async ( ) => {
182
164
const testDir = testSetup . createTestAppDir ( ) ;
183
165
184
166
fs . writeFileSync (
@@ -207,17 +189,18 @@ module.exports = Encore.getWebpackConfig();
207
189
) ;
208
190
209
191
const binPath = path . resolve ( __dirname , '../' , '../' , 'bin' , 'encore.js' ) ;
210
- exec ( `node ${ binPath } dev --context=${ testDir } ` , { cwd : testDir } , ( err , stdout , stderr ) => {
192
+ try {
193
+ await execAsync ( `node ${ binPath } dev --context=${ testDir } ` , { cwd : testDir } ) ;
194
+ throw new Error ( 'Expected command to fail.' ) ;
195
+ } catch ( err ) {
211
196
expect ( err ) . not . to . be . null ;
212
- expect ( stdout ) . to . contain ( 'is not a recognized property' ) ;
213
- expect ( stdout ) . to . contain ( 'or method' ) ;
214
- expect ( stdout ) . to . contain ( 'Did you mean' ) ;
215
- done ( ) ;
216
- } ) ;
197
+ expect ( err . stdout ) . to . contain ( 'is not a recognized property' ) ;
198
+ expect ( err . stdout ) . to . contain ( 'or method' ) ;
199
+ expect ( err . stdout ) . to . contain ( 'Did you mean' ) ;
200
+ }
217
201
} ) ;
218
202
219
- it ( 'Run the webpack-dev-server successfully' , ( done ) => {
220
- testSetup . emptyTmpDir ( ) ;
203
+ it ( 'Run the webpack-dev-server successfully' , { timeout : 10000 } , async ( ) => {
221
204
const testDir = testSetup . createTestAppDir ( ) ;
222
205
223
206
fs . writeFileSync (
@@ -246,57 +229,58 @@ module.exports = Encore.getWebpackConfig();
246
229
247
230
const binPath = path . resolve ( __dirname , '../' , '../' , 'bin' , 'encore.js' ) ;
248
231
const abortController = new AbortController ( ) ;
249
- const node = spawn ( 'node' , [ binPath , 'dev-server' , `--context=${ testDir } ` ] , {
250
- cwd : testDir ,
251
- env : Object . assign ( { } , process . env , { NO_COLOR : 'true' } ) ,
252
- signal : abortController . signal
253
- } ) ;
254
-
255
- let stdout = '' ;
256
- let stderr = '' ;
257
-
258
- node . stdout . on ( 'data' , ( data ) => {
259
- stdout += data . toString ( ) ;
260
- } ) ;
261
-
262
- node . stderr . on ( 'data' , ( data ) => {
263
- stderr += data . toString ( ) ;
264
- } ) ;
265
-
266
- node . on ( 'error' , ( error ) => {
267
- if ( error . name !== 'AbortError' ) {
268
- throw new Error ( 'Error executing encore' , { cause : error } ) ;
269
- }
232
+ const port = await getPort ( ) ;
233
+ await new Promise ( async ( resolve , reject ) => {
234
+ const node = spawn ( 'node' , [ binPath , 'dev-server' , `--context=${ testDir } ` , `--port=${ port } ` ] , {
235
+ cwd : testDir ,
236
+ env : Object . assign ( { } , process . env , { NO_COLOR : 'true' , FORCE_COLOR : 'false' } ) ,
237
+ signal : abortController . signal
238
+ } ) ;
239
+
240
+ let stdout = '' ;
241
+ let stderr = '' ;
242
+
243
+ node . stdout . on ( 'data' , ( data ) => {
244
+ stdout += data . toString ( ) ;
245
+ } ) ;
246
+
247
+ node . stderr . on ( 'data' , ( data ) => {
248
+ stderr += data . toString ( ) ;
249
+ } ) ;
250
+
251
+ node . on ( 'error' , ( error ) => {
252
+ if ( error . name !== 'AbortError' ) {
253
+ reject ( new Error ( 'Error executing encore' , { cause : error } ) ) ;
254
+ }
270
255
271
- expect ( stdout ) . to . contain ( 'Running webpack-dev-server ...' ) ;
272
- expect ( stdout ) . to . contain ( 'Compiled successfully in' ) ;
273
- expect ( stdout ) . to . contain ( 'webpack compiled successfully' ) ;
256
+ expect ( stdout ) . to . contain ( 'Running webpack-dev-server ...' ) ;
257
+ expect ( stdout ) . to . contain ( 'Compiled successfully in' ) ;
258
+ expect ( stdout ) . to . contain ( 'webpack compiled successfully' ) ;
274
259
275
- expect ( stderr ) . to . contain ( '[webpack-dev-server] Project is running at:' ) ;
276
- expect ( stderr ) . to . contain ( ' [webpack-dev-server] Loopback: http://localhost:8080/' ) ;
277
- expect ( stderr ) . to . contain ( '[webpack-dev-server] Content not from webpack is served from' ) ;
260
+ expect ( stderr ) . to . contain ( '[webpack-dev-server] Project is running at:' ) ;
261
+ expect ( stderr ) . to . contain ( ` [webpack-dev-server] Loopback: http://localhost:${ port } /` ) ;
262
+ expect ( stderr ) . to . contain ( '[webpack-dev-server] Content not from webpack is served from' ) ;
278
263
279
- done ( ) ;
280
- } ) ;
264
+ resolve ( ) ;
265
+ } ) ;
281
266
282
- setTimeout ( ( ) => {
267
+ await new Promise ( r => setTimeout ( r , 9000 ) ) ;
283
268
abortController . abort ( ) ;
284
- } , 5000 ) ;
269
+ } )
285
270
} ) ;
286
271
287
272
describe ( 'Without webpack-dev-server installed' , ( ) => {
288
- before ( ( ) => {
273
+ beforeEach ( ( ) => {
289
274
execSync ( 'yarn remove webpack-dev-server --dev' , { cwd : projectDir } ) ;
290
275
} ) ;
291
276
292
- after ( ( ) => {
277
+ afterEach ( ( ) => {
293
278
// Re-install webpack-dev-server and ensure the project is in a clean state
294
- execSync ( 'git checkout package.json' , { cwd : projectDir } ) ;
279
+ execSync ( 'git checkout package.json yarn.lock ' , { cwd : projectDir } ) ;
295
280
execSync ( 'yarn install' , { cwd : projectDir } ) ;
296
281
} ) ;
297
282
298
- it ( 'Throw an error when trying to use the webpack-dev-server if not installed' , done => {
299
- testSetup . emptyTmpDir ( ) ;
283
+ it ( 'Throw an error when trying to use the webpack-dev-server if not installed' , async ( ) => {
300
284
const testDir = testSetup . createTestAppDir ( ) ;
301
285
302
286
fs . writeFileSync (
@@ -324,23 +308,26 @@ module.exports = Encore.getWebpackConfig();
324
308
) ;
325
309
326
310
const binPath = path . resolve ( projectDir , 'bin' , 'encore.js' ) ;
327
- exec (
328
- `node ${ binPath } dev-server --context=${ testDir } ` ,
329
- {
311
+ try {
312
+ await execAsync ( `node ${ binPath } dev-server --context=${ testDir } ` , {
330
313
cwd : testDir ,
331
314
env : Object . assign ( { } , process . env , { NO_COLOR : 'true' } )
332
- } ,
333
- ( err , stdout , stderr ) => {
334
- expect ( stdout ) . to . contain ( 'Install webpack-dev-server to use the webpack Development Server' ) ;
335
- expect ( stdout ) . to . contain ( 'npm install webpack-dev-server --save-dev' ) ;
336
- expect ( stderr ) . to . equal ( '' ) ;
315
+ } ) ;
337
316
338
- expect ( stdout ) . not . to . contain ( 'Running webpack-dev-server ...' ) ;
339
- expect ( stdout ) . not . to . contain ( 'Compiled successfully in' ) ;
340
- expect ( stdout ) . not . to . contain ( 'webpack compiled successfully' ) ;
317
+ throw new Error ( 'Expected command to fail.' ) ;
318
+ } catch ( err ) {
319
+ if ( ! 'stdout' in err || ! 'stderr' in err ) {
320
+ throw new Error ( `Error executing encore: ${ err } ` ) ;
321
+ }
341
322
342
- done ( ) ;
343
- } ) ;
323
+ expect ( err . stdout ) . to . contain ( 'Install webpack-dev-server to use the webpack Development Server' ) ;
324
+ expect ( err . stdout ) . to . contain ( 'npm install webpack-dev-server --save-dev' ) ;
325
+ expect ( err . stderr ) . to . equal ( '' ) ;
326
+
327
+ expect ( err . stdout ) . not . to . contain ( 'Running webpack-dev-server ...' ) ;
328
+ expect ( err . stdout ) . not . to . contain ( 'Compiled successfully in' ) ;
329
+ expect ( err . stdout ) . not . to . contain ( 'webpack compiled successfully' ) ;
330
+ }
344
331
} ) ;
345
332
} ) ;
346
333
} ) ;
0 commit comments