@@ -15,7 +15,9 @@ const expect = chai.expect;
1515const path = require ( 'path' ) ;
1616const testSetup = require ( '../helpers/setup' ) ;
1717const fs = require ( 'fs-extra' ) ;
18- const exec = require ( 'child_process' ) . exec ;
18+ const { exec, execSync, spawn } = require ( 'child_process' ) ;
19+
20+ const projectDir = path . resolve ( __dirname , '../' , '../' ) ;
1921
2022describe ( 'bin/encore.js' , function ( ) {
2123 // being functional tests, these can take quite long
@@ -213,4 +215,143 @@ module.exports = Encore.getWebpackConfig();
213215 done ( ) ;
214216 } ) ;
215217 } ) ;
218+
219+ it ( 'Run the webpack-dev-server successfully' , ( done ) => {
220+ testSetup . emptyTmpDir ( ) ;
221+ const testDir = testSetup . createTestAppDir ( ) ;
222+
223+ fs . writeFileSync (
224+ path . join ( testDir , 'package.json' ) ,
225+ `{
226+ "devDependencies": {
227+ "@symfony/webpack-encore": "*"
228+ }
229+ }`
230+ ) ;
231+
232+ fs . writeFileSync (
233+ path . join ( testDir , 'webpack.config.js' ) ,
234+ `
235+ const Encore = require('../../index.js');
236+ Encore
237+ .enableSingleRuntimeChunk()
238+ .setOutputPath('build/')
239+ .setPublicPath('/build')
240+ .addEntry('main', './js/no_require')
241+ ;
242+
243+ module.exports = Encore.getWebpackConfig();
244+ `
245+ ) ;
246+
247+ const binPath = path . resolve ( __dirname , '../' , '../' , 'bin' , 'encore.js' ) ;
248+ const abortController = new AbortController ( ) ;
249+ const node = spawn ( 'node' , [ binPath , 'dev-server' , `--context=${ testDir } ` ] , {
250+ cwd : testDir ,
251+ env : Object . assign ( { } , process . env , { NO_COLORS : '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+ }
270+ // TODO: debug CI
271+ console . log ( { stdout, stderr } ) ;
272+
273+ expect ( stdout ) . to . contain ( 'Running webpack-dev-server ...' ) ;
274+ expect ( stdout ) . to . contain ( 'Compiled successfully in' ) ;
275+ expect ( stdout ) . to . contain ( 'webpack compiled successfully' ) ;
276+
277+ expect ( stderr ) . to . contain ( '[webpack-dev-server] Project is running at:' ) ;
278+ expect ( stderr ) . to . contain ( '[webpack-dev-server] Loopback: http://localhost:8080/, http://127.0.0.1:8080/' ) ;
279+ expect ( stderr ) . to . contain ( '[webpack-dev-server] Content not from webpack is served from' ) ;
280+
281+ done ( ) ;
282+ } ) ;
283+
284+ setTimeout ( ( ) => {
285+ abortController . abort ( ) ;
286+ } , 5000 ) ;
287+ } ) ;
288+
289+ describe ( 'Without webpack-dev-server installed' , ( ) => {
290+ const webpackDevServerConstraint = require ( '../../package.json' ) . devDependencies [ 'webpack-dev-server' ] || null ;
291+ if ( ! webpackDevServerConstraint ) {
292+ throw new Error ( 'Missing "webpack-dev-server" as dev dependency in package.json.' ) ;
293+ }
294+
295+ before ( ( ) => {
296+ execSync ( 'yarn remove webpack-dev-server --dev' , { cwd : projectDir } ) ;
297+ } ) ;
298+
299+ after ( ( ) => {
300+ // Re-install webpack-dev-server and ensure the project is in a clean state
301+ execSync ( `yarn add webpack-dev-server@${ webpackDevServerConstraint } --dev` , { cwd : projectDir } ) ;
302+ execSync ( 'git checkout yarn.lock' , { cwd : projectDir } ) ;
303+ execSync ( 'yarn install' , { cwd : projectDir } ) ;
304+ } ) ;
305+
306+ it ( 'Throw an error when trying to use the webpack-dev-server if not installed' , done => {
307+ testSetup . emptyTmpDir ( ) ;
308+ const testDir = testSetup . createTestAppDir ( ) ;
309+
310+ fs . writeFileSync (
311+ path . join ( testDir , 'package.json' ) ,
312+ `{
313+ "devDependencies": {
314+ "@symfony/webpack-encore": "*"
315+ }
316+ }`
317+ ) ;
318+
319+ fs . writeFileSync (
320+ path . join ( testDir , 'webpack.config.js' ) ,
321+ `
322+ const Encore = require('../../index.js');
323+ Encore
324+ .enableSingleRuntimeChunk()
325+ .setOutputPath('build/')
326+ .setPublicPath('/build')
327+ .addEntry('main', './js/no_require')
328+ ;
329+
330+ module.exports = Encore.getWebpackConfig();
331+ `
332+ ) ;
333+
334+ const binPath = path . resolve ( projectDir , 'bin' , 'encore.js' ) ;
335+ exec (
336+ `node ${ binPath } dev-server --context=${ testDir } ` ,
337+ {
338+ cwd : testDir ,
339+ env : Object . assign ( { } , process . env , { NO_COLORS : 'true' } )
340+ } ,
341+ ( err , stdout , stderr ) => {
342+ // TODO: debug CI
343+ console . log ( { stdout, stderr } ) ;
344+
345+ expect ( stdout ) . to . contain ( 'Install webpack-dev-server to use the webpack Development Server' ) ;
346+ expect ( stdout ) . to . contain ( 'npm install webpack-dev-server --save-dev' ) ;
347+ expect ( stderr ) . to . equal ( '' ) ;
348+
349+ expect ( stdout ) . not . to . contain ( 'Running webpack-dev-server ...' ) ;
350+ expect ( stdout ) . not . to . contain ( 'Compiled successfully in' ) ;
351+ expect ( stdout ) . not . to . contain ( 'webpack compiled successfully' ) ;
352+
353+ done ( ) ;
354+ } ) ;
355+ } ) ;
356+ } ) ;
216357} ) ;
0 commit comments