From 058949a1b82ef4a66f1b2fe583ee7fde543c3539 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Sun, 5 Apr 2020 10:16:17 +0530 Subject: [PATCH 01/17] chore: add init tests --- test/init/auto/.gitignore | 4 ++++ test/init/auto/init-auto.test.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 test/init/auto/.gitignore create mode 100644 test/init/auto/init-auto.test.js diff --git a/test/init/auto/.gitignore b/test/init/auto/.gitignore new file mode 100644 index 00000000000..e07e4b8420c --- /dev/null +++ b/test/init/auto/.gitignore @@ -0,0 +1,4 @@ +# ignore the test files +* +!init-auto.test.js +!.gitignore diff --git a/test/init/auto/init-auto.test.js b/test/init/auto/init-auto.test.js new file mode 100644 index 00000000000..3a2cc5e8909 --- /dev/null +++ b/test/init/auto/init-auto.test.js @@ -0,0 +1,29 @@ +/* eslint-disable node/no-unpublished-require */ +'use strict'; + +const { run } = require('../../utils/test-utils'); +const firstPrompt = 'Will your application have multiple bundles?'; +const fs = require('fs'); +const { join } = require('path'); + +describe('init auto flag', () => { + it('should prompt with w/o auto flag', () => { + const { stdout, stderr } = run(__dirname, ['init'], false); + expect(stdout).toBeTruthy(); + expect(stderr).toBeFalsy(); + expect(stdout).toContain(firstPrompt); + }); + + it('should scaffold and not prompt with auto flag', () => { + const { stdout } = run(__dirname, ['init', '--auto'], false); + // Test no prompts are present + expect(stdout).toBeTruthy(); + expect(stdout).not.toContain(firstPrompt); + + // Test regressively files are scaffolded + const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; + files.forEach(file => { + expect(fs.existsSync(join(__dirname, file))).toBeTruthy(); + }); + }); +}); From f5586b6a27180e78242d337ba86fc53a96cd2d69 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Sun, 5 Apr 2020 10:26:57 +0530 Subject: [PATCH 02/17] chore: lint --- test/init/auto/init-auto.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/init/auto/init-auto.test.js b/test/init/auto/init-auto.test.js index 3a2cc5e8909..94f63e82dd6 100644 --- a/test/init/auto/init-auto.test.js +++ b/test/init/auto/init-auto.test.js @@ -22,7 +22,7 @@ describe('init auto flag', () => { // Test regressively files are scaffolded const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; - files.forEach(file => { + files.forEach(function(file) { expect(fs.existsSync(join(__dirname, file))).toBeTruthy(); }); }); From f8db30f0545ad1896b9f900469819f1f210a99c9 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Sun, 5 Apr 2020 10:33:57 +0530 Subject: [PATCH 03/17] chore: lint --- test/init/auto/init-auto.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/init/auto/init-auto.test.js b/test/init/auto/init-auto.test.js index 94f63e82dd6..1b24080359f 100644 --- a/test/init/auto/init-auto.test.js +++ b/test/init/auto/init-auto.test.js @@ -22,7 +22,8 @@ describe('init auto flag', () => { // Test regressively files are scaffolded const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; - files.forEach(function(file) { + // eslint-disable-next-line prettier/prettier + files.forEach((file) => { expect(fs.existsSync(join(__dirname, file))).toBeTruthy(); }); }); From 900ca34729ad6f8298ab1aa89511dbe6a0019bc4 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Sun, 5 Apr 2020 12:09:05 +0530 Subject: [PATCH 04/17] tests: add init test with cli flags --- test/init/auto/.gitignore | 2 +- test/init/coreFlags/init-flags.test.js | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 test/init/coreFlags/init-flags.test.js diff --git a/test/init/auto/.gitignore b/test/init/auto/.gitignore index e07e4b8420c..0df979fb423 100644 --- a/test/init/auto/.gitignore +++ b/test/init/auto/.gitignore @@ -1,4 +1,4 @@ -# ignore the test files +# ignore the scaffolded files * !init-auto.test.js !.gitignore diff --git a/test/init/coreFlags/init-flags.test.js b/test/init/coreFlags/init-flags.test.js new file mode 100644 index 00000000000..f5a7abb3254 --- /dev/null +++ b/test/init/coreFlags/init-flags.test.js @@ -0,0 +1,15 @@ +/* eslint-disable node/no-unpublished-require */ +'use strict'; + +const { run } = require('../../utils/test-utils'); +const firstPrompt = 'Will your application have multiple bundles?'; + +describe('init with core flags', () => { + it('should output help with --help flag', () => { + const { stdout, stderr } = run(__dirname, ['init', '--help'], false); + expect(stdout).toBeTruthy(); + expect(stderr).toBeFalsy(); + expect(stdout).not.toContain(firstPrompt); + expect(stdout).toContain('Initialize a new webpack configuration'); + }); +}); From d3b7476bfc2d474bc40c7a98f40e1fefa9549c52 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Wed, 8 Apr 2020 19:09:08 +0530 Subject: [PATCH 05/17] chore: add e2e test for init --- package.json | 1 + test/init/generator/.gitignore | 4 ++ test/init/generator/init-inquirer.test.js | 59 +++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 test/init/generator/.gitignore create mode 100644 test/init/generator/init-inquirer.test.js diff --git a/package.json b/package.json index 254364233b2..d3bb59c00f9 100644 --- a/package.json +++ b/package.json @@ -104,6 +104,7 @@ "chalk": "^3.0.0", "commitlint": "^8.3.5", "commitlint-config-cz": "^0.13.0", + "concat-stream": "^2.0.0", "cz-customizable": "^6.2.0", "del-cli": "^3.0.0", "eslint": "^6.8.0", diff --git a/test/init/generator/.gitignore b/test/init/generator/.gitignore new file mode 100644 index 00000000000..93fd3fa8e77 --- /dev/null +++ b/test/init/generator/.gitignore @@ -0,0 +1,4 @@ +# ignore the scaffolded files +* +!init-inquirer.test.js +!.gitignore diff --git a/test/init/generator/init-inquirer.test.js b/test/init/generator/init-inquirer.test.js new file mode 100644 index 00000000000..2b2e8259c9e --- /dev/null +++ b/test/init/generator/init-inquirer.test.js @@ -0,0 +1,59 @@ +/* eslint-disable node/no-unpublished-require */ +'use strict'; + +const fs = require('fs'); +const { join } = require('path'); +const concat = require('concat-stream'); +const { runAndGetWatchProc } = require('../../utils/test-utils'); + +const firstPrompt = 'Will your application have multiple bundles?'; +// To account for node_modules installation +jest.setTimeout(200000); + +const run = async (...answers) => { + const runner = runAndGetWatchProc(__dirname, ['init'], false); + + runner.stdin.setDefaultEncoding('utf-8'); + + // Simulate answers buy sending the answers after waiting for 1s + const simulateAnswers = answers.reduce((prevAnswer, answer) => { + return prevAnswer.then(() => { + return new Promise((resolvePromise) => { + setTimeout(() => { + runner.stdin.write(answer); + resolvePromise(); + }, 1000); + }); + }); + }, Promise.resolve()); + + await simulateAnswers.then(() => { + runner.stdin.end(); + }); + + return new Promise((resolve) => { + runner.stdout.pipe( + concat((result) => { + resolve(result.toString()); + }), + ); + }); +}; + +const ENTER = '\x0D'; + +describe('init', () => { + it('should scaffold when given answers', async () => { + const stdout = await run('N', ENTER, ENTER, ENTER, ENTER, ENTER, ENTER, ENTER); + console.log(stdout); + expect(stdout).toBeTruthy(); + expect(stdout).toContain(firstPrompt); + + // Test regressively files are scaffolded + const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; + // eslint-disable-next-line prettier/prettier + files.forEach((file) => { + expect(fs.existsSync(join(__dirname, file))).toBeTruthy(); + }); + }); +}); From 86a2a80ad0591b388e3c0fb53f91b34be4e9f9be Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Wed, 8 Apr 2020 19:10:18 +0530 Subject: [PATCH 06/17] chore: remove console log --- test/init/generator/init-inquirer.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/init/generator/init-inquirer.test.js b/test/init/generator/init-inquirer.test.js index 2b2e8259c9e..2299126f486 100644 --- a/test/init/generator/init-inquirer.test.js +++ b/test/init/generator/init-inquirer.test.js @@ -45,7 +45,7 @@ const ENTER = '\x0D'; describe('init', () => { it('should scaffold when given answers', async () => { const stdout = await run('N', ENTER, ENTER, ENTER, ENTER, ENTER, ENTER, ENTER); - console.log(stdout); + expect(stdout).toBeTruthy(); expect(stdout).toContain(firstPrompt); From 6f74ea1e7180d99d2f2aac18bbab4779fff20537 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Wed, 8 Apr 2020 20:05:58 +0530 Subject: [PATCH 07/17] chore: use root gitignore --- .gitignore | 4 ++++ test/init/auto/.gitignore | 4 ---- test/init/generator/.gitignore | 4 ---- 3 files changed, 4 insertions(+), 8 deletions(-) delete mode 100644 test/init/auto/.gitignore delete mode 100644 test/init/generator/.gitignore diff --git a/.gitignore b/.gitignore index 3c508998a3f..b4c54e9568e 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,7 @@ packages/**/*.map # temporary test files test-assets/ + +# ignore scaffolded files due to tests of init +test/init/* +!test/init/**/*.test.js diff --git a/test/init/auto/.gitignore b/test/init/auto/.gitignore deleted file mode 100644 index 0df979fb423..00000000000 --- a/test/init/auto/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# ignore the scaffolded files -* -!init-auto.test.js -!.gitignore diff --git a/test/init/generator/.gitignore b/test/init/generator/.gitignore deleted file mode 100644 index 93fd3fa8e77..00000000000 --- a/test/init/generator/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# ignore the scaffolded files -* -!init-inquirer.test.js -!.gitignore From 43351bb053733d5790ed2790eb4e842e272e65bd Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Wed, 8 Apr 2020 21:13:44 +0530 Subject: [PATCH 08/17] chore: move tests to __tests__ --- .../__tests__}/init/auto/init-auto.test.js | 13 +++- .../init/coreFlags/init-flags.test.js | 8 +- .../init/generator/init-inquirer.test.js | 73 +++++++++++++++++++ 3 files changed, 89 insertions(+), 5 deletions(-) rename {test => packages/webpack-cli/__tests__}/init/auto/init-auto.test.js (67%) rename {test => packages/webpack-cli/__tests__}/init/coreFlags/init-flags.test.js (62%) create mode 100644 packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js diff --git a/test/init/auto/init-auto.test.js b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js similarity index 67% rename from test/init/auto/init-auto.test.js rename to packages/webpack-cli/__tests__/init/auto/init-auto.test.js index 1b24080359f..32792346090 100644 --- a/test/init/auto/init-auto.test.js +++ b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js @@ -1,21 +1,28 @@ /* eslint-disable node/no-unpublished-require */ 'use strict'; -const { run } = require('../../utils/test-utils'); +const { sync: spawnSync } = require('execa'); +const path = require('path'); const firstPrompt = 'Will your application have multiple bundles?'; const fs = require('fs'); const { join } = require('path'); describe('init auto flag', () => { it('should prompt with w/o auto flag', () => { - const { stdout, stderr } = run(__dirname, ['init'], false); + const { stdout, stderr } = spawnSync(path.resolve(__dirname, '../../bin/cli.js'), ['init'], { + cwd: path.resolve(__dirname), + reject: false, + }); expect(stdout).toBeTruthy(); expect(stderr).toBeFalsy(); expect(stdout).toContain(firstPrompt); }); it('should scaffold and not prompt with auto flag', () => { - const { stdout } = run(__dirname, ['init', '--auto'], false); + const { stdout } = spawnSync(path.resolve(__dirname, '../bin/cli.js'), ['init', '--auto'], { + cwd: path.resolve(__dirname), + reject: false, + }); // Test no prompts are present expect(stdout).toBeTruthy(); expect(stdout).not.toContain(firstPrompt); diff --git a/test/init/coreFlags/init-flags.test.js b/packages/webpack-cli/__tests__/init/coreFlags/init-flags.test.js similarity index 62% rename from test/init/coreFlags/init-flags.test.js rename to packages/webpack-cli/__tests__/init/coreFlags/init-flags.test.js index f5a7abb3254..73918fb2b8a 100644 --- a/test/init/coreFlags/init-flags.test.js +++ b/packages/webpack-cli/__tests__/init/coreFlags/init-flags.test.js @@ -1,12 +1,16 @@ /* eslint-disable node/no-unpublished-require */ 'use strict'; -const { run } = require('../../utils/test-utils'); +const { sync: spawnSync } = require('execa'); +const path = require('path'); const firstPrompt = 'Will your application have multiple bundles?'; describe('init with core flags', () => { it('should output help with --help flag', () => { - const { stdout, stderr } = run(__dirname, ['init', '--help'], false); + const { stdout, stderr } = spawnSync(path.resolve(__dirname, '../../bin/cli.js'), ['init', '--help'], { + cwd: path.resolve(__dirname), + reject: false, + }); expect(stdout).toBeTruthy(); expect(stderr).toBeFalsy(); expect(stdout).not.toContain(firstPrompt); diff --git a/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js new file mode 100644 index 00000000000..8545f591b92 --- /dev/null +++ b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js @@ -0,0 +1,73 @@ +/* eslint-disable node/no-unpublished-require */ +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const concat = require('concat-stream'); +const execa = require('execa'); + +const firstPrompt = 'Will your application have multiple bundles?'; +const ENABLE_LOG_COMPILATION = process.env.ENABLE_PIPE || false; + +// To account for node_modules installation +jest.setTimeout(200000); + +function runAndGetWatchProc(testCase, args = []) { + const cwd = path.resolve(testCase); + + const webpackProc = execa(path.resolve(__dirname, '../../bin/cli.js'), args, { + cwd, + reject: false, + stdio: ENABLE_LOG_COMPILATION ? 'inherit' : 'pipe', + }); + + return webpackProc; +} + +const run = async (...answers) => { + const runner = runAndGetWatchProc(__dirname, ['init'], false); + + runner.stdin.setDefaultEncoding('utf-8'); + + // Simulate answers buy sending the answers after waiting for 1s + const simulateAnswers = answers.reduce((prevAnswer, answer) => { + return prevAnswer.then(() => { + return new Promise((resolvePromise) => { + setTimeout(() => { + runner.stdin.write(answer); + resolvePromise(); + }, 1000); + }); + }); + }, Promise.resolve()); + + await simulateAnswers.then(() => { + runner.stdin.end(); + }); + + return new Promise((resolve) => { + runner.stdout.pipe( + concat((result) => { + resolve(result.toString()); + }), + ); + }); +}; + +const ENTER = '\x0D'; + +describe('init', () => { + it('should scaffold when given answers', async () => { + const stdout = await run('N', ENTER, ENTER, ENTER, ENTER, ENTER, ENTER, ENTER); + + expect(stdout).toBeTruthy(); + expect(stdout).toContain(firstPrompt); + + // Test regressively files are scaffolded + const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; + // eslint-disable-next-line prettier/prettier + files.forEach((file) => { + expect(fs.existsSync(path.join(__dirname, file))).toBeTruthy(); + }); + }); +}); From 5f513cb8f3bbfec43fffc7b8b16409380c9c5211 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Sat, 11 Apr 2020 21:18:10 +0530 Subject: [PATCH 09/17] chore: move functions to test utils --- .../__tests__/init/auto/init-auto.test.js | 13 +--- .../init/coreFlags/init-flags.test.js | 8 +-- .../init/generator/init-inquirer.test.js | 52 +--------------- test/init/generator/init-inquirer.test.js | 59 ------------------- test/utils/test-utils.js | 32 ++++++++++ 5 files changed, 39 insertions(+), 125 deletions(-) delete mode 100644 test/init/generator/init-inquirer.test.js diff --git a/packages/webpack-cli/__tests__/init/auto/init-auto.test.js b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js index 32792346090..f37aa2076fb 100644 --- a/packages/webpack-cli/__tests__/init/auto/init-auto.test.js +++ b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js @@ -1,28 +1,21 @@ /* eslint-disable node/no-unpublished-require */ 'use strict'; -const { sync: spawnSync } = require('execa'); -const path = require('path'); const firstPrompt = 'Will your application have multiple bundles?'; const fs = require('fs'); const { join } = require('path'); +const { run } = require('../../../../../test/utils/test-utils'); describe('init auto flag', () => { it('should prompt with w/o auto flag', () => { - const { stdout, stderr } = spawnSync(path.resolve(__dirname, '../../bin/cli.js'), ['init'], { - cwd: path.resolve(__dirname), - reject: false, - }); + const { stdout, stderr } = run(__dirname, ['init'], false); expect(stdout).toBeTruthy(); expect(stderr).toBeFalsy(); expect(stdout).toContain(firstPrompt); }); it('should scaffold and not prompt with auto flag', () => { - const { stdout } = spawnSync(path.resolve(__dirname, '../bin/cli.js'), ['init', '--auto'], { - cwd: path.resolve(__dirname), - reject: false, - }); + const { stdout } = run(__dirname, ['init', '--auto'], false); // Test no prompts are present expect(stdout).toBeTruthy(); expect(stdout).not.toContain(firstPrompt); diff --git a/packages/webpack-cli/__tests__/init/coreFlags/init-flags.test.js b/packages/webpack-cli/__tests__/init/coreFlags/init-flags.test.js index 73918fb2b8a..3ca1f7c73ab 100644 --- a/packages/webpack-cli/__tests__/init/coreFlags/init-flags.test.js +++ b/packages/webpack-cli/__tests__/init/coreFlags/init-flags.test.js @@ -1,16 +1,12 @@ /* eslint-disable node/no-unpublished-require */ 'use strict'; -const { sync: spawnSync } = require('execa'); -const path = require('path'); const firstPrompt = 'Will your application have multiple bundles?'; +const { run } = require('../../../../../test/utils/test-utils'); describe('init with core flags', () => { it('should output help with --help flag', () => { - const { stdout, stderr } = spawnSync(path.resolve(__dirname, '../../bin/cli.js'), ['init', '--help'], { - cwd: path.resolve(__dirname), - reject: false, - }); + const { stdout, stderr } = run(__dirname, ['init', '--help'], false); expect(stdout).toBeTruthy(); expect(stderr).toBeFalsy(); expect(stdout).not.toContain(firstPrompt); diff --git a/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js index 8545f591b92..4aa64eede28 100644 --- a/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js +++ b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js @@ -3,62 +3,14 @@ const fs = require('fs'); const path = require('path'); -const concat = require('concat-stream'); -const execa = require('execa'); - +const { runInitWithAnswers } = require('../../../../../test/utils/test-utils'); const firstPrompt = 'Will your application have multiple bundles?'; -const ENABLE_LOG_COMPILATION = process.env.ENABLE_PIPE || false; - -// To account for node_modules installation -jest.setTimeout(200000); - -function runAndGetWatchProc(testCase, args = []) { - const cwd = path.resolve(testCase); - - const webpackProc = execa(path.resolve(__dirname, '../../bin/cli.js'), args, { - cwd, - reject: false, - stdio: ENABLE_LOG_COMPILATION ? 'inherit' : 'pipe', - }); - - return webpackProc; -} - -const run = async (...answers) => { - const runner = runAndGetWatchProc(__dirname, ['init'], false); - - runner.stdin.setDefaultEncoding('utf-8'); - - // Simulate answers buy sending the answers after waiting for 1s - const simulateAnswers = answers.reduce((prevAnswer, answer) => { - return prevAnswer.then(() => { - return new Promise((resolvePromise) => { - setTimeout(() => { - runner.stdin.write(answer); - resolvePromise(); - }, 1000); - }); - }); - }, Promise.resolve()); - - await simulateAnswers.then(() => { - runner.stdin.end(); - }); - - return new Promise((resolve) => { - runner.stdout.pipe( - concat((result) => { - resolve(result.toString()); - }), - ); - }); -}; const ENTER = '\x0D'; describe('init', () => { it('should scaffold when given answers', async () => { - const stdout = await run('N', ENTER, ENTER, ENTER, ENTER, ENTER, ENTER, ENTER); + const stdout = await runInitWithAnswers(__dirname, ['N', ENTER, ENTER, ENTER, ENTER, ENTER, ENTER, ENTER]); expect(stdout).toBeTruthy(); expect(stdout).toContain(firstPrompt); diff --git a/test/init/generator/init-inquirer.test.js b/test/init/generator/init-inquirer.test.js deleted file mode 100644 index 2299126f486..00000000000 --- a/test/init/generator/init-inquirer.test.js +++ /dev/null @@ -1,59 +0,0 @@ -/* eslint-disable node/no-unpublished-require */ -'use strict'; - -const fs = require('fs'); -const { join } = require('path'); -const concat = require('concat-stream'); -const { runAndGetWatchProc } = require('../../utils/test-utils'); - -const firstPrompt = 'Will your application have multiple bundles?'; -// To account for node_modules installation -jest.setTimeout(200000); - -const run = async (...answers) => { - const runner = runAndGetWatchProc(__dirname, ['init'], false); - - runner.stdin.setDefaultEncoding('utf-8'); - - // Simulate answers buy sending the answers after waiting for 1s - const simulateAnswers = answers.reduce((prevAnswer, answer) => { - return prevAnswer.then(() => { - return new Promise((resolvePromise) => { - setTimeout(() => { - runner.stdin.write(answer); - resolvePromise(); - }, 1000); - }); - }); - }, Promise.resolve()); - - await simulateAnswers.then(() => { - runner.stdin.end(); - }); - - return new Promise((resolve) => { - runner.stdout.pipe( - concat((result) => { - resolve(result.toString()); - }), - ); - }); -}; - -const ENTER = '\x0D'; - -describe('init', () => { - it('should scaffold when given answers', async () => { - const stdout = await run('N', ENTER, ENTER, ENTER, ENTER, ENTER, ENTER, ENTER); - - expect(stdout).toBeTruthy(); - expect(stdout).toContain(firstPrompt); - - // Test regressively files are scaffolded - const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; - // eslint-disable-next-line prettier/prettier - files.forEach((file) => { - expect(fs.existsSync(join(__dirname, file))).toBeTruthy(); - }); - }); -}); diff --git a/test/utils/test-utils.js b/test/utils/test-utils.js index 0380513103e..cfe19d87c1c 100644 --- a/test/utils/test-utils.js +++ b/test/utils/test-utils.js @@ -4,6 +4,8 @@ const fs = require('fs'); const execa = require('execa'); const { sync: spawnSync } = execa; const { Writable } = require('readable-stream'); +const concat = require('concat-stream'); + const WEBPACK_PATH = path.resolve(__dirname, '../../packages/webpack-cli/bin/cli.js'); const ENABLE_LOG_COMPILATION = process.env.ENABLE_PIPE || false; @@ -80,6 +82,35 @@ function runAndGetWatchProc(testCase, args = [], setOutput = true) { return webpackProc; } +const runInitWithAnswers = async (location, answers) => { + const runner = runAndGetWatchProc(location, ['init'], false); + runner.stdin.setDefaultEncoding('utf-8'); + + // Simulate answers buy sending the answers after waiting for 1s + const simulateAnswers = answers.reduce((prevAnswer, answer) => { + return prevAnswer.then(() => { + return new Promise((resolvePromise) => { + setTimeout(() => { + runner.stdin.write(answer); + resolvePromise(); + }, 1000); + }); + }); + }, Promise.resolve()); + + await simulateAnswers.then(() => { + runner.stdin.end(); + }); + + return new Promise((resolve) => { + runner.stdout.pipe( + concat((result) => { + resolve(result.toString()); + }), + ); + }); +}; + function extractSummary(stdout) { if (stdout === '') { return ''; @@ -195,6 +226,7 @@ module.exports = { runWatch, runAndGetWatchProc, extractSummary, + runInitWithAnswers, appendDataIfFileExists, copyFile, copyFileAsync, From 1584c3e72ab0c8c573ea37f7de64d8ca910c9959 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Mon, 13 Apr 2020 10:37:23 +0530 Subject: [PATCH 10/17] chore: add timeout --- .../webpack-cli/__tests__/init/generator/init-inquirer.test.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js index 4aa64eede28..d554ccecb1e 100644 --- a/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js +++ b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js @@ -8,6 +8,8 @@ const firstPrompt = 'Will your application have multiple bundles?'; const ENTER = '\x0D'; +jest.setTimeout(200000); + describe('init', () => { it('should scaffold when given answers', async () => { const stdout = await runInitWithAnswers(__dirname, ['N', ENTER, ENTER, ENTER, ENTER, ENTER, ENTER, ENTER]); From 4aa81133a20da3896c230fd32298b42f1c3a7520 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Mon, 13 Apr 2020 11:11:43 +0530 Subject: [PATCH 11/17] chore: use webpack-cli gitignore --- .gitignore | 3 --- packages/webpack-cli/.gitignore | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index b4c54e9568e..cac442b27ff 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,3 @@ packages/**/*.map # temporary test files test-assets/ -# ignore scaffolded files due to tests of init -test/init/* -!test/init/**/*.test.js diff --git a/packages/webpack-cli/.gitignore b/packages/webpack-cli/.gitignore index 6cdf0169865..39454064e96 100644 --- a/packages/webpack-cli/.gitignore +++ b/packages/webpack-cli/.gitignore @@ -47,3 +47,7 @@ junit.xml #typescript source maps packages/**/*.map + +# ignore scaffolded files due to tests of init +__tests__/init/* +!__tests__/init/**/*.test.js From afb28c0231844daa412b03168f4be455847c5b22 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Tue, 14 Apr 2020 16:54:19 +0530 Subject: [PATCH 12/17] chore: try debugging macos --- packages/webpack-cli/__tests__/init/auto/init-auto.test.js | 1 + .../webpack-cli/__tests__/init/generator/init-inquirer.test.js | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/webpack-cli/__tests__/init/auto/init-auto.test.js b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js index f37aa2076fb..37d43b5ed44 100644 --- a/packages/webpack-cli/__tests__/init/auto/init-auto.test.js +++ b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js @@ -24,6 +24,7 @@ describe('init auto flag', () => { const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; // eslint-disable-next-line prettier/prettier files.forEach((file) => { + console.log(file); // Debug comment expect(fs.existsSync(join(__dirname, file))).toBeTruthy(); }); }); diff --git a/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js index d554ccecb1e..ec694d4ee9e 100644 --- a/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js +++ b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js @@ -21,6 +21,7 @@ describe('init', () => { const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; // eslint-disable-next-line prettier/prettier files.forEach((file) => { + console.log(file); // Debug comment expect(fs.existsSync(path.join(__dirname, file))).toBeTruthy(); }); }); From 3fdea19083cc72c52a283cd5db1b304321e61c22 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Tue, 14 Apr 2020 17:23:22 +0530 Subject: [PATCH 13/17] chore: skip one test for debug --- packages/webpack-cli/__tests__/init/auto/init-auto.test.js | 2 +- .../webpack-cli/__tests__/init/generator/init-inquirer.test.js | 3 +++ test/utils/test-utils.js | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/webpack-cli/__tests__/init/auto/init-auto.test.js b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js index 37d43b5ed44..b34fac15eb4 100644 --- a/packages/webpack-cli/__tests__/init/auto/init-auto.test.js +++ b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js @@ -14,7 +14,7 @@ describe('init auto flag', () => { expect(stdout).toContain(firstPrompt); }); - it('should scaffold and not prompt with auto flag', () => { + it.skip('should scaffold and not prompt with auto flag', () => { const { stdout } = run(__dirname, ['init', '--auto'], false); // Test no prompts are present expect(stdout).toBeTruthy(); diff --git a/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js index ec694d4ee9e..f06b51d87d8 100644 --- a/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js +++ b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js @@ -17,6 +17,9 @@ describe('init', () => { expect(stdout).toBeTruthy(); expect(stdout).toContain(firstPrompt); + console.log(stdout); + console.log(fs.readdirSync(__dirname)); + // Test regressively files are scaffolded const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; // eslint-disable-next-line prettier/prettier diff --git a/test/utils/test-utils.js b/test/utils/test-utils.js index cfe19d87c1c..301dababa34 100644 --- a/test/utils/test-utils.js +++ b/test/utils/test-utils.js @@ -93,7 +93,7 @@ const runInitWithAnswers = async (location, answers) => { setTimeout(() => { runner.stdin.write(answer); resolvePromise(); - }, 1000); + }, 2000); }); }); }, Promise.resolve()); From 6e0a3c03f9ed9980252755ccd5569c918aa5b3b6 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Tue, 14 Apr 2020 17:34:26 +0530 Subject: [PATCH 14/17] chore: remove skip --- packages/webpack-cli/__tests__/init/auto/init-auto.test.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/webpack-cli/__tests__/init/auto/init-auto.test.js b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js index b34fac15eb4..9ceec465615 100644 --- a/packages/webpack-cli/__tests__/init/auto/init-auto.test.js +++ b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js @@ -6,6 +6,7 @@ const fs = require('fs'); const { join } = require('path'); const { run } = require('../../../../../test/utils/test-utils'); +jest.setTimeout(200000); describe('init auto flag', () => { it('should prompt with w/o auto flag', () => { const { stdout, stderr } = run(__dirname, ['init'], false); @@ -14,12 +15,15 @@ describe('init auto flag', () => { expect(stdout).toContain(firstPrompt); }); - it.skip('should scaffold and not prompt with auto flag', () => { + it('should scaffold and not prompt with auto flag', () => { const { stdout } = run(__dirname, ['init', '--auto'], false); // Test no prompts are present expect(stdout).toBeTruthy(); expect(stdout).not.toContain(firstPrompt); + console.log(stdout); + console.log(fs.readdirSync(__dirname)); + // Test regressively files are scaffolded const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; // eslint-disable-next-line prettier/prettier From 9600bfb3d5113aeb3dc3eecfe37903b8c640c848 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Tue, 14 Apr 2020 17:44:41 +0530 Subject: [PATCH 15/17] chore: remove debug logs --- packages/webpack-cli/__tests__/init/auto/init-auto.test.js | 4 ---- .../__tests__/init/generator/init-inquirer.test.js | 4 ---- 2 files changed, 8 deletions(-) diff --git a/packages/webpack-cli/__tests__/init/auto/init-auto.test.js b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js index 9ceec465615..408c7ae5cd2 100644 --- a/packages/webpack-cli/__tests__/init/auto/init-auto.test.js +++ b/packages/webpack-cli/__tests__/init/auto/init-auto.test.js @@ -21,14 +21,10 @@ describe('init auto flag', () => { expect(stdout).toBeTruthy(); expect(stdout).not.toContain(firstPrompt); - console.log(stdout); - console.log(fs.readdirSync(__dirname)); - // Test regressively files are scaffolded const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; // eslint-disable-next-line prettier/prettier files.forEach((file) => { - console.log(file); // Debug comment expect(fs.existsSync(join(__dirname, file))).toBeTruthy(); }); }); diff --git a/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js index f06b51d87d8..d554ccecb1e 100644 --- a/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js +++ b/packages/webpack-cli/__tests__/init/generator/init-inquirer.test.js @@ -17,14 +17,10 @@ describe('init', () => { expect(stdout).toBeTruthy(); expect(stdout).toContain(firstPrompt); - console.log(stdout); - console.log(fs.readdirSync(__dirname)); - // Test regressively files are scaffolded const files = ['./sw.js', './package.json', './yarn.lock', './src/index.js']; // eslint-disable-next-line prettier/prettier files.forEach((file) => { - console.log(file); // Debug comment expect(fs.existsSync(path.join(__dirname, file))).toBeTruthy(); }); }); From 7a5d4b280f59b5a098799f0554ad5c4895496e10 Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Thu, 16 Apr 2020 19:51:58 +0530 Subject: [PATCH 16/17] chore: correct typo --- test/utils/test-utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/utils/test-utils.js b/test/utils/test-utils.js index 301dababa34..ea3ee24c043 100644 --- a/test/utils/test-utils.js +++ b/test/utils/test-utils.js @@ -86,7 +86,7 @@ const runInitWithAnswers = async (location, answers) => { const runner = runAndGetWatchProc(location, ['init'], false); runner.stdin.setDefaultEncoding('utf-8'); - // Simulate answers buy sending the answers after waiting for 1s + // Simulate answers by sending the answers after waiting for 1s const simulateAnswers = answers.reduce((prevAnswer, answer) => { return prevAnswer.then(() => { return new Promise((resolvePromise) => { From f56fc0df0cb8395f2d9c712c7edc133847b45d5f Mon Sep 17 00:00:00 2001 From: Rishabh Chawla Date: Thu, 16 Apr 2020 20:01:59 +0530 Subject: [PATCH 17/17] chore: add jsdoc comment --- test/utils/test-utils.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/utils/test-utils.js b/test/utils/test-utils.js index ec144d937b3..fb7418dc78f 100644 --- a/test/utils/test-utils.js +++ b/test/utils/test-utils.js @@ -81,12 +81,16 @@ function runAndGetWatchProc(testCase, args = [], setOutput = true) { return webpackProc; } - +/** + * runInitWithAnswers + * @param {string} location location of current working directory + * @param {string[]} answers answers to be passed to stdout for inquirer question + */ const runInitWithAnswers = async (location, answers) => { const runner = runAndGetWatchProc(location, ['init'], false); runner.stdin.setDefaultEncoding('utf-8'); - // Simulate answers by sending the answers after waiting for 1s + // Simulate answers by sending the answers after waiting for 2s const simulateAnswers = answers.reduce((prevAnswer, answer) => { return prevAnswer.then(() => { return new Promise((resolvePromise) => {