diff --git a/client-src/default/overlay.js b/client-src/default/overlay.js
index afe1c31788..39963a246b 100644
--- a/client-src/default/overlay.js
+++ b/client-src/default/overlay.js
@@ -5,7 +5,6 @@ import ansiHTML from 'ansi-html';
import { AllHtmlEntities as Entities } from 'html-entities';
const entities = new Entities();
-
const colors = {
reset: ['transparent', 'transparent'],
black: '181818',
@@ -95,7 +94,7 @@ function ensureOverlayDivExists(onOverlayDivReady) {
}
// Successful compilation.
-function clear() {
+export function clear() {
if (!overlayDiv) {
// It is not there in the first place.
return;
@@ -108,12 +107,14 @@ function clear() {
lastOnOverlayDivReady = null;
}
-// Successful compilation.
-export function clear() {
- destroyErrorOverlay();
-}
-
// Compilation with errors (e.g. syntax error or missing modules).
export function showMessage(messages) {
- showMessageOverlay(messages[0]);
+ ensureOverlayDivExists((div) => {
+ // Make it look similar to our terminal.
+ div.innerHTML = `Failed to compile.
${ansiHTML(
+ entities.encode(messages[0])
+ )}`;
+ });
}
diff --git a/package-lock.json b/package-lock.json
index 9dbfaea145..dfe6707782 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,13 +26,15 @@
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
"integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
- "dev": true
+ "dev": true,
+ "optional": true
},
"chokidar": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz",
"integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==",
"dev": true,
+ "optional": true,
"requires": {
"anymatch": "^2.0.0",
"async-each": "^1.0.1",
@@ -53,6 +55,7 @@
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
"integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
"dev": true,
+ "optional": true,
"requires": {
"binary-extensions": "^1.0.0"
}
@@ -62,6 +65,7 @@
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
"integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
"dev": true,
+ "optional": true,
"requires": {
"graceful-fs": "^4.1.11",
"micromatch": "^3.1.10",
@@ -5456,6 +5460,7 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
+ "dev": true,
"optional": true
},
"concat-map": {
@@ -5928,6 +5933,7 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
+ "dev": true,
"optional": true
},
"yallist": {
@@ -9216,10 +9222,10 @@
}
}
},
- "opn": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
- "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+ "open": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-6.3.0.tgz",
+ "integrity": "sha512-6AHdrJxPvAXIowO/aIaeHZ8CeMdDf7qCyRNq8NwJpinmCdXhz+NZR7ie1Too94lpciCDsG+qHGO9Mt0svA4OqA==",
"requires": {
"is-wsl": "^1.1.0"
}
diff --git a/test/Server.test.js b/test/Server.test.js
deleted file mode 100644
index 60ae05731e..0000000000
--- a/test/Server.test.js
+++ /dev/null
@@ -1,503 +0,0 @@
-'use strict';
-
-const { relative, sep } = require('path');
-const webpack = require('webpack');
-const request = require('supertest');
-// Mock open before loading Server
-jest.mock('open');
-// eslint-disable-next-line import/newline-after-import
-const open = require('open');
-open.mockImplementation(() => {
- return {
- catch: jest.fn(),
- };
-});
-jest.mock('sockjs/lib/transport');
-// eslint-disable-next-line import/newline-after-import
-const sockjs = require('sockjs/lib/transport');
-const Server = require('../lib/Server');
-const config = require('./fixtures/simple-config/webpack.config');
-const testServer = require('./helpers/test-server');
-
-describe('Server', () => {
- describe('sockjs', () => {
- it('add decorateConnection', () => {
- expect(typeof sockjs.Session.prototype.decorateConnection).toEqual(
- 'function'
- );
- });
- });
-
- describe('addEntries', () => {
- it('add hot option', (done) => {
- const compiler = webpack(config);
- const server = new Server(compiler, {
- hot: true,
- });
-
- expect(
- server.middleware.context.compiler.options.entry.map((p) => {
- return relative('.', p).split(sep);
- })
- ).toMatchSnapshot();
- expect(
- server.middleware.context.compiler.options.plugins
- ).toMatchSnapshot();
-
- compiler.hooks.done.tap('webpack-dev-server', () => {
- server.close(done);
- });
-
- compiler.run(() => {});
- });
-
- it('add hotOnly option', (done) => {
- const compiler = webpack(config);
- const server = new Server(compiler, {
- hotOnly: true,
- });
-
- expect(
- server.middleware.context.compiler.options.entry.map((p) => {
- return relative('.', p).split(sep);
- })
- ).toMatchSnapshot();
- expect(
- server.middleware.context.compiler.options.plugins
- ).toMatchSnapshot();
-
- compiler.hooks.done.tap('webpack-dev-server', () => {
- server.close(done);
- });
-
- compiler.run(() => {});
- });
- });
-
- // issue: https://github.com/webpack/webpack-dev-server/issues/1724
- describe('express.static.mine.types', () => {
- beforeEach(() => {
- jest.resetModules();
- });
-
- afterEach(() => {
- jest.unmock('express');
- });
-
- it("should success even if mine.types doesn't exist", (done) => {
- jest.mock('express', () => {
- const data = jest.requireActual('express');
- const { static: st } = data;
- const { mime } = st;
-
- delete mime.types;
-
- expect(typeof mime.types).toEqual('undefined');
-
- return Object.assign(data, {
- static: Object.assign(st, {
- mime,
- }),
- });
- });
-
- const compiler = webpack(config);
- const server = new Server(compiler);
-
- compiler.hooks.done.tap('webpack-dev-server', (s) => {
- const output = server.getStats(s);
- expect(output.errors.length).toEqual(0);
-
- server.close(done);
- });
-
- compiler.run(() => {});
- server.listen(8080, 'localhost');
- });
- });
-
- describe('stats', () => {
- it(`should works with difference stats values (contains 'hash', 'assets', 'warnings' and 'errors')`, () => {
- const allStats = [
- {},
- // eslint-disable-next-line no-undefined
- undefined,
- false,
- 'errors-only',
- {
- assets: false,
- },
- ];
-
- return allStats.reduce((p, stats) => {
- return p.then(() => {
- return new Promise((resolve) => {
- const compiler = webpack(config);
- const server = new Server(compiler, { stats });
-
- compiler.hooks.done.tap('webpack-dev-server', (s) => {
- expect(Object.keys(server.getStats(s))).toMatchSnapshot();
-
- server.close(resolve);
- });
-
- compiler.run(() => {});
- server.listen(8080, 'localhost');
- });
- });
- }, Promise.resolve());
- });
-
- it('should respect warningsFilter', (done) => {
- const compiler = webpack(config);
- const server = new Server(compiler, {
- stats: { warningsFilter: 'test' },
- });
-
- compiler.hooks.done.tap('webpack-dev-server', (s) => {
- s.compilation.warnings = ['test', 'another warning'];
-
- const output = server.getStats(s);
-
- expect(output.warnings.length).toBe(1);
- expect(output.warnings[0]).toBe('another warning');
-
- server.close(done);
- });
-
- compiler.run(() => {});
- server.listen(8080, 'localhost');
- });
-
- it('should open', (done) => {
- const compiler = webpack(config);
- const server = new Server(compiler, {
- open: true,
- });
-
- compiler.hooks.done.tap('webpack-dev-server', () => {
- expect(open.mock.calls[0]).toEqual(['http://localhost:8080/', {}]);
- expect(open.mock.invocationCallOrder[0]).toEqual(1);
- server.close(done);
- });
-
- compiler.run(() => {});
- server.listen(8080, 'localhost');
- });
- });
-
- describe('host', () => {
- let server = null;
- let req = null;
-
- describe('is not be specified', () => {
- beforeAll((done) => {
- server = testServer.start(config, {}, done);
- req = request(server.app);
- });
-
- it('server address', () => {
- const address = server.listeningApp.address();
-
- expect(address.address).toBe('127.0.0.1');
- expect(address.port).toBe(8080);
- });
-
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
- });
-
- afterAll(testServer.close);
- });
-
- describe('is undefined', () => {
- beforeAll((done) => {
- server = testServer.start(
- config,
- {
- // eslint-disable-next-line no-undefined
- host: undefined,
- },
- done
- );
- req = request(server.app);
- });
-
- it('server address', () => {
- const address = server.listeningApp.address();
-
- expect(address.address).toBe('::');
- expect(address.port).toBe(8080);
- });
-
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
- });
-
- afterAll(testServer.close);
- });
-
- describe('is null', () => {
- beforeAll((done) => {
- server = testServer.start(
- config,
- {
- host: null,
- },
- done
- );
- req = request(server.app);
- });
-
- it('server address', () => {
- const address = server.listeningApp.address();
-
- expect(address.address).toBe('::');
- expect(address.port).toBe(8080);
- });
-
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
- });
-
- afterAll(testServer.close);
- });
-
- describe('is 127.0.0.1 (IPv4)', () => {
- beforeAll((done) => {
- server = testServer.start(
- config,
- {
- host: '127.0.0.1',
- },
- done
- );
- req = request(server.app);
- });
-
- it('server address', () => {
- const address = server.listeningApp.address();
-
- expect(address.address).toBe('127.0.0.1');
- expect(address.port).toBe(8080);
- });
-
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
- });
-
- afterAll(testServer.close);
- });
-
- describe('is localhost', () => {
- beforeAll((done) => {
- server = testServer.start(
- config,
- {
- host: 'localhost',
- },
- done
- );
- req = request(server.app);
- });
-
- it('server address', () => {
- const address = server.listeningApp.address();
-
- expect(address.address).toBe('127.0.0.1');
- expect(address.port).toBe(8080);
- });
-
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
- });
-
- afterAll(testServer.close);
- });
-
- describe('is 0.0.0.0', () => {
- beforeAll((done) => {
- server = testServer.start(
- config,
- {
- host: '0.0.0.0',
- },
- done
- );
- req = request(server.app);
- });
-
- it('server address', () => {
- const address = server.listeningApp.address();
-
- expect(address.address).toBe('0.0.0.0');
- expect(address.port).toBe(8080);
- });
-
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
- });
-
- afterAll(testServer.close);
- });
- });
-
- describe('port', () => {
- let server = null;
- let req = null;
-
- describe('is not be specified', () => {
- beforeAll((done) => {
- server = testServer.start(config, {}, done);
- req = request(server.app);
- });
-
- it('server address', () => {
- const address = server.listeningApp.address();
-
- expect(address.address).toBe('127.0.0.1');
- // Random port
- expect(address.port).toBeDefined();
- });
-
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
- });
-
- afterAll(testServer.close);
- });
-
- describe('is undefined', () => {
- beforeAll((done) => {
- server = testServer.start(
- config,
- {
- // eslint-disable-next-line no-undefined
- port: undefined,
- },
- done
- );
- req = request(server.app);
- });
-
- it('server address', () => {
- const address = server.listeningApp.address();
-
- expect(address.address).toBe('127.0.0.1');
- // Random port
- expect(address.port).toBeDefined();
- });
-
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
- });
-
- afterAll(testServer.close);
- });
-
- describe('is null', () => {
- beforeAll((done) => {
- server = testServer.start(
- config,
- {
- port: null,
- },
- done
- );
- req = request(server.app);
- });
-
- it('server address', () => {
- const address = server.listeningApp.address();
-
- expect(address.address).toBe('127.0.0.1');
- // Random port
- expect(address.port).toBeDefined();
- });
-
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
- });
-
- afterAll(testServer.close);
- });
-
- describe('is "33333"', () => {
- beforeAll((done) => {
- server = testServer.start(
- config,
- {
- port: '33333',
- },
- done
- );
- req = request(server.app);
- });
-
- it('server address', () => {
- const address = server.listeningApp.address();
-
- expect(address.address).toBe('127.0.0.1');
- expect(address.port).toBe(33333);
- });
-
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
- });
-
- afterAll(testServer.close);
- });
-
- describe('is 33333', () => {
- beforeAll((done) => {
- server = testServer.start(
- config,
- {
- port: '33333',
- },
- done
- );
- req = request(server.app);
- });
-
- it('server address', () => {
- const address = server.listeningApp.address();
-
- expect(address.address).toBe('127.0.0.1');
- expect(address.port).toBe(33333);
- });
-
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
- });
-
- afterAll(testServer.close);
- });
- });
-
- describe('WEBPACK_DEV_SERVER environment variable', () => {
- const OLD_ENV = process.env;
-
- beforeEach(() => {
- // this is important - it clears the cache
- jest.resetModules();
-
- process.env = { ...OLD_ENV };
-
- delete process.env.WEBPACK_DEV_SERVER;
- });
-
- afterEach(() => {
- process.env = OLD_ENV;
- });
-
- it('should be present', () => {
- expect(process.env.WEBPACK_DEV_SERVER).toBeUndefined();
-
- // eslint-disable-next-line global-require
- require('../lib/Server');
-
- expect(process.env.WEBPACK_DEV_SERVER).toBe(true);
- });
- });
-});
diff --git a/test/__snapshots__/Server.test.js.snap b/test/__snapshots__/Server.test.js.snap
deleted file mode 100644
index afd2139df5..0000000000
--- a/test/__snapshots__/Server.test.js.snap
+++ /dev/null
@@ -1,116 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`Server addEntries add hot option 1`] = `
-Array [
- Array [
- "client",
- "index.js?http:",
- "localhost",
- ],
- Array [
- "node_modules",
- "webpack",
- "hot",
- "dev-server.js",
- ],
- Array [
- "foo.js",
- ],
-]
-`;
-
-exports[`Server addEntries add hot option 2`] = `
-Array [
- HotModuleReplacementPlugin {
- "fullBuildTimeout": 200,
- "multiStep": undefined,
- "options": Object {},
- "requestTimeout": 10000,
- },
-]
-`;
-
-exports[`Server addEntries add hotOnly option 1`] = `
-Array [
- Array [
- "client",
- "index.js?http:",
- "localhost",
- ],
- Array [
- "node_modules",
- "webpack",
- "hot",
- "only-dev-server.js",
- ],
- Array [
- "foo.js",
- ],
-]
-`;
-
-exports[`Server addEntries add hotOnly option 2`] = `
-Array [
- HotModuleReplacementPlugin {
- "fullBuildTimeout": 200,
- "multiStep": undefined,
- "options": Object {},
- "requestTimeout": 10000,
- },
-]
-`;
-
-exports[`Server stats should works with difference stats values (contains 'hash', 'assets', 'warnings' and 'errors') 1`] = `
-Array [
- "errors",
- "warnings",
- "hash",
- "assetsByChunkName",
- "assets",
- "filteredAssets",
-]
-`;
-
-exports[`Server stats should works with difference stats values (contains 'hash', 'assets', 'warnings' and 'errors') 2`] = `
-Array [
- "errors",
- "warnings",
- "hash",
- "assetsByChunkName",
- "assets",
- "filteredAssets",
-]
-`;
-
-exports[`Server stats should works with difference stats values (contains 'hash', 'assets', 'warnings' and 'errors') 3`] = `
-Array [
- "errors",
- "warnings",
- "hash",
- "assetsByChunkName",
- "assets",
- "filteredAssets",
-]
-`;
-
-exports[`Server stats should works with difference stats values (contains 'hash', 'assets', 'warnings' and 'errors') 4`] = `
-Array [
- "errors",
- "warnings",
- "hash",
- "assetsByChunkName",
- "assets",
- "filteredAssets",
-]
-`;
-
-exports[`Server stats should works with difference stats values (contains 'hash', 'assets', 'warnings' and 'errors') 5`] = `
-Array [
- "errors",
- "warnings",
- "hash",
- "assetsByChunkName",
- "assets",
- "filteredAssets",
-]
-`;
diff --git a/test/cli/cli.test.js b/test/cli/cli.test.js
index 8bd1e04ddd..404cff789c 100644
--- a/test/cli/cli.test.js
+++ b/test/cli/cli.test.js
@@ -1,8 +1,8 @@
'use strict';
-const { unlink } = require('fs');
const { join, resolve } = require('path');
const execa = require('execa');
+const { unlinkAsync } = require('../helpers/fs');
const testBin = require('../helpers/test-bin');
const httpsCertificateDirectory = resolve(
@@ -15,108 +15,74 @@ const keyPath = resolve(httpsCertificateDirectory, 'server.key');
const certPath = resolve(httpsCertificateDirectory, 'server.crt');
describe('CLI', () => {
- it('--progress', (done) => {
- testBin('--progress')
- .then((output) => {
- expect(output.code).toEqual(0);
- expect(output.stderr.includes('0% compiling')).toBe(true);
- done();
- })
- .catch(done);
+ it('--progress', async () => {
+ const { code, stderr } = await testBin('--progress');
+ expect(code).toEqual(0);
+ expect(stderr.includes('0% compiling')).toBe(true);
});
- it('--bonjour', (done) => {
- testBin('--bonjour')
- .then((output) => {
- expect(output.code).toEqual(0);
- expect(output.stdout.includes('Bonjour')).toBe(true);
- done();
- })
- .catch(done);
+ it('--bonjour', async () => {
+ const { code, stdout } = await testBin('--bonjour');
+ expect(code).toEqual(0);
+ expect(stdout.includes('Bonjour')).toBe(true);
});
- it('--https', (done) => {
- testBin('--https')
- .then((output) => {
- expect(output.code).toEqual(0);
- expect(output.stdout.includes('Project is running at')).toBe(true);
- done();
- })
- .catch(done);
+ it('--https', async () => {
+ const { code, stdout } = await testBin('--https');
+ expect(code).toEqual(0);
+ expect(stdout.includes('Project is running at')).toBe(true);
});
- it('--https --cacert --pfx --key --cert --pfx-passphrase', (done) => {
- testBin(
+ it('--https --cacert --pfx --key --cert --pfx-passphrase', async () => {
+ const { code, stdout } = await testBin(
`--https --cacert ${caPath} --pfx ${pfxPath} --key ${keyPath} --cert ${certPath} --pfx-passphrase webpack-dev-server`
- )
- .then((output) => {
- expect(output.code).toEqual(0);
- expect(output.stdout.includes('Project is running at')).toBe(true);
- done();
- })
- .catch(done);
+ );
+ expect(code).toEqual(0);
+ expect(stdout.includes('Project is running at')).toBe(true);
});
- it('--sockPath', (done) => {
- testBin('--sockPath /mysockPath')
- .then((output) => {
- expect(
- output.stdout.includes('http://localhost&sockPath=/mysockPath')
- ).toEqual(true);
- done();
- })
- .catch(done);
+ it('--sockPath', async () => {
+ const { stdout } = await testBin('--sockPath /mysockPath');
+ expect(stdout.includes('http://localhost&sockPath=/mysockPath')).toBe(true);
});
- it('--color', (done) => {
- testBin('--color')
- .then((output) => {
- // https://github.com/webpack/webpack-dev-server/blob/master/lib/utils/colors.js
- expect(
- output.stdout.includes('\u001b[39m \u001b[90m「wds」\u001b[39m:')
- ).toEqual(true);
- done();
- })
- .catch(done);
+ it('--color', async () => {
+ const { stdout } = await testBin('--color');
+ // https://github.com/webpack/webpack-dev-server/blob/master/lib/utils/colors.js
+ expect(stdout.includes('\u001b[39m \u001b[90m「wds」\u001b[39m:')).toBe(true);
});
// The Unix socket to listen to (instead of a host).
- it('--socket', (done) => {
+ it('--socket', async () => {
const socketPath = join('.', 'webpack.sock');
+ const { code, stdout } = await testBin(`--socket ${socketPath}`);
+ expect(code).toEqual(0);
- testBin(`--socket ${socketPath}`)
- .then((output) => {
- expect(output.code).toEqual(0);
-
- if (process.platform === 'win32') {
- done();
- } else {
- expect(output.stdout.includes(socketPath)).toBe(true);
-
- unlink(socketPath, () => {
- done();
- });
- }
- })
- .catch(done);
+ if (process.platform !== 'win32') {
+ expect(stdout.includes(socketPath)).toBe(true);
+
+ await unlinkAsync(socketPath);
+ }
});
- it('should accept the promise function of webpack.config.js', (done) => {
- testBin(
- false,
- resolve(__dirname, '../fixtures/promise-config/webpack.config.js')
- )
- .then((output) => {
- expect(output.code).toEqual(0);
- done();
- })
- .catch((err) => {
- // for windows
- expect(err.stdout.includes('Compiled successfully.')).toEqual(true);
- done();
- });
+ it('should accept the promise function of webpack.config.js', async () => {
+ try {
+ const { code } = await testBin(
+ false,
+ resolve(__dirname, '../fixtures/promise-config/webpack.config.js')
+ );
+ expect(code).toEqual(0);
+ } catch (err) {
+ // for windows
+ if (process.platform === 'win32') {
+ expect(err.stdout.includes('Compiled successfully.')).toBe(true);
+ } else {
+ throw err;
+ }
+ }
});
+ // TODO: hiroppy
it('should exit the process when SIGINT is detected', (done) => {
const cliPath = resolve(__dirname, '../../bin/webpack-dev-server.js');
const examplePath = resolve(__dirname, '../../examples/cli/public');
diff --git a/test/client/clients/SockJSClient.test.js b/test/client/clients/SockJSClient.test.js
index a5b667c03a..62817459da 100644
--- a/test/client/clients/SockJSClient.test.js
+++ b/test/client/clients/SockJSClient.test.js
@@ -4,6 +4,7 @@ const http = require('http');
const express = require('express');
const sockjs = require('sockjs');
const SockJSClient = require('../../../client-src/clients/SockJSClient');
+const timer = require('../../helpers/timer');
const port = require('../../ports-map').sockJSClient;
describe('SockJSClient', () => {
@@ -25,13 +26,12 @@ describe('SockJSClient', () => {
});
describe('client', () => {
- it('should open, receive message, and close', (done) => {
- socketServer.on('connection', (connection) => {
+ it('should open, receive message, and close', async () => {
+ socketServer.on('connection', async (connection) => {
connection.write('hello world');
- setTimeout(() => {
- connection.close();
- }, 1000);
+ await timer(1000);
+ connection.close();
});
const client = new SockJSClient(`http://localhost:${port}/sockjs-node`);
@@ -47,19 +47,16 @@ describe('SockJSClient', () => {
data.push(msg);
});
- setTimeout(() => {
- expect(data.length).toEqual(3);
- expect(data[0]).toEqual('open');
- expect(data[1]).toEqual('hello world');
- expect(data[2]).toEqual('close');
- done();
- }, 3000);
+ await timer(3000);
+
+ expect(data.length).toEqual(3);
+ expect(data[0]).toEqual('open');
+ expect(data[1]).toEqual('hello world');
+ expect(data[2]).toEqual('close');
});
});
afterAll((done) => {
- listeningApp.close(() => {
- done();
- });
+ listeningApp.close(done);
});
});
diff --git a/test/helpers/fs.js b/test/helpers/fs.js
new file mode 100644
index 0000000000..d715846748
--- /dev/null
+++ b/test/helpers/fs.js
@@ -0,0 +1,15 @@
+// we'll delete this file when Node8 is not supported.
+// because we can use fs.promise
+
+'use strict';
+
+const { promisify } = require('util');
+const { writeFile, unlink } = require('fs');
+
+const unlinkAsync = promisify(unlink);
+const writeAsync = promisify(writeFile);
+
+module.exports = {
+ unlinkAsync,
+ writeAsync,
+};
diff --git a/test/helpers/run-browser.js b/test/helpers/run-browser.js
index 53993d88d1..9e36ca5d11 100644
--- a/test/helpers/run-browser.js
+++ b/test/helpers/run-browser.js
@@ -2,7 +2,7 @@
const puppeteer = require('puppeteer');
-function runBrowser(config) {
+async function runBrowser(config) {
const options = {
viewport: {
width: 500,
@@ -12,26 +12,15 @@ function runBrowser(config) {
...config,
};
- return new Promise((resolve, reject) => {
- let page;
- let browser;
-
- puppeteer
- .launch({
- headless: true,
- args: ['--no-sandbox', '--disable-setuid-sandbox'],
- })
- .then((launchedBrowser) => {
- browser = launchedBrowser;
- return browser.newPage();
- })
- .then((newPage) => {
- page = newPage;
- page.emulate(options);
- resolve({ page, browser });
- })
- .catch(reject);
+ const launchedBrowser = await puppeteer.launch({
+ headless: true,
+ args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
+ const browser = launchedBrowser;
+ const page = await browser.newPage();
+ page.emulate(options);
+
+ return { page, browser };
}
module.exports = runBrowser;
diff --git a/test/helpers/timer.js b/test/helpers/timer.js
new file mode 100644
index 0000000000..0608301ec8
--- /dev/null
+++ b/test/helpers/timer.js
@@ -0,0 +1,11 @@
+'use strict';
+
+function timer(t) {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ resolve();
+ }, t);
+ });
+}
+
+module.exports = timer;
diff --git a/test/integration/MultiCompiler.test.js b/test/integration/MultiCompiler.test.js
index 5d9cc9c15b..d35fe9ba78 100644
--- a/test/integration/MultiCompiler.test.js
+++ b/test/integration/MultiCompiler.test.js
@@ -17,10 +17,10 @@ describe('multi compiler', () => {
afterAll(testServer.close);
// TODO: this is a very basic test, optimally it should test multiple configs etc.
- it('should handle GET request to bundle', (done) => {
- req
+ it('should handle GET request to bundle', async () => {
+ await req
.get('/main.js')
.expect('Content-Type', 'application/javascript; charset=UTF-8')
- .expect(200, done);
+ .expect(200);
});
});
diff --git a/test/integration/UniversalCompiler.test.js b/test/integration/UniversalCompiler.test.js
index 81225c3ad1..3ae2c3bd7a 100644
--- a/test/integration/UniversalCompiler.test.js
+++ b/test/integration/UniversalCompiler.test.js
@@ -16,35 +16,33 @@ describe('universal compiler', () => {
afterAll(testServer.close);
- it('client bundle should have the inlined the client runtime', (done) => {
- req
+ it('client bundle should have the inlined the client runtime', async () => {
+ const { res, err } = await req
.get('/client.js')
.expect('Content-Type', 'application/javascript; charset=UTF-8')
- .expect(200)
- .end((err, res) => {
- if (err) {
- return done(err);
- }
- expect(res.text).toContain('Hello from the client');
- expect(res.text).toContain('sockjs-client');
- done();
- });
+ .expect(200);
+
+ if (err) {
+ throw err;
+ }
+
+ expect(res.text).toContain('Hello from the client');
+ expect(res.text).toContain('sockjs-client');
});
- it('server bundle should NOT have the inlined the client runtime', (done) => {
+ it('server bundle should NOT have the inlined the client runtime', async () => {
// we wouldn't normally request a server bundle
// but we'll do it here to check the contents
- req
+ const { res, err } = await req
.get('/server.js')
.expect('Content-Type', 'application/javascript; charset=UTF-8')
- .expect(200)
- .end((err, res) => {
- if (err) {
- return done(err);
- }
- expect(res.text).toContain('Hello from the server');
- expect(res.text).not.toContain('sockjs-client');
- done();
- });
+ .expect(200);
+
+ if (err) {
+ throw err;
+ }
+
+ expect(res.text).toContain('Hello from the server');
+ expect(res.text).not.toContain('sockjs-client');
});
});
diff --git a/test/options.test.js b/test/options.test.js
index 7e59879bb0..cf1dc54f3b 100644
--- a/test/options.test.js
+++ b/test/options.test.js
@@ -23,75 +23,7 @@ describe('options', () => {
expect(res).toEqual(true);
});
- describe('validation', () => {
- let server;
-
- afterAll((done) => {
- if (server) {
- server.close(() => {
- done();
- });
- }
- });
-
- function validateOption(propertyName, cases) {
- const successCount = cases.success.length;
- const testCases = [];
-
- for (const key of Object.keys(cases)) {
- testCases.push(...cases[key]);
- }
-
- let current = 0;
-
- return testCases.reduce((p, value) => {
- let compiler = webpack(config);
-
- return p
- .then(() => {
- const opts =
- Object.prototype.toString.call(value) === '[object Object]' &&
- Object.keys(value).length !== 0
- ? value
- : {
- [propertyName]: value,
- };
-
- server = new Server(compiler, opts);
- })
- .then(() => {
- if (current < successCount) {
- expect(true).toBeTruthy();
- } else {
- expect(false).toBeTruthy();
- }
- })
- .catch((err) => {
- if (current >= successCount) {
- expect(err).toBeInstanceOf(ValidationError);
- } else {
- expect(false).toBeTruthy();
- }
- })
- .then(() => {
- return new Promise((resolve) => {
- if (server) {
- server.close(() => {
- compiler = null;
- server = null;
- resolve();
- });
- } else {
- resolve();
- }
- });
- })
- .then(() => {
- current += 1;
- });
- }, Promise.resolve());
- }
-
+ {
const memfs = createFsFromVolume(new Volume());
// We need to patch memfs
// https://github.com/webpack/webpack-dev-middleware#fs
@@ -414,10 +346,58 @@ describe('options', () => {
},
};
- Object.keys(cases).forEach((key) => {
- it(key, () => {
- return validateOption(key, cases[key]);
+ for (const [key, values] of Object.entries(cases)) {
+ it(`should validate "${key}" option`, async () => {
+ const compiler = webpack(config);
+ const { success, failure } = values;
+
+ for (const sample of success) {
+ let server;
+
+ try {
+ server = new Server(compiler, createOptions(key, sample));
+ expect(true).toBeTruthy();
+ } catch (e) {
+ expect(false).toBeTruthy();
+ }
+
+ // eslint-disable-next-line no-await-in-loop
+ await closeServer(server);
+ }
+
+ for (const sample of failure) {
+ let server;
+
+ try {
+ server = new Server(compiler, createOptions(key, sample));
+ expect(false).toBeTruthy();
+ } catch (e) {
+ expect(e).toBeInstanceOf(ValidationError);
+ }
+
+ // eslint-disable-next-line no-await-in-loop
+ await closeServer(server);
+ }
});
+ }
+ }
+
+ function createOptions(key, value) {
+ return Object.prototype.toString.call(value) === '[object Object]' &&
+ Object.keys(value).length !== 0
+ ? value
+ : {
+ [key]: value,
+ };
+ }
+
+ async function closeServer(server) {
+ await new Promise((resolve) => {
+ if (server) {
+ server.close(resolve);
+ } else {
+ resolve();
+ }
});
- });
+ }
});
diff --git a/test/server/after-option.test.js b/test/server/after-option.test.js
index b9d57616d0..07e7fd5545 100644
--- a/test/server/after-option.test.js
+++ b/test/server/after-option.test.js
@@ -39,13 +39,12 @@ describe('after option', () => {
afterAll(testServer.close);
- it('should handle after route', () => {
- return req
+ it('should handle after route', async () => {
+ const res = await req
.get('/after/some/path')
.expect('Content-Type', 'text/html; charset=utf-8')
- .expect(200)
- .then((response) => {
- expect(response.text).toBe('after');
- });
+ .expect(200);
+
+ expect(res.text).toBe('after');
});
});
diff --git a/test/server/before-option.test.js b/test/server/before-option.test.js
index 3da0ecfd54..4e831133c2 100644
--- a/test/server/before-option.test.js
+++ b/test/server/before-option.test.js
@@ -39,13 +39,12 @@ describe('before option', () => {
afterAll(testServer.close);
- it('should handle before route', () => {
- return req
+ it('should handle before route', async () => {
+ const res = await req
.get('/before/some/path')
.expect('Content-Type', 'text/html; charset=utf-8')
- .expect(200)
- .then((response) => {
- expect(response.text).toBe('before');
- });
+ .expect(200);
+
+ expect(res.text).toBe('before');
});
});
diff --git a/test/server/compress-option.test.js b/test/server/compress-option.test.js
index 0a04d1466f..644d40356f 100644
--- a/test/server/compress-option.test.js
+++ b/test/server/compress-option.test.js
@@ -22,15 +22,15 @@ describe('compress option', () => {
afterAll(testServer.close);
- it('request to bundle file', (done) => {
- req
+ it('request to bundle file', async () => {
+ await req
.get('/main.js')
.expect((res) => {
if (res.header['content-encoding']) {
throw new Error('Expected `content-encoding` header is undefined.');
}
})
- .expect(200, done);
+ .expect(200);
});
});
@@ -49,11 +49,11 @@ describe('compress option', () => {
afterAll(testServer.close);
- it('request to bundle file', (done) => {
- req
+ it('request to bundle file', async () => {
+ await req
.get('/main.js')
.expect('Content-Encoding', 'gzip')
- .expect(200, done);
+ .expect(200);
});
});
@@ -72,15 +72,15 @@ describe('compress option', () => {
afterAll(testServer.close);
- it('request to bundle file', (done) => {
- req
+ it('request to bundle file', async () => {
+ await req
.get('/main.js')
.expect((res) => {
if (res.header['content-encoding']) {
throw new Error('Expected `content-encoding` header is undefined.');
}
})
- .expect(200, done);
+ .expect(200);
});
});
});
diff --git a/test/server/contentBase-option.test.js b/test/server/contentBase-option.test.js
index baa4111124..f795c3aaf5 100644
--- a/test/server/contentBase-option.test.js
+++ b/test/server/contentBase-option.test.js
@@ -37,19 +37,17 @@ describe('contentBase option', () => {
});
afterAll((done) => {
- testServer.close(() => {
- done();
- });
+ testServer.close(done);
fs.truncateSync(nestedFile);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, /Heyo/, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200, /Heyo/);
});
- it('Request to other file', (done) => {
- req.get('/other.html').expect(200, /Other html/, done);
+ it('Request to other file', async () => {
+ await req.get('/other.html').expect(200, /Other html/);
});
it('Watches folder recursively', (done) => {
@@ -108,12 +106,12 @@ describe('contentBase option', () => {
});
});
- it("shouldn't list the files inside the assets folder (404)", (done) => {
- req.get('/assets/').expect(404, done);
+ it("shouldn't list the files inside the assets folder (404)", async () => {
+ await req.get('/assets/').expect(404);
});
- it('should show Heyo. because bar has index.html inside it (200)', (done) => {
- req.get('/bar/').expect(200, /Heyo/, done);
+ it('should show Heyo. because bar has index.html inside it (200)', async () => {
+ await req.get('/bar/').expect(200, /Heyo/);
});
});
@@ -133,17 +131,15 @@ describe('contentBase option', () => {
});
afterAll((done) => {
- testServer.close(() => {
- done();
- });
+ testServer.close(done);
});
- it('should list the files inside the assets folder (200)', (done) => {
- req.get('/assets/').expect(200, done);
+ it('should list the files inside the assets folder (200)', async () => {
+ await req.get('/assets/').expect(200);
});
- it('should show Heyo. because bar has index.html inside it (200)', (done) => {
- req.get('/bar/').expect(200, /Heyo/, done);
+ it('should show Heyo. because bar has index.html inside it (200)', async () => {
+ await req.get('/bar/').expect(200, /Heyo/);
});
});
@@ -162,17 +158,15 @@ describe('contentBase option', () => {
});
afterAll((done) => {
- testServer.close(() => {
- done();
- });
+ testServer.close(done);
});
- it('should list the files inside the assets folder (200)', (done) => {
- req.get('/assets/').expect(200, done);
+ it('should list the files inside the assets folder (200)', async () => {
+ await req.get('/assets/').expect(200);
});
- it('should show Heyo. because bar has index.html inside it (200)', (done) => {
- req.get('/bar/').expect(200, /Heyo/, done);
+ it('should show Heyo. because bar has index.html inside it (200)', async () => {
+ await req.get('/bar/').expect(200, /Heyo/);
});
});
@@ -190,17 +184,15 @@ describe('contentBase option', () => {
});
afterAll((done) => {
- testServer.close(() => {
- done();
- });
+ testServer.close(done);
});
- it('Request to first directory', (done) => {
- req.get('/').expect(200, /Heyo/, done);
+ it('Request to first directory', async () => {
+ await req.get('/').expect(200, /Heyo/);
});
- it('Request to second directory', (done) => {
- req.get('/foo.html').expect(200, /Foo!/, done);
+ it('Request to second directory', async () => {
+ await req.get('/foo.html').expect(200, /Foo!/);
});
});
@@ -218,16 +210,14 @@ describe('contentBase option', () => {
});
afterAll((done) => {
- testServer.close(() => {
- done();
- });
+ testServer.close(done);
});
- it('Request to page', (done) => {
- req
+ it('Request to page', async () => {
+ await req
.get('/other.html')
.expect('Location', '//localhost:9099999/other.html')
- .expect(302, done);
+ .expect(302);
});
});
@@ -245,25 +235,23 @@ describe('contentBase option', () => {
});
afterAll((done) => {
- testServer.close(() => {
- done();
- });
+ testServer.close(done);
});
- it('Request to page', (done) => {
- req
+ it('Request to page', async () => {
+ await req
.get('/foo.html')
// TODO: hmm, two slashes seems to be a bug?
.expect('Location', 'http://example.com//foo.html')
- .expect(302, done);
+ .expect(302);
});
- it('Request to page with search params', (done) => {
- req
+ it('Request to page with search params', async () => {
+ await req
.get('/foo.html?space=ship')
// TODO: hmm, two slashes seems to be a bug?
.expect('Location', 'http://example.com//foo.html?space=ship')
- .expect(302, done);
+ .expect(302);
});
});
@@ -276,13 +264,11 @@ describe('contentBase option', () => {
});
afterAll((done) => {
- testServer.close(() => {
- done();
- });
+ testServer.close(done);
});
- it('Request to page', (done) => {
- req.get('/other.html').expect(200, done);
+ it('Request to page', async () => {
+ await req.get('/other.html').expect(200);
});
});
@@ -304,13 +290,11 @@ describe('contentBase option', () => {
});
afterAll((done) => {
- testServer.close(() => {
- done();
- });
+ testServer.close(done);
});
- it('Request to page', (done) => {
- req.get('/other.html').expect(404, done);
+ it('Request to page', async () => {
+ await req.get('/other.html').expect(404);
});
});
@@ -328,13 +312,11 @@ describe('contentBase option', () => {
});
afterAll((done) => {
- testServer.close(() => {
- done();
- });
+ testServer.close(done);
});
- it('Request foo.wasm', (done) => {
- req.get('/foo.wasm').expect('Content-Type', 'application/wasm', done);
+ it('Request foo.wasm', async () => {
+ await req.get('/foo.wasm').expect('Content-Type', 'application/wasm');
});
});
});
diff --git a/test/server/headers-option.test.js b/test/server/headers-option.test.js
index 1f3f7ad6fa..1891fe01a2 100644
--- a/test/server/headers-option.test.js
+++ b/test/server/headers-option.test.js
@@ -24,11 +24,11 @@ describe('headers option', () => {
afterAll(testServer.close);
- it('GET request with headers', (done) => {
- req
+ it('GET request with headers', async () => {
+ await req
.get('/main')
.expect('X-Foo', '1')
- .expect(200, done);
+ .expect(200);
});
});
@@ -47,17 +47,18 @@ describe('headers option', () => {
afterAll(testServer.close);
- it('GET request with headers as an array', (done) => {
+ it('GET request with headers as an array', async () => {
// https://github.com/webpack/webpack-dev-server/pull/1650#discussion_r254217027
const expected = ['v7', 'v8', 'v9'].includes(
process.version.split('.')[0]
)
? 'key1=value1,key2=value2'
: 'key1=value1, key2=value2';
- req
+
+ await req
.get('/main')
.expect('X-Bar', expected)
- .expect(200, done);
+ .expect(200);
});
});
});
diff --git a/test/server/historyApiFallback-option.test.js b/test/server/historyApiFallback-option.test.js
index cc600e7a4a..460e9441fd 100644
--- a/test/server/historyApiFallback-option.test.js
+++ b/test/server/historyApiFallback-option.test.js
@@ -50,11 +50,11 @@ describe('historyApiFallback option', () => {
req = request(server.app);
});
- it('request to directory', (done) => {
- req
+ it('request to directory', async () => {
+ await req
.get('/foo')
.accept('html')
- .expect(200, /Foobar/, done);
+ .expect(200, /Foobar/);
});
});
@@ -77,18 +77,18 @@ describe('historyApiFallback option', () => {
req = request(server.app);
});
- it('historyApiFallback should take preference above directory index', (done) => {
- req
+ it('historyApiFallback should take preference above directory index', async () => {
+ await req
.get('/')
.accept('html')
- .expect(200, /Foobar/, done);
+ .expect(200, /Foobar/);
});
- it('request to directory', (done) => {
- req
+ it('request to directory', async () => {
+ await req
.get('/foo')
.accept('html')
- .expect(200, /Foobar/, done);
+ .expect(200, /Foobar/);
});
it('contentBase file should take preference above historyApiFallback', (done) => {
@@ -124,11 +124,11 @@ describe('historyApiFallback option', () => {
req = request(server.app);
});
- it('historyApiFallback should work and ignore static content', (done) => {
- req
+ it('historyApiFallback should work and ignore static content', async () => {
+ await req
.get('/index.html')
.accept('html')
- .expect(200, /In-memory file/, done);
+ .expect(200, /In-memory file/);
});
});
@@ -160,25 +160,25 @@ describe('historyApiFallback option', () => {
req = request(server.app);
});
- it('historyApiFallback respect rewrites for index', (done) => {
- req
+ it('historyApiFallback respect rewrites for index', async () => {
+ await req
.get('/')
.accept('html')
- .expect(200, /Foobar/, done);
+ .expect(200, /Foobar/);
});
- it('historyApiFallback respect rewrites and shows index for unknown urls', (done) => {
- req
+ it('historyApiFallback respect rewrites and shows index for unknown urls', async () => {
+ await req
.get('/acme')
.accept('html')
- .expect(200, /Foobar/, done);
+ .expect(200, /Foobar/);
});
- it('historyApiFallback respect any other specified rewrites', (done) => {
- req
+ it('historyApiFallback respect any other specified rewrites', async () => {
+ await req
.get('/other')
.accept('html')
- .expect(200, /Other file/, done);
+ .expect(200, /Other file/);
});
});
@@ -199,11 +199,11 @@ describe('historyApiFallback option', () => {
req = request(server.app);
});
- it('should take precedence over contentBase files', (done) => {
- req
+ it('should take precedence over contentBase files', async () => {
+ await req
.get('/foo')
.accept('html')
- .expect(200, /In-memory file/, done);
+ .expect(200, /In-memory file/);
});
});
});
diff --git a/test/server/host-option.test.js b/test/server/host-option.test.js
index 009379062a..667caabd9f 100644
--- a/test/server/host-option.test.js
+++ b/test/server/host-option.test.js
@@ -50,8 +50,8 @@ describe('host option', () => {
expect(address.port).toBe(port);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200);
});
afterAll(testServer.close);
@@ -77,8 +77,8 @@ describe('host option', () => {
expect(address.port).toBe(port);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200);
});
afterAll(testServer.close);
@@ -104,8 +104,8 @@ describe('host option', () => {
expect(address.port).toBe(port);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200);
});
afterAll(testServer.close);
@@ -131,8 +131,8 @@ describe('host option', () => {
expect(address.port).toBe(port);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200);
});
afterAll(testServer.close);
@@ -158,8 +158,8 @@ describe('host option', () => {
expect(address.port).toBe(port);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200);
});
afterAll(testServer.close);
diff --git a/test/server/hot-option.test.js b/test/server/hot-option.test.js
index 979bbad12c..e79679ff4b 100644
--- a/test/server/hot-option.test.js
+++ b/test/server/hot-option.test.js
@@ -26,8 +26,8 @@ describe('hot option', () => {
afterAll(testServer.close);
- it('should include hot script in the bundle', (done) => {
- req.get('/main.js').expect(200, /webpack\/hot\/dev-server\.js/, done);
+ it('should include hot script in the bundle', async () => {
+ await req.get('/main.js').expect(200, /webpack\/hot\/dev-server\.js/);
});
});
@@ -51,8 +51,8 @@ describe('hot option', () => {
afterAll(testServer.close);
- it('should include hot script in the bundle', (done) => {
- req.get('/main.js').expect(200, /webpack\/hot\/dev-server\.js/, done);
+ it('should include hot script in the bundle', async () => {
+ await req.get('/main.js').expect(200, /webpack\/hot\/dev-server\.js/);
});
});
@@ -72,14 +72,10 @@ describe('hot option', () => {
afterAll(testServer.close);
- it('should NOT include hot script in the bundle', (done) => {
- req
- .get('/main.js')
- .expect(200)
- .then(({ text }) => {
- expect(text).not.toMatch(/webpack\/hot\/dev-server\.js/);
- done();
- });
+ it('should NOT include hot script in the bundle', async () => {
+ const { text } = await req.get('/main.js').expect(200);
+
+ expect(text).not.toMatch(/webpack\/hot\/dev-server\.js/);
});
});
diff --git a/test/server/hotOnly-option.test.js b/test/server/hotOnly-option.test.js
index e601325fd3..61cba1eb88 100644
--- a/test/server/hotOnly-option.test.js
+++ b/test/server/hotOnly-option.test.js
@@ -25,10 +25,10 @@ describe('hotOnly options', () => {
afterAll(testServer.close);
- it('should include hotOnly script in the bundle', (done) => {
- req
+ it('should include hotOnly script in the bundle', async () => {
+ await req
.get('/main.js')
- .expect(200, /webpack\/hot\/only-dev-server\.js/, done);
+ .expect(200, /webpack\/hot\/only-dev-server\.js/);
});
});
diff --git a/test/server/http2-option.test.js b/test/server/http2-option.test.js
index 3e5506558a..eee2862848 100644
--- a/test/server/http2-option.test.js
+++ b/test/server/http2-option.test.js
@@ -109,14 +109,10 @@ describe('http2 option', () => {
req = request(server.app);
});
- it('Request to index', (done) => {
- req
- .get('/')
- .expect(200, /Heyo/)
- .then(({ res }) => {
- expect(res.httpVersion).not.toEqual('2.0');
- done();
- });
+ it('Request to index', async () => {
+ const { res } = await req.get('/').expect(200, /Heyo/);
+
+ expect(res.httpVersion).not.toEqual('2.0');
});
afterAll(testServer.close);
diff --git a/test/server/https-option.test.js b/test/server/https-option.test.js
index 719875a000..2c569ea5df 100644
--- a/test/server/https-option.test.js
+++ b/test/server/https-option.test.js
@@ -35,8 +35,8 @@ describe('https option', () => {
req = request(server.app);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, /Heyo/, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200, /Heyo/);
});
afterAll(() => {
@@ -70,8 +70,8 @@ describe('https option', () => {
req = request(server.app);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, /Heyo/, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200, /Heyo/);
});
});
@@ -124,8 +124,8 @@ describe('https option', () => {
req = request(server.app);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, /Heyo/, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200, /Heyo/);
});
afterAll(testServer.close);
@@ -160,8 +160,8 @@ describe('https option', () => {
req = request(server.app);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, /Heyo/, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200, /Heyo/);
});
});
diff --git a/test/server/inline-option.test.js b/test/server/inline-option.test.js
index 78344621e6..7fc37ad994 100644
--- a/test/server/inline-option.test.js
+++ b/test/server/inline-option.test.js
@@ -26,10 +26,10 @@ describe('inline option', () => {
afterAll(testServer.close);
- it('should include inline client script in the bundle', (done) => {
+ it('should include inline client script in the bundle', async () => {
const url = new RegExp(`client/index.js\\?http://0.0.0.0:${port}`);
- req.get('/main.js').expect(200, url, done);
+ await req.get('/main.js').expect(200, url);
});
});
@@ -76,14 +76,10 @@ describe('inline option', () => {
afterAll(testServer.close);
- it('should NOT include inline client script in the bundle', (done) => {
- req
- .get('/main.js')
- .expect(200)
- .then(({ text }) => {
- expect(text.includes(`client/index.js?http://0.0.0.0:${port}`));
- done();
- });
+ it('should NOT include inline client script in the bundle', async () => {
+ const { text } = await req.get('/main.js').expect(200);
+
+ expect(text.includes(`client/index.js?http://0.0.0.0:${port}`));
});
});
});
diff --git a/test/server/mimeTypes-option.test.js b/test/server/mimeTypes-option.test.js
index 662007dadd..5f2fef5e7a 100644
--- a/test/server/mimeTypes-option.test.js
+++ b/test/server/mimeTypes-option.test.js
@@ -54,11 +54,11 @@ describe('mimeTypes option', () => {
afterAll(testServer.close);
- it('request to bundle file with modified mime type', (done) => {
- req
+ it('request to bundle file with modified mime type', async () => {
+ await req
.get('/main.js')
.expect('Content-Type', /application\/octet-stream/)
- .expect(200, done);
+ .expect(200);
});
});
});
diff --git a/test/server/port-option.test.js b/test/server/port-option.test.js
index ff7488de80..d9fd6c2391 100644
--- a/test/server/port-option.test.js
+++ b/test/server/port-option.test.js
@@ -23,8 +23,8 @@ describe('port', () => {
expect(address.port).toBeDefined();
});
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200);
});
afterAll(testServer.close);
@@ -51,8 +51,8 @@ describe('port', () => {
expect(address.port).toBeDefined();
});
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200);
});
afterAll(testServer.close);
@@ -78,8 +78,8 @@ describe('port', () => {
expect(address.port).toBeDefined();
});
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200);
});
afterAll(testServer.close);
@@ -104,8 +104,8 @@ describe('port', () => {
expect(address.port).toBe(33333);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200);
});
afterAll(testServer.close);
@@ -130,8 +130,8 @@ describe('port', () => {
expect(address.port).toBe(33333);
});
- it('Request to index', (done) => {
- req.get('/').expect(200, done);
+ it('Request to index', async () => {
+ await req.get('/').expect(200);
});
afterAll(testServer.close);
diff --git a/test/server/proxy-option.test.js b/test/server/proxy-option.test.js
index 6f21967248..21917d9ab8 100644
--- a/test/server/proxy-option.test.js
+++ b/test/server/proxy-option.test.js
@@ -108,32 +108,32 @@ describe('proxy option', () => {
});
describe('target', () => {
- it('respects a proxy option when a request path is matched', (done) => {
- req.get('/proxy1').expect(200, 'from proxy1', done);
+ it('respects a proxy option when a request path is matched', async () => {
+ await req.get('/proxy1').expect(200, 'from proxy1');
});
});
describe('pathRewrite', () => {
- it('respects a pathRewrite option', (done) => {
- req.get('/api/proxy2').expect(200, 'from proxy2', done);
+ it('respects a pathRewrite option', async () => {
+ await req.get('/api/proxy2').expect(200, 'from proxy2');
});
});
describe('bypass', () => {
- it('can rewrite a request path', (done) => {
- req.get('/foo/bar.html').expect(200, /Hello/, done);
+ it('can rewrite a request path', async () => {
+ await req.get('/foo/bar.html').expect(200, /Hello/);
});
- it('can rewrite a request path regardless of the target defined a bypass option', (done) => {
- req.get('/baz/hoge.html').expect(200, /Hello/, done);
+ it('can rewrite a request path regardless of the target defined a bypass option', async () => {
+ await req.get('/baz/hoge.html').expect(200, /Hello/);
});
- it('should pass through a proxy when a bypass function returns null', (done) => {
- req.get('/foo.js').expect(200, /Hey/, done);
+ it('should pass through a proxy when a bypass function returns null', async () => {
+ await req.get('/foo.js').expect(200, /Hey/);
});
- it('should not pass through a proxy when a bypass function returns false', (done) => {
- req.get('/proxyfalse').expect(404, done);
+ it('should not pass through a proxy when a bypass function returns false', async () => {
+ await req.get('/proxyfalse').expect(404);
});
});
});
@@ -164,8 +164,8 @@ describe('proxy option', () => {
});
});
- it('respects a proxy option', (done) => {
- req.get('/proxy1').expect(200, 'from proxy1', done);
+ it('respects a proxy option', async () => {
+ await req.get('/proxy1').expect(200, 'from proxy1');
});
});
@@ -195,12 +195,12 @@ describe('proxy option', () => {
});
});
- it('respects a proxy option', (done) => {
- req.get('/proxy1').expect(200, 'from proxy1', done);
+ it('respects a proxy option', async () => {
+ await req.get('/proxy1').expect(200, 'from proxy1');
});
- it('respects a proxy option of function', (done) => {
- req.get('/api/proxy2').expect(200, 'from proxy2', done);
+ it('respects a proxy option of function', async () => {
+ await req.get('/api/proxy2').expect(200, 'from proxy2');
});
});
@@ -243,12 +243,12 @@ describe('proxy option', () => {
});
});
- it('respects proxy1 option', (done) => {
- req.get('/proxy1').expect(200, 'from proxy', done);
+ it('respects proxy1 option', async () => {
+ await req.get('/proxy1').expect(200, 'from proxy');
});
- it('respects proxy2 option', (done) => {
- req.get('/proxy2').expect(200, 'from proxy', done);
+ it('respects proxy2 option', async () => {
+ await req.get('/proxy2').expect(200, 'from proxy');
});
});
@@ -366,36 +366,35 @@ describe('proxy option', () => {
});
});
- it('GET method', (done) => {
- req.get('/get').expect(200, 'GET method from proxy', done);
+ it('GET method', async () => {
+ await req.get('/get').expect(200, 'GET method from proxy');
});
it('HEAD method', (done) => {
req.head('/head').expect(200, done);
});
- it('POST method (application/x-www-form-urlencoded)', (done) => {
- req
+ it('POST method (application/x-www-form-urlencoded)', async () => {
+ await req
.post('/post-x-www-form-urlencoded')
.send('id=1')
- .expect(200, 'POST method from proxy (id: 1)', done);
+ .expect(200, 'POST method from proxy (id: 1)');
});
- it('POST method (application/json)', (done) => {
- req
+ it('POST method (application/json)', async () => {
+ await req
.post('/post-application-json')
.send({ id: '1' })
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(
200,
- JSON.stringify({ answer: 'POST method from proxy (id: 1)' }),
- done
+ JSON.stringify({ answer: 'POST method from proxy (id: 1)' })
);
});
- it('DELETE method', (done) => {
- req.delete('/delete').expect(200, 'DELETE method from proxy', done);
+ it('DELETE method', async () => {
+ await req.delete('/delete').expect(200, 'DELETE method from proxy');
});
});
});
diff --git a/test/server/serverMode-option.test.js b/test/server/serverMode-option.test.js
index b0ef7357fb..1cd89e76da 100644
--- a/test/server/serverMode-option.test.js
+++ b/test/server/serverMode-option.test.js
@@ -34,8 +34,8 @@ describe('serverMode option', () => {
req = request(`http://localhost:${port}`);
});
- it('sockjs path responds with a 200', (done) => {
- req.get('/sockjs-node').expect(200, done);
+ it('sockjs path responds with a 200', async () => {
+ await req.get('/sockjs-node').expect(200);
});
});
@@ -52,8 +52,8 @@ describe('serverMode option', () => {
req = request(`http://localhost:${port}`);
});
- it('sockjs path responds with a 200', (done) => {
- req.get('/sockjs-node').expect(200, done);
+ it('sockjs path responds with a 200', async () => {
+ await req.get('/sockjs-node').expect(200);
});
});
@@ -70,8 +70,8 @@ describe('serverMode option', () => {
req = request(`http://localhost:${port}`);
});
- it('sockjs path responds with a 200', (done) => {
- req.get('/sockjs-node').expect(200, done);
+ it('sockjs path responds with a 200', async () => {
+ await req.get('/sockjs-node').expect(200);
});
});
diff --git a/test/server/servers/SockJSServer.test.js b/test/server/servers/SockJSServer.test.js
index d1024c5910..a099f16e0c 100644
--- a/test/server/servers/SockJSServer.test.js
+++ b/test/server/servers/SockJSServer.test.js
@@ -4,6 +4,7 @@ const http = require('http');
const express = require('express');
const SockJS = require('sockjs-client/dist/sockjs');
const SockJSServer = require('../../../lib/servers/SockJSServer');
+const timer = require('../../helpers/timer');
const port = require('../../ports-map').SockJSServer;
describe('SockJSServer', () => {
@@ -32,15 +33,16 @@ describe('SockJSServer', () => {
});
describe('server', () => {
- it('should recieve connection, send message, and close client', (done) => {
+ it('should recieve connection, send message, and close client', async () => {
const data = [];
- socketServer.onConnection((connection) => {
+ socketServer.onConnection(async (connection) => {
data.push('open');
socketServer.send(connection, 'hello world');
- setTimeout(() => {
- socketServer.close(connection);
- }, 1000);
+
+ await timer(1000);
+
+ socketServer.close(connection);
});
const client = new SockJS(`http://localhost:${port}/sockjs-node`);
@@ -53,13 +55,12 @@ describe('SockJSServer', () => {
data.push('close');
};
- setTimeout(() => {
- expect(data.length).toEqual(3);
- expect(data[0]).toEqual('open');
- expect(data[1]).toEqual('hello world');
- expect(data[2]).toEqual('close');
- done();
- }, 3000);
+ await timer(3000);
+
+ expect(data.length).toEqual(3);
+ expect(data[0]).toEqual('open');
+ expect(data[1]).toEqual('hello world');
+ expect(data[2]).toEqual('close');
});
});
diff --git a/test/server/sockPath-option.test.js b/test/server/sockPath-option.test.js
index b6840228b5..860e3818be 100644
--- a/test/server/sockPath-option.test.js
+++ b/test/server/sockPath-option.test.js
@@ -25,8 +25,8 @@ describe('sockPath options', () => {
expect(!!server.sockPath.match(/\/[a-z0-9\-/]+[^/]$/)).toBeTruthy();
});
- it('responds with a 200', (done) => {
- req.get('/sockjs-node').expect(200, done);
+ it('responds with a 200', async () => {
+ await req.get('/sockjs-node').expect(200);
});
});
@@ -49,8 +49,8 @@ describe('sockPath options', () => {
expect(server.sockPath).toEqual(path);
});
- it('responds with a 200 second', (done) => {
- req.get(path).expect(200, done);
+ it('responds with a 200 second', async () => {
+ await req.get(path).expect(200);
});
});
});
diff --git a/test/server/stats-option.test.js b/test/server/stats-option.test.js
index 82d58fd233..45e7cc3035 100644
--- a/test/server/stats-option.test.js
+++ b/test/server/stats-option.test.js
@@ -6,7 +6,7 @@ const config = require('../fixtures/simple-config/webpack.config');
const port = require('../ports-map')['stats-option'];
describe('stats option', () => {
- it(`should works with difference stats values (contains 'hash', 'assets', 'warnings' and 'errors')`, () => {
+ it(`should works with difference stats values (contains 'hash', 'assets', 'warnings' and 'errors')`, async () => {
const allStats = [
{},
// eslint-disable-next-line no-undefined
@@ -18,23 +18,22 @@ describe('stats option', () => {
},
];
- return allStats.reduce((p, stats) => {
- return p.then(() => {
- return new Promise((resolve) => {
- const compiler = webpack(config);
- const server = new Server(compiler, { stats, port });
+ for (const stats of allStats) {
+ const compiler = webpack(config);
+ const server = new Server(compiler, { stats, port });
- compiler.hooks.done.tap('webpack-dev-server', (s) => {
- expect(Object.keys(server.getStats(s))).toMatchSnapshot();
+ // eslint-disable-next-line no-await-in-loop
+ await new Promise((resolve) => {
+ compiler.hooks.done.tap('webpack-dev-server', (s) => {
+ expect(Object.keys(server.getStats(s))).toMatchSnapshot();
- server.close(resolve);
- });
-
- compiler.run(() => {});
- server.listen(port, 'localhost');
+ server.close(resolve);
});
+
+ compiler.run(() => {});
+ server.listen(port, 'localhost');
});
- }, Promise.resolve());
+ }
});
it('should respect warningsFilter', (done) => {
diff --git a/test/server/utils/addEntries.test.js b/test/server/utils/addEntries.test.js
index 608bd61a30..026298e923 100644
--- a/test/server/utils/addEntries.test.js
+++ b/test/server/utils/addEntries.test.js
@@ -17,7 +17,7 @@ describe('addEntries util', () => {
expect(webpackOptions.entry.length).toEqual(2);
expect(
- normalize(webpackOptions.entry[0]).indexOf('client/index.js?') !== -1
+ normalize(webpackOptions.entry[0]).includes('client/index.js?')
).toBeTruthy();
expect(normalize(webpackOptions.entry[1])).toEqual('./foo.js');
});
@@ -33,7 +33,7 @@ describe('addEntries util', () => {
expect(webpackOptions.entry.length).toEqual(3);
expect(
- normalize(webpackOptions.entry[0]).indexOf('client/index.js?') !== -1
+ normalize(webpackOptions.entry[0]).includes('client/index.js?')
).toBeTruthy();
expect(webpackOptions.entry[1]).toEqual('./foo.js');
expect(webpackOptions.entry[2]).toEqual('./bar.js');
@@ -54,7 +54,7 @@ describe('addEntries util', () => {
expect(webpackOptions.entry.foo.length).toEqual(2);
expect(
- normalize(webpackOptions.entry.foo[0]).indexOf('client/index.js?') !== -1
+ normalize(webpackOptions.entry.foo[0]).includes('client/index.js?')
).toBeTruthy();
expect(webpackOptions.entry.foo[1]).toEqual('./foo.js');
expect(webpackOptions.entry.bar[1]).toEqual('./bar.js');
@@ -70,7 +70,7 @@ describe('addEntries util', () => {
expect(webpackOptions.entry[1]).toEqual('./src');
});
- it('should preserves dynamic entry points', (done) => {
+ it('should preserves dynamic entry points', async () => {
let i = 0;
const webpackOptions = {
// simulate dynamic entry
@@ -85,22 +85,21 @@ describe('addEntries util', () => {
expect(typeof webpackOptions.entry).toEqual('function');
- webpackOptions
- .entry()
- .then((entryFirstRun) =>
- webpackOptions.entry().then((entrySecondRun) => {
- expect(entryFirstRun.length).toEqual(2);
- expect(entryFirstRun[1]).toEqual('./src-1.js');
-
- expect(entrySecondRun.length).toEqual(2);
- expect(entrySecondRun[1]).toEqual('./src-2.js');
- done();
- })
- )
- .catch(done);
+ {
+ const entry = await webpackOptions.entry();
+
+ expect(entry.length).toEqual(2);
+ expect(entry[1]).toEqual('./src-1.js');
+ }
+ {
+ const entry = await webpackOptions.entry();
+
+ expect(entry.length).toEqual(2);
+ expect(entry[1]).toEqual('./src-2.js');
+ }
});
- it('should preserves asynchronous dynamic entry points', (done) => {
+ it('should preserves asynchronous dynamic entry points', async () => {
let i = 0;
const webpackOptions = {
// simulate async dynamic entry
@@ -117,19 +116,18 @@ describe('addEntries util', () => {
expect(typeof webpackOptions.entry).toEqual('function');
- webpackOptions
- .entry()
- .then((entryFirstRun) =>
- webpackOptions.entry().then((entrySecondRun) => {
- expect(entryFirstRun.length).toEqual(2);
- expect(entryFirstRun[1]).toEqual('./src-1.js');
-
- expect(entrySecondRun.length).toEqual(2);
- expect(entrySecondRun[1]).toEqual('./src-2.js');
- done();
- })
- )
- .catch(done);
+ {
+ const entry = await webpackOptions.entry();
+
+ expect(entry.length).toEqual(2);
+ expect(entry[1]).toEqual('./src-1.js');
+ }
+ {
+ const entry = await webpackOptions.entry();
+
+ expect(entry.length).toEqual(2);
+ expect(entry[1]).toEqual('./src-2.js');
+ }
});
it("should prepends webpack's hot reload client script", () => {
@@ -292,7 +290,7 @@ describe('addEntries util', () => {
if (expectInline) {
expect(
- normalize(webpackOptions.entry[0]).indexOf('client/index.js?') !== -1
+ normalize(webpackOptions.entry[0]).includes('client/index.js?')
).toBeTruthy();
}
@@ -324,7 +322,7 @@ describe('addEntries util', () => {
if (expectInline) {
expect(
- normalize(webpackOptions.entry[0]).indexOf('client/index.js?') !== -1
+ normalize(webpackOptions.entry[0]).includes('client/index.js?')
).toBeTruthy();
}
@@ -380,7 +378,7 @@ describe('addEntries util', () => {
expect(webWebpackOptions.entry.length).toEqual(2);
expect(
- normalize(webWebpackOptions.entry[0]).indexOf('client/index.js?') !== -1
+ normalize(webWebpackOptions.entry[0]).includes('client/index.js?')
).toBeTruthy();
expect(normalize(webWebpackOptions.entry[1])).toEqual('./foo.js');
diff --git a/test/server/utils/findPort.test.js b/test/server/utils/findPort.test.js
index 92ccc36e22..9ab59edd5e 100644
--- a/test/server/utils/findPort.test.js
+++ b/test/server/utils/findPort.test.js
@@ -7,106 +7,109 @@ const findPort = require('../../../lib/utils/findPort');
describe('findPort util', () => {
let dummyServers = [];
- afterEach(() => {
+ afterEach(async () => {
delete process.env.DEFAULT_PORT_RETRY;
- return dummyServers
- .reduce((p, server) => {
- return p.then(() => {
- return new Promise((resolve) => {
- server.close(resolve);
- });
- });
- }, Promise.resolve())
- .then(() => {
- dummyServers = [];
+ async function close(server) {
+ return new Promise((resolve) => {
+ server.close(resolve);
});
+ }
+
+ for (const server of dummyServers) {
+ // eslint-disable-next-line no-await-in-loop
+ await close(server);
+ }
+
+ dummyServers = [];
});
- function createDummyServers(n) {
- return (Array.isArray(n) ? n : [...new Array(n)]).reduce((p, _, i) => {
- return p.then(() => {
- return new Promise((resolve) => {
- const server = http.createServer();
- dummyServers.push(server);
- server.listen(8080 + i, resolve);
- });
+ async function createDummyServers(n) {
+ async function create(i) {
+ return new Promise((resolve) => {
+ const server = http.createServer();
+ dummyServers.push(server);
+ server.listen(8080 + i, resolve);
});
- }, Promise.resolve());
+ }
+
+ const samples = [...new Array(n)].map((_, i) => i);
+
+ for (const i of samples) {
+ // eslint-disable-next-line no-await-in-loop
+ await create(i);
+ }
}
- it('should returns the port when the port is specified', () => {
+ it('should returns the port when the port is specified', async () => {
process.env.DEFAULT_PORT_RETRY = 5;
- return findPort(8082).then((port) => {
- expect(port).toEqual(8082);
- });
+ const port = await findPort(8082);
+ expect(port).toEqual(8082);
});
- it.only('should returns the port when the port is null', () => {
+ it.only('should returns the port when the port is null', async () => {
const retryCount = 2;
process.env.DEFAULT_PORT_RETRY = 2;
- return createDummyServers(retryCount)
- .then(() => findPort(null))
- .then((port) => {
- expect(port).toEqual(8080 + retryCount);
- });
+ await createDummyServers(retryCount);
+
+ const port = await findPort(null);
+
+ expect(port).toEqual(8080 + retryCount);
});
- it('should returns the port when the port is undefined', () => {
+ it('should returns the port when the port is undefined', async () => {
const retryCount = 2;
process.env.DEFAULT_PORT_RETRY = 2;
- return (
- createDummyServers(retryCount)
- // eslint-disable-next-line no-undefined
- .then(() => findPort(undefined))
- .then((port) => {
- expect(port).toEqual(8080 + retryCount);
- })
- );
+ await createDummyServers(retryCount);
+
+ // eslint-disable-next-line no-undefined
+ const port = findPort(undefined);
+
+ expect(port).toEqual(8080 + retryCount);
});
- it('should retry finding the port for up to defaultPortRetry times (number)', () => {
+ it('should retry finding the port for up to defaultPortRetry times (number)', async () => {
const retryCount = 3;
process.env.DEFAULT_PORT_RETRY = retryCount;
- return createDummyServers(retryCount)
- .then(() => findPort())
- .then((port) => {
- expect(port).toEqual(8080 + retryCount);
- });
+ await createDummyServers(retryCount);
+
+ const port = await findPort();
+
+ expect(port).toEqual(8080 + retryCount);
});
- it('should retry finding the port for up to defaultPortRetry times (string)', () => {
+ it('should retry finding the port for up to defaultPortRetry times (string)', async () => {
const retryCount = 3;
process.env.DEFAULT_PORT_RETRY = `${retryCount}`;
- return createDummyServers(retryCount)
- .then(() => findPort())
- .then((port) => {
- expect(port).toEqual(8080 + retryCount);
- });
+ await createDummyServers(retryCount);
+
+ const port = await findPort();
+
+ expect(port).toEqual(8080 + retryCount);
});
- it('should retry finding the port when serial ports are busy', () => {
+ it('should retry finding the port when serial ports are busy', async () => {
const busyPorts = [8080, 8081, 8082, 8083];
process.env.DEFAULT_PORT_RETRY = 3;
- return createDummyServers(busyPorts)
- .then(() => findPort())
- .then((port) => {
- expect(port).toEqual(8080 + busyPorts.length);
- });
+ await createDummyServers(busyPorts);
+
+ const port = await findPort();
+
+ expect(port).toEqual(8080 + busyPorts.length);
});
- it("should throws the error when the port isn't found", () => {
+ it("should throws the error when the port isn't found", async () => {
expect.assertions(1);
const spy = jest
@@ -119,12 +122,14 @@ describe('findPort util', () => {
process.env.DEFAULT_PORT_RETRY = 0;
- return createDummyServers(retryCount)
- .then(() => findPort())
- .catch((err) => {
- expect(err.message).toMatchSnapshot();
+ await createDummyServers(retryCount);
- spy.mockRestore();
- });
+ try {
+ await findPort();
+ } catch (err) {
+ expect(err.message).toMatchSnapshot();
+ }
+
+ spy.mockRestore();
});
});
diff --git a/test/server/utils/routes.test.js b/test/server/utils/routes.test.js
index c5f0d7369e..27115a9d4b 100644
--- a/test/server/utils/routes.test.js
+++ b/test/server/utils/routes.test.js
@@ -16,111 +16,105 @@ describe('routes util', () => {
afterAll(testServer.close);
- it('should handles GET request to live bundle', (done) => {
- req.get('/__webpack_dev_server__/live.bundle.js').then(({ res }) => {
- expect(res.headers['content-type']).toEqual('application/javascript');
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles GET request to live bundle', async () => {
+ const { headers, statusCode } = await req.get(
+ '/__webpack_dev_server__/live.bundle.js'
+ );
+
+ expect(headers['content-type']).toEqual('application/javascript');
+ expect(statusCode).toEqual(200);
});
- it('should handles HEAD request to live bundle', (done) => {
- req.head('/__webpack_dev_server__/live.bundle.js').then(({ res }) => {
- expect(res.headers['content-type']).toEqual('application/javascript');
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles HEAD request to live bundle', async () => {
+ const { headers, statusCode } = await req.head(
+ '/__webpack_dev_server__/live.bundle.js'
+ );
+
+ expect(headers['content-type']).toEqual('application/javascript');
+ expect(statusCode).toEqual(200);
});
- it('should handles GET request to sockjs bundle', (done) => {
- req.get('/__webpack_dev_server__/sockjs.bundle.js').then(({ res }) => {
- expect(res.headers['content-type']).toEqual('application/javascript');
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles GET request to sockjs bundle', async () => {
+ const { headers, statusCode } = await req.get(
+ '/__webpack_dev_server__/sockjs.bundle.js'
+ );
+
+ expect(headers['content-type']).toEqual('application/javascript');
+ expect(statusCode).toEqual(200);
});
- it('should handles HEAD request to sockjs bundle', (done) => {
- req.head('/__webpack_dev_server__/sockjs.bundle.js').then(({ res }) => {
- expect(res.headers['content-type']).toEqual('application/javascript');
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles HEAD request to sockjs bundle', async () => {
+ const { headers, statusCode } = await req.head(
+ '/__webpack_dev_server__/sockjs.bundle.js'
+ );
+
+ expect(headers['content-type']).toEqual('application/javascript');
+ expect(statusCode).toEqual(200);
});
- it('should handles GET request to inline bundle', (done) => {
- req.get('/webpack-dev-server.js').then(({ res }) => {
- expect(res.headers['content-type']).toEqual('application/javascript');
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles GET request to inline bundle', async () => {
+ const { headers, statusCode } = await req.get('/webpack-dev-server.js');
+
+ expect(headers['content-type']).toEqual('application/javascript');
+ expect(statusCode).toEqual(200);
});
- it('should handles HEAD request to inline bundle', (done) => {
- req.head('/webpack-dev-server.js').then(({ res }) => {
- expect(res.headers['content-type']).toEqual('application/javascript');
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles HEAD request to inline bundle', async () => {
+ const { headers, statusCode } = await req.head('/webpack-dev-server.js');
+
+ expect(headers['content-type']).toEqual('application/javascript');
+ expect(statusCode).toEqual(200);
});
- it('should handles GET request to live html', (done) => {
- req.get('/webpack-dev-server/').then(({ res }) => {
- expect(res.headers['content-type']).toEqual('text/html');
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles GET request to live html', async () => {
+ const { headers, statusCode } = await req.get('/webpack-dev-server/');
+
+ expect(headers['content-type']).toEqual('text/html');
+ expect(statusCode).toEqual(200);
});
- it('should handles HEAD request to live html', (done) => {
- req.head('/webpack-dev-server/').then(({ res }) => {
- expect(res.headers['content-type']).toEqual('text/html');
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles HEAD request to live html', async () => {
+ const { headers, statusCode } = await req.head('/webpack-dev-server/');
+
+ expect(headers['content-type']).toEqual('text/html');
+ expect(statusCode).toEqual(200);
});
- it('should handles GET request to directory index', (done) => {
- req.get('/webpack-dev-server').then(({ res }) => {
- expect(res.headers['content-type']).toEqual('text/html');
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles GET request to directory index', async () => {
+ const { headers, statusCode } = await req.get('/webpack-dev-server');
+
+ expect(headers['content-type']).toEqual('text/html');
+ expect(statusCode).toEqual(200);
});
- it('should handles HEAD request to directory index', (done) => {
- req.head('/webpack-dev-server').then(({ res }) => {
- expect(res.headers['content-type']).toEqual('text/html');
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles HEAD request to directory index', async () => {
+ const { headers, statusCode } = await req.head('/webpack-dev-server');
+
+ expect(headers['content-type']).toEqual('text/html');
+ expect(statusCode).toEqual(200);
});
- it('should handles GET request to magic html', (done) => {
- req.get('/main').then(({ res }) => {
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles GET request to magic html', async () => {
+ const { statusCode } = await req.get('/main');
+
+ expect(statusCode).toEqual(200);
});
- it('should handles HEAD request to magic html', (done) => {
- req.head('/main').then(({ res }) => {
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles HEAD request to magic html', async () => {
+ const { statusCode } = await req.head('/main');
+
+ expect(statusCode).toEqual(200);
});
- it('should handles GET request to main chunk', (done) => {
- req.get('/main.js').then(({ res }) => {
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles GET request to main chunk', async () => {
+ const { statusCode } = await req.get('/main.js');
+
+ expect(statusCode).toEqual(200);
});
- it('should handles HEAD request to main chunk', (done) => {
- req.head('/main.js').then(({ res }) => {
- expect(res.statusCode).toEqual(200);
- done();
- });
+ it('should handles HEAD request to main chunk', async () => {
+ const { statusCode } = await req.head('/main.js');
+
+ expect(statusCode).toEqual(200);
});
});
diff --git a/test/server/utils/runOpen.test.js b/test/server/utils/runOpen.test.js
index 453309a5f7..e1ba2ca089 100644
--- a/test/server/utils/runOpen.test.js
+++ b/test/server/utils/runOpen.test.js
@@ -15,9 +15,10 @@ describe('runOpen util', () => {
open.mockImplementation(() => Promise.resolve());
});
- it('on specify URL', () => {
- return runOpen('https://example.com', {}, console).then(() => {
- expect(open.mock.calls[0]).toMatchInlineSnapshot(`
+ it('on specify URL', async () => {
+ await runOpen('https://example.com', {}, console);
+
+ expect(open.mock.calls[0]).toMatchInlineSnapshot(`
Array [
"https://example.com",
Object {
@@ -25,16 +26,16 @@ describe('runOpen util', () => {
},
]
`);
- });
});
- it('on specify URL with page', () => {
- return runOpen(
+ it('on specify URL with page', async () => {
+ await runOpen(
'https://example.com',
{ openPage: '/index.html' },
console
- ).then(() => {
- expect(open.mock.calls[0]).toMatchInlineSnapshot(`
+ );
+
+ expect(open.mock.calls[0]).toMatchInlineSnapshot(`
Array [
"https://example.com/index.html",
Object {
@@ -42,16 +43,12 @@ describe('runOpen util', () => {
},
]
`);
- });
});
- it('on specify URL in Google Chrome', () => {
- return runOpen(
- 'https://example.com',
- { open: 'Google Chrome' },
- console
- ).then(() => {
- expect(open.mock.calls[0]).toMatchInlineSnapshot(`
+ it('on specify URL in Google Chrome', async () => {
+ await runOpen('https://example.com', { open: 'Google Chrome' }, console);
+
+ expect(open.mock.calls[0]).toMatchInlineSnapshot(`
Array [
"https://example.com",
Object {
@@ -60,16 +57,16 @@ describe('runOpen util', () => {
},
]
`);
- });
});
- it('on specify URL with page in Google Chrome ', () => {
- return runOpen(
+ it('on specify URL with page in Google Chrome ', async () => {
+ await runOpen(
'https://example.com',
{ open: 'Google Chrome', openPage: '/index.html' },
console
- ).then(() => {
- expect(open.mock.calls[0]).toMatchInlineSnapshot(`
+ );
+
+ expect(open.mock.calls[0]).toMatchInlineSnapshot(`
Array [
"https://example.com/index.html",
Object {
@@ -78,7 +75,6 @@ describe('runOpen util', () => {
},
]
`);
- });
});
});
@@ -93,12 +89,13 @@ describe('runOpen util', () => {
logMock.warn.mockClear();
});
- it('on specify URL and log error', () => {
- return runOpen('https://example.com', {}, logMock).then(() => {
- expect(logMock.warn.mock.calls[0][0]).toMatchInlineSnapshot(
- `"Unable to open browser. If you are running in a headless environment, please do not use the --open flag"`
- );
- expect(open.mock.calls[0]).toMatchInlineSnapshot(`
+ it('on specify URL and log error', async () => {
+ await runOpen('https://example.com', {}, logMock);
+
+ expect(logMock.warn.mock.calls[0][0]).toMatchInlineSnapshot(
+ `"Unable to open browser. If you are running in a headless environment, please do not use the --open flag"`
+ );
+ expect(open.mock.calls[0]).toMatchInlineSnapshot(`
Array [
"https://example.com",
Object {
@@ -106,19 +103,19 @@ describe('runOpen util', () => {
},
]
`);
- });
});
- it('on specify URL with page and log error', () => {
- return runOpen(
+ it('on specify URL with page and log error', async () => {
+ await runOpen(
'https://example.com',
{ openPage: '/index.html' },
logMock
- ).then(() => {
- expect(logMock.warn.mock.calls[0][0]).toMatchInlineSnapshot(
- `"Unable to open browser. If you are running in a headless environment, please do not use the --open flag"`
- );
- expect(open.mock.calls[0]).toMatchInlineSnapshot(`
+ );
+
+ expect(logMock.warn.mock.calls[0][0]).toMatchInlineSnapshot(
+ `"Unable to open browser. If you are running in a headless environment, please do not use the --open flag"`
+ );
+ expect(open.mock.calls[0]).toMatchInlineSnapshot(`
Array [
"https://example.com/index.html",
Object {
@@ -126,19 +123,15 @@ describe('runOpen util', () => {
},
]
`);
- });
});
- it('on specify URL in Google Chrome and log error', () => {
- return runOpen(
- 'https://example.com',
- { open: 'Google Chrome' },
- logMock
- ).then(() => {
- expect(logMock.warn.mock.calls[0][0]).toMatchInlineSnapshot(
- `"Unable to open browser: Google Chrome. If you are running in a headless environment, please do not use the --open flag"`
- );
- expect(open.mock.calls[0]).toMatchInlineSnapshot(`
+ it('on specify URL in Google Chrome and log error', async () => {
+ await runOpen('https://example.com', { open: 'Google Chrome' }, logMock);
+
+ expect(logMock.warn.mock.calls[0][0]).toMatchInlineSnapshot(
+ `"Unable to open browser: Google Chrome. If you are running in a headless environment, please do not use the --open flag"`
+ );
+ expect(open.mock.calls[0]).toMatchInlineSnapshot(`
Array [
"https://example.com",
Object {
@@ -147,19 +140,19 @@ describe('runOpen util', () => {
},
]
`);
- });
});
- it('on specify URL with page in Google Chrome and log error ', () => {
- return runOpen(
+ it('on specify URL with page in Google Chrome and log error ', async () => {
+ await runOpen(
'https://example.com',
{ open: 'Google Chrome', openPage: '/index.html' },
logMock
- ).then(() => {
- expect(logMock.warn.mock.calls[0][0]).toMatchInlineSnapshot(
- `"Unable to open browser: Google Chrome. If you are running in a headless environment, please do not use the --open flag"`
- );
- expect(open.mock.calls[0]).toMatchInlineSnapshot(`
+ );
+
+ expect(logMock.warn.mock.calls[0][0]).toMatchInlineSnapshot(
+ `"Unable to open browser: Google Chrome. If you are running in a headless environment, please do not use the --open flag"`
+ );
+ expect(open.mock.calls[0]).toMatchInlineSnapshot(`
Array [
"https://example.com/index.html",
Object {
@@ -168,7 +161,6 @@ describe('runOpen util', () => {
},
]
`);
- });
});
});
});