@@ -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,132 @@ 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_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+ }
270+
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' ) ;
274+
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' ) ;
278+
279+ done ( ) ;
280+ } ) ;
281+
282+ setTimeout ( ( ) => {
283+ abortController . abort ( ) ;
284+ } , 5000 ) ;
285+ } ) ;
286+
287+ describe ( 'Without webpack-dev-server installed' , ( ) => {
288+ before ( ( ) => {
289+ execSync ( 'yarn remove webpack-dev-server --dev' , { cwd : projectDir } ) ;
290+ } ) ;
291+
292+ after ( ( ) => {
293+ // Re-install webpack-dev-server and ensure the project is in a clean state
294+ execSync ( 'git checkout package.json' , { cwd : projectDir } ) ;
295+ execSync ( 'yarn install' , { cwd : projectDir } ) ;
296+ } ) ;
297+
298+ it ( 'Throw an error when trying to use the webpack-dev-server if not installed' , done => {
299+ testSetup . emptyTmpDir ( ) ;
300+ const testDir = testSetup . createTestAppDir ( ) ;
301+
302+ fs . writeFileSync (
303+ path . join ( testDir , 'package.json' ) ,
304+ `{
305+ "devDependencies": {
306+ "@symfony/webpack-encore": "*"
307+ }
308+ }`
309+ ) ;
310+
311+ fs . writeFileSync (
312+ path . join ( testDir , 'webpack.config.js' ) ,
313+ `
314+ const Encore = require('../../index.js');
315+ Encore
316+ .enableSingleRuntimeChunk()
317+ .setOutputPath('build/')
318+ .setPublicPath('/build')
319+ .addEntry('main', './js/no_require')
320+ ;
321+
322+ module.exports = Encore.getWebpackConfig();
323+ `
324+ ) ;
325+
326+ const binPath = path . resolve ( projectDir , 'bin' , 'encore.js' ) ;
327+ exec (
328+ `node ${ binPath } dev-server --context=${ testDir } ` ,
329+ {
330+ cwd : testDir ,
331+ 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 ( '' ) ;
337+
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' ) ;
341+
342+ done ( ) ;
343+ } ) ;
344+ } ) ;
345+ } ) ;
216346} ) ;
0 commit comments