From 723e306a7b28ed8aa281138d6468c8dc205fd20c Mon Sep 17 00:00:00 2001 From: Lachlan Miller Date: Thu, 15 Sep 2022 11:35:07 +1000 Subject: [PATCH] add more tests --- cli/types/cypress.d.ts | 3 +- npm/vite-dev-server/src/devServer.ts | 4 +- npm/vite-dev-server/src/resolveConfig.ts | 2 +- .../test/resolveConfig.spec.ts | 29 ++++++++++- npm/webpack-dev-server/src/devServer.ts | 6 +-- .../src/makeWebpackConfig.ts | 2 +- .../test/makeWebpackConfig.spec.ts | 48 ++++++++++++++++++- 7 files changed, 82 insertions(+), 12 deletions(-) diff --git a/cli/types/cypress.d.ts b/cli/types/cypress.d.ts index f7086a244b8e..3085860e9617 100644 --- a/cli/types/cypress.d.ts +++ b/cli/types/cypress.d.ts @@ -3067,8 +3067,7 @@ declare namespace Cypress { type DevServerFn = (cypressDevServerConfig: DevServerConfig, devServerConfig: ComponentDevServerOpts) => ResolvedDevServerConfig | Promise type ConfigHandler = T - | ((baseConfig: T) => T) - | ((baseConfig: T) => Promise) + | (() => T | Promise) type DevServerConfigOptions = { bundler: 'webpack' diff --git a/npm/vite-dev-server/src/devServer.ts b/npm/vite-dev-server/src/devServer.ts index d687877bf8d2..ab47c05c289a 100644 --- a/npm/vite-dev-server/src/devServer.ts +++ b/npm/vite-dev-server/src/devServer.ts @@ -7,9 +7,7 @@ const debug = debugFn('cypress:vite-dev-server:devServer') const ALL_FRAMEWORKS = ['react', 'vue'] as const -type ConfigHandler = UserConfig -| ((baseConfig: InlineConfig) => Promise) -| ((baseConfig: InlineConfig) => UserConfig) +type ConfigHandler = UserConfig | (() => UserConfig | Promise) export type ViteDevServerConfig = { specs: Cypress.Spec[] diff --git a/npm/vite-dev-server/src/resolveConfig.ts b/npm/vite-dev-server/src/resolveConfig.ts index 98e7354a8940..ecc56c8a4c12 100644 --- a/npm/vite-dev-server/src/resolveConfig.ts +++ b/npm/vite-dev-server/src/resolveConfig.ts @@ -93,7 +93,7 @@ export const createViteDevServerConfig = async (config: ViteDevServerConfig, vit let resolvedOverrides: UserConfig = {} if (typeof viteOverrides === 'function') { - resolvedOverrides = await viteOverrides(viteBaseConfig) + resolvedOverrides = await viteOverrides() } else if (typeof viteOverrides === 'object') { resolvedOverrides = viteOverrides } diff --git a/npm/vite-dev-server/test/resolveConfig.spec.ts b/npm/vite-dev-server/test/resolveConfig.spec.ts index 53f932a7ee2d..c4182607e569 100644 --- a/npm/vite-dev-server/test/resolveConfig.spec.ts +++ b/npm/vite-dev-server/test/resolveConfig.spec.ts @@ -1,10 +1,14 @@ -import { expect } from 'chai' +import Chai, { expect } from 'chai' import { EventEmitter } from 'events' import * as vite from 'vite' import { scaffoldSystemTestProject } from './test-helpers/scaffoldProject' import { createViteDevServerConfig } from '../src/resolveConfig' +import sinon from 'sinon' +import SinonChai from 'sinon-chai' import type { ViteDevServerConfig } from '../src/devServer' +Chai.use(SinonChai) + const getViteDevServerConfig = (projectRoot: string) => { return { specs: [], @@ -21,6 +25,29 @@ const getViteDevServerConfig = (projectRoot: string) => { describe('resolveConfig', function () { this.timeout(1000 * 60) + it('calls viteConfig if it is a function, passing in the base config', async () => { + const viteConfigFn = sinon.spy(async () => { + return { + server: { + fs: { + allow: ['some/other/file'], + }, + }, + } + }) + + const projectRoot = await scaffoldSystemTestProject('vite-inspect') + const viteDevServerConfig = { + ...getViteDevServerConfig(projectRoot), + viteConfig: viteConfigFn, + } + + const viteConfig = await createViteDevServerConfig(viteDevServerConfig, vite) + + expect(viteConfigFn).to.be.called + expect(viteConfig.server.fs.allow).to.include('some/other/file') + }) + context('inspect plugin', () => { it('should not include inspect plugin by default', async () => { const projectRoot = await scaffoldSystemTestProject('vite-inspect') diff --git a/npm/webpack-dev-server/src/devServer.ts b/npm/webpack-dev-server/src/devServer.ts index 8d9502378e83..9fcc9240e9d2 100644 --- a/npm/webpack-dev-server/src/devServer.ts +++ b/npm/webpack-dev-server/src/devServer.ts @@ -27,9 +27,9 @@ type FrameworkConfig = { } } -export type ConfigHandler = Partial -| ((baseConfig: Configuration) => Promise) -| ((baseConfig: Configuration) => Configuration) +export type ConfigHandler = + Partial + | (() => Partial | Promise>) export type WebpackDevServerConfig = { specs: Cypress.Spec[] diff --git a/npm/webpack-dev-server/src/makeWebpackConfig.ts b/npm/webpack-dev-server/src/makeWebpackConfig.ts index cd7334a106ab..7bdb954fdf0f 100644 --- a/npm/webpack-dev-server/src/makeWebpackConfig.ts +++ b/npm/webpack-dev-server/src/makeWebpackConfig.ts @@ -126,7 +126,7 @@ export async function makeWebpackConfig ( } userWebpackConfig = typeof userWebpackConfig === 'function' - ? await userWebpackConfig(frameworkWebpackConfig) + ? await userWebpackConfig() : userWebpackConfig const userAndFrameworkWebpackConfig = modifyWebpackConfigForCypress( diff --git a/npm/webpack-dev-server/test/makeWebpackConfig.spec.ts b/npm/webpack-dev-server/test/makeWebpackConfig.spec.ts index 2f29ab2395d3..8883679feab3 100644 --- a/npm/webpack-dev-server/test/makeWebpackConfig.spec.ts +++ b/npm/webpack-dev-server/test/makeWebpackConfig.spec.ts @@ -1,10 +1,15 @@ -import { expect } from 'chai' +import Chai, { expect } from 'chai' import EventEmitter from 'events' import snapshot from 'snap-shot-it' +import { IgnorePlugin } from 'webpack' import { WebpackDevServerConfig } from '../src/devServer' import { sourceDefaultWebpackDependencies } from '../src/helpers/sourceRelativeWebpackModules' import { CYPRESS_WEBPACK_ENTRYPOINT, makeWebpackConfig } from '../src/makeWebpackConfig' import { createModuleMatrixResult } from './test-helpers/createModuleMatrixResult' +import sinon from 'sinon' +import SinonChai from 'sinon-chai' + +Chai.use(SinonChai) describe('makeWebpackConfig', () => { it('ignores userland webpack `output.publicPath` and `devServer.overlay` with webpack-dev-server v3', async () => { @@ -136,4 +141,45 @@ describe('makeWebpackConfig', () => { 'cypress-entry': CYPRESS_WEBPACK_ENTRYPOINT, }) }) + + it('calls webpackConfig if it is a function, passing in the base config', async () => { + const testPlugin = new IgnorePlugin({ + contextRegExp: /aaa/, + resourceRegExp: /bbb/, + }) + + const modifyConfig = sinon.spy(async () => { + return { + plugins: [testPlugin], + } + }) + + const devServerConfig: WebpackDevServerConfig = { + specs: [], + cypressConfig: { + isTextTerminal: false, + projectRoot: '.', + supportFile: '/support.js', + devServerPublicPathRoute: '/test-public-path', // This will be overridden by makeWebpackConfig.ts + } as Cypress.PluginConfigOptions, + webpackConfig: modifyConfig, + devServerEvents: new EventEmitter(), + } + + const actual = await makeWebpackConfig({ + devServerConfig, + sourceWebpackModulesResult: createModuleMatrixResult({ + webpack: 4, + webpackDevServer: 4, + }), + }) + + expect(actual.plugins.length).to.eq(3) + expect(modifyConfig).to.have.been.called + // merged plugins get added at the top of the chain by default + // should be merged, not overriding existing plugins + expect(actual.plugins[0].constructor.name).to.eq('IgnorePlugin') + expect(actual.plugins[1].constructor.name).to.eq('HtmlWebpackPlugin') + expect(actual.plugins[2].constructor.name).to.eq('CypressCTWebpackPlugin') + }) })