diff --git a/cli/schema/cypress.schema.json b/cli/schema/cypress.schema.json index fb11141fcf54..7099b4b626b0 100644 --- a/cli/schema/cypress.schema.json +++ b/cli/schema/cypress.schema.json @@ -245,11 +245,6 @@ "default": "bundled", "description": "If set to 'system', Cypress will try to find a Node.js executable on your path to use when executing your plugins. Otherwise, Cypress will use the Node version bundled with Cypress." }, - "experimentalRunEvents": { - "type": "boolean", - "default": false, - "description": "Allows listening to the `before:run`, `after:run`, `before:spec`, and `after:spec` events in the plugins file." - }, "experimentalSourceRewriting": { "type": "boolean", "default": false, diff --git a/cli/types/cypress.d.ts b/cli/types/cypress.d.ts index 2af83a2e8e67..c52de05772ef 100644 --- a/cli/types/cypress.d.ts +++ b/cli/types/cypress.d.ts @@ -2582,11 +2582,6 @@ declare namespace Cypress { * @default { runMode: 1, openMode: null } */ firefoxGcInterval: Nullable, openMode: Nullable }> - /** - * Allows listening to the `before:run`, `after:run`, `before:spec`, and `after:spec` events in the plugins file. - * @default false - */ - experimentalRunEvents: boolean /** * Enables AST-based JS/HTML rewriting. This may fix issues caused by the existing regex-based JS/HTML replacement * algorithm. diff --git a/packages/server/__snapshots__/3_plugins_spec.js b/packages/server/__snapshots__/3_plugins_spec.js index ac3b4c0363b7..248834c535d2 100644 --- a/packages/server/__snapshots__/3_plugins_spec.js +++ b/packages/server/__snapshots__/3_plugins_spec.js @@ -431,9 +431,13 @@ The following validation error was thrown by your plugins file (\`/foo/bar/.proj You passed: \`invalid:event\` The following are valid events: -- dev-server:start +- after:run - after:screenshot +- after:spec - before:browser:launch +- before:run +- before:spec +- dev-server:start - file:preprocessor - task diff --git a/packages/server/__snapshots__/4_plugin_run_events_spec.ts.js b/packages/server/__snapshots__/4_plugin_run_events_spec.ts.js index ad284c1b157f..4b95c81f2579 100644 --- a/packages/server/__snapshots__/4_plugin_run_events_spec.ts.js +++ b/packages/server/__snapshots__/4_plugin_run_events_spec.ts.js @@ -5,11 +5,10 @@ exports['e2e plugin run events / sends events'] = ` (Run Starting) ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ - │ Cypress: 1.2.3 │ - │ Browser: FooBrowser 88 │ - │ Specs: 2 found (run_events_spec_1.js, run_events_spec_2.js) │ - │ Searched: cypress/integration/* │ - │ Experiments: experimentalRunEvents=true │ + │ Cypress: 1.2.3 │ + │ Browser: FooBrowser 88 │ + │ Specs: 2 found (run_events_spec_1.js, run_events_spec_2.js) │ + │ Searched: cypress/integration/* │ └────────────────────────────────────────────────────────────────────────────────────────────────┘ before:run: cypress/integration/run_events_spec_1.js electron @@ -98,11 +97,10 @@ exports['e2e plugin run events / handles video being deleted in after:spec'] = ` (Run Starting) ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ - │ Cypress: 1.2.3 │ - │ Browser: FooBrowser 88 │ - │ Specs: 1 found (after_spec_deletes_video.js) │ - │ Searched: cypress/integration/* │ - │ Experiments: experimentalRunEvents=true │ + │ Cypress: 1.2.3 │ + │ Browser: FooBrowser 88 │ + │ Specs: 1 found (after_spec_deletes_video.js) │ + │ Searched: cypress/integration/* │ └────────────────────────────────────────────────────────────────────────────────────────────────┘ @@ -150,15 +148,6 @@ This error will not alter the exit code. ` -exports['e2e plugin run events / fails if experimentalRunEvents is not enabled'] = ` -The following validation error was thrown by your plugins file (\`/foo/bar/.projects/plugin-run-events/cypress/plugins/index.js\`). - - Error: The \`before:run\` event requires the experimentalRunEvents flag to be enabled. - -To enable it, set \`"experimentalRunEvents": true\` in your cypress.json - [stack trace lines] -` - exports['e2e plugin run events / fails run if event handler throws'] = ` ==================================================================================================== @@ -166,11 +155,10 @@ exports['e2e plugin run events / fails run if event handler throws'] = ` (Run Starting) ┌────────────────────────────────────────────────────────────────────────────────────────────────┐ - │ Cypress: 1.2.3 │ - │ Browser: FooBrowser 88 │ - │ Specs: 1 found (run_event_throws_spec.js) │ - │ Searched: cypress/integration/* │ - │ Experiments: experimentalRunEvents=true │ + │ Cypress: 1.2.3 │ + │ Browser: FooBrowser 88 │ + │ Specs: 1 found (run_event_throws_spec.js) │ + │ Searched: cypress/integration/* │ └────────────────────────────────────────────────────────────────────────────────────────────────┘ diff --git a/packages/server/lib/config_options.ts b/packages/server/lib/config_options.ts index 9411ec06859c..2c91c8a4b2a2 100644 --- a/packages/server/lib/config_options.ts +++ b/packages/server/lib/config_options.ts @@ -74,11 +74,6 @@ export const options = [ defaultValue: false, validation: v.isBoolean, isExperimental: true, - }, { - name: 'experimentalRunEvents', - defaultValue: false, - validation: v.isBoolean, - isExperimental: true, }, { name: 'experimentalSourceRewriting', defaultValue: false, @@ -303,13 +298,17 @@ export const breakingOptions = [ name: 'experimentalGetCookiesSameSite', errorKey: 'EXPERIMENTAL_SAMESITE_REMOVED', isWarning: true, - }, { - name: 'experimentalShadowDomSupport', - errorKey: 'EXPERIMENTAL_SHADOW_DOM_REMOVED', - isWarning: true, }, { name: 'experimentalNetworkStubbing', errorKey: 'EXPERIMENTAL_NETWORK_STUBBING_REMOVED', isWarning: true, + }, { + name: 'experimentalRunEvents', + errorKey: 'EXPERIMENTAL_RUN_EVENTS_REMOVED', + isWarning: true, + }, { + name: 'experimentalShadowDomSupport', + errorKey: 'EXPERIMENTAL_SHADOW_DOM_REMOVED', + isWarning: true, }, ] diff --git a/packages/server/lib/errors.js b/packages/server/lib/errors.js index 4c4d305e54f2..8578134e39da 100644 --- a/packages/server/lib/errors.js +++ b/packages/server/lib/errors.js @@ -918,6 +918,11 @@ const getMsgByType = function (type, arg1 = {}, arg2, arg3) { The \`experimentalNetworkStubbing\` configuration option was removed in Cypress version \`6.0.0\`. It is no longer necessary for using \`cy.intercept()\` (formerly \`cy.route2()\`). + You can safely remove this option from your config.` + case 'EXPERIMENTAL_RUN_EVENTS_REMOVED': + return stripIndent`\ + The \`experimentalRunEvents\` configuration option was removed in Cypress version \`6.7.0\`. It is no longer necessary when listening to run events in the plugins file. + You can safely remove this option from your config.` case 'INCOMPATIBLE_PLUGIN_RETRIES': return stripIndent`\ diff --git a/packages/server/lib/experiments.ts b/packages/server/lib/experiments.ts index 0421617d6d05..d6dac1b97cca 100644 --- a/packages/server/lib/experiments.ts +++ b/packages/server/lib/experiments.ts @@ -53,7 +53,6 @@ interface StringValues { const _summaries: StringValues = { experimentalComponentTesting: 'Framework-specific component testing, uses `componentFolder` to load component specs.', experimentalFetchPolyfill: 'Polyfills `window.fetch` to enable Network spying and stubbing.', - experimentalRunEvents: 'Allows listening to the `before:run`, `after:run`, `before:spec`, and `after:spec` events in the plugins file.', experimentalSourceRewriting: 'Enables AST-based JS/HTML rewriting. This may fix issues caused by the existing regex-based JS/HTML replacement algorithm.', experimentalStudio: 'Generate and save commands directly to your test suite by interacting with your app as an end user would.', } @@ -71,7 +70,6 @@ const _summaries: StringValues = { const _names: StringValues = { experimentalComponentTesting: 'Component Testing', experimentalFetchPolyfill: 'Fetch polyfill', - experimentalRunEvents: 'Run Events', experimentalSourceRewriting: 'Improved source rewriting', experimentalStudio: 'Studio', } diff --git a/packages/server/lib/plugins/child/validate_event.js b/packages/server/lib/plugins/child/validate_event.js index a3a2fa3c9035..40f984b3f712 100644 --- a/packages/server/lib/plugins/child/validate_event.js +++ b/packages/server/lib/plugins/child/validate_event.js @@ -11,42 +11,25 @@ const isFunction = (event, handler) => { return validate(_.isFunction, handler, `The handler for the event \`${event}\` must be a function`) } -const isValidRunEvent = (event, handler, config) => { - if (!config.experimentalRunEvents) { - return createErrorResult(`The \`${event}\` event requires the experimentalRunEvents flag to be enabled. - -To enable it, set \`"experimentalRunEvents": true\` in your cypress.json`) - } - - return isFunction(event, handler) -} - const isObject = (event, handler) => { return validate(_.isPlainObject, handler, `The handler for the event \`${event}\` must be an object`) } const eventValidators = { - 'dev-server:start': isFunction, + '_get:task:body': isFunction, + '_get:task:keys': isFunction, + 'after:run': isFunction, 'after:screenshot': isFunction, + 'after:spec': isFunction, 'before:browser:launch': isFunction, + 'before:run': isFunction, + 'before:spec': isFunction, + 'dev-server:start': isFunction, 'file:preprocessor': isFunction, 'task': isObject, - '_get:task:keys': isFunction, - '_get:task:body': isFunction, -} - -const runEvents = { - 'after:run': true, - 'after:spec': true, - 'before:run': true, - 'before:spec': true, } const validateEvent = (event, handler, config) => { - if (runEvents[event]) { - return isValidRunEvent(event, handler, config) - } - const validator = eventValidators[event] if (!validator) { diff --git a/packages/server/lib/plugins/run_events.js b/packages/server/lib/plugins/run_events.js index aeda3c7ffbfd..6f73c8bfab7c 100644 --- a/packages/server/lib/plugins/run_events.js +++ b/packages/server/lib/plugins/run_events.js @@ -5,8 +5,6 @@ const plugins = require('../plugins') module.exports = { execute: Promise.method((eventName, config = {}, ...args) => { - if (!config.experimentalRunEvents) return - if (!plugins.has(eventName)) return return plugins.execute(eventName, ...args) diff --git a/packages/server/test/e2e/4_plugin_run_events_spec.ts b/packages/server/test/e2e/4_plugin_run_events_spec.ts index 2cff9d9e0afb..54cf8aaade7a 100644 --- a/packages/server/test/e2e/4_plugin_run_events_spec.ts +++ b/packages/server/test/e2e/4_plugin_run_events_spec.ts @@ -21,18 +21,6 @@ describe('e2e plugin run events', () => { snapshot: true, }) - e2e.it('fails if experimentalRunEvents is not enabled', { - browser: 'electron', - project: Fixtures.projectPath('plugin-run-events'), - spec: '*', - snapshot: true, - expectedExitCode: 1, - config: { - experimentalRunEvents: false, - video: false, - }, - }) - e2e.it('fails run if event handler throws', { browser: 'electron', project: Fixtures.projectPath('plugin-run-event-throws'), diff --git a/packages/server/test/support/fixtures/projects/plugin-after-spec-deletes-video/cypress.json b/packages/server/test/support/fixtures/projects/plugin-after-spec-deletes-video/cypress.json index 4d55818e3e8f..a84f6e38c9e9 100644 --- a/packages/server/test/support/fixtures/projects/plugin-after-spec-deletes-video/cypress.json +++ b/packages/server/test/support/fixtures/projects/plugin-after-spec-deletes-video/cypress.json @@ -1,5 +1,4 @@ { - "experimentalRunEvents": true, "fixturesFolder": false, "supportFile": false } diff --git a/packages/server/test/support/fixtures/projects/plugin-run-event-throws/cypress.json b/packages/server/test/support/fixtures/projects/plugin-run-event-throws/cypress.json index 4d55818e3e8f..a84f6e38c9e9 100644 --- a/packages/server/test/support/fixtures/projects/plugin-run-event-throws/cypress.json +++ b/packages/server/test/support/fixtures/projects/plugin-run-event-throws/cypress.json @@ -1,5 +1,4 @@ { - "experimentalRunEvents": true, "fixturesFolder": false, "supportFile": false } diff --git a/packages/server/test/support/fixtures/projects/plugin-run-events/cypress.json b/packages/server/test/support/fixtures/projects/plugin-run-events/cypress.json index 4d55818e3e8f..a84f6e38c9e9 100644 --- a/packages/server/test/support/fixtures/projects/plugin-run-events/cypress.json +++ b/packages/server/test/support/fixtures/projects/plugin-run-events/cypress.json @@ -1,5 +1,4 @@ { - "experimentalRunEvents": true, "fixturesFolder": false, "supportFile": false } diff --git a/packages/server/test/unit/config_spec.js b/packages/server/test/unit/config_spec.js index 18aec91dc633..df53b331c706 100644 --- a/packages/server/test/unit/config_spec.js +++ b/packages/server/test/unit/config_spec.js @@ -1210,6 +1210,16 @@ describe('lib/config', () => { expect(warning).to.be.calledWith('EXPERIMENTAL_SHADOW_DOM_REMOVED') }) + it('warns if experimentalRunEvents is passed', async function () { + const warning = sinon.spy(errors, 'warning') + + await this.defaults('experimentalRunEvents', true, { + experimentalRunEvents: true, + }) + + expect(warning).to.be.calledWith('EXPERIMENTAL_RUN_EVENTS_REMOVED') + }) + // @see https://github.com/cypress-io/cypress/pull/9185 it('warns if experimentalNetworkStubbing is passed', async function () { const warning = sinon.spy(errors, 'warning') @@ -1247,7 +1257,6 @@ describe('lib/config', () => { execTimeout: { value: 60000, from: 'default' }, experimentalComponentTesting: { value: false, from: 'default' }, experimentalFetchPolyfill: { value: false, from: 'default' }, - experimentalRunEvents: { value: false, from: 'default' }, experimentalSourceRewriting: { value: false, from: 'default' }, experimentalStudio: { value: false, from: 'default' }, fileServerFolder: { value: '', from: 'default' }, @@ -1328,7 +1337,6 @@ describe('lib/config', () => { execTimeout: { value: 60000, from: 'default' }, experimentalComponentTesting: { value: false, from: 'default' }, experimentalFetchPolyfill: { value: false, from: 'default' }, - experimentalRunEvents: { value: false, from: 'default' }, experimentalSourceRewriting: { value: false, from: 'default' }, experimentalStudio: { value: false, from: 'default' }, env: { diff --git a/packages/server/test/unit/plugins/child/validate_event_spec.js b/packages/server/test/unit/plugins/child/validate_event_spec.js index 7514c3eb0663..c58ead318a86 100644 --- a/packages/server/test/unit/plugins/child/validate_event_spec.js +++ b/packages/server/test/unit/plugins/child/validate_event_spec.js @@ -4,10 +4,14 @@ const _ = require('lodash') const validateEvent = require('../../../../lib/plugins/child/validate_event') const events = [ + ['after:run', 'a function', () => {}], + ['after:screenshot', 'a function', () => {}], + ['after:spec', 'a function', () => {}], + ['before:browser:launch', 'a function', () => {}], + ['before:run', 'a function', () => {}], + ['before:spec', 'a function', () => {}], ['dev-server:start', 'a function', () => {}], ['file:preprocessor', 'a function', () => {}], - ['before:browser:launch', 'a function', () => {}], - ['after:screenshot', 'a function', () => {}], ['task', 'an object', {}], ] @@ -21,9 +25,13 @@ describe('lib/plugins/child/validate_event', () => { You passed: \`undefined\` The following are valid events: -- dev-server:start +- after:run - after:screenshot +- after:spec - before:browser:launch +- before:run +- before:spec +- dev-server:start - file:preprocessor - task `) @@ -45,9 +53,13 @@ The following are valid events: You passed: \`invalid:event:name\` The following are valid events: -- dev-server:start +- after:run - after:screenshot +- after:spec - before:browser:launch +- before:run +- before:spec +- dev-server:start - file:preprocessor - task `) @@ -69,37 +81,4 @@ The following are valid events: expect(isValid).to.be.true }) }) - - describe('run events', () => { - const runEvents = [ - 'after:run', - 'before:run', - 'before:spec', - 'after:spec', - ] - - _.each(runEvents, (event) => { - it(`returns error when ${event} event is registed without experimentalRunEvents flag enabled`, () => { - const { isValid, error } = validateEvent(event, {}, { experimentalRunEvents: false }) - - expect(isValid).to.be.false - expect(error.message).to.equal(`The \`${event}\` event requires the experimentalRunEvents flag to be enabled. - -To enable it, set \`"experimentalRunEvents": true\` in your cypress.json`) - }) - - it(`returns error when event handler of ${event} is not a function`, () => { - const { isValid, error } = validateEvent(event, 'invalid type', { experimentalRunEvents: true }) - - expect(isValid).to.be.false - expect(error.message).to.equal(`The handler for the event \`${event}\` must be a function`) - }) - - it(`returns success when event handler of ${event} is a function`, () => { - const { isValid } = validateEvent(event, () => {}, { experimentalRunEvents: true }) - - expect(isValid).to.be.true - }) - }) - }) }) diff --git a/packages/server/test/unit/plugins/run_events_spec.js b/packages/server/test/unit/plugins/run_events_spec.js index 62f669b9b215..a5503a565e8b 100644 --- a/packages/server/test/unit/plugins/run_events_spec.js +++ b/packages/server/test/unit/plugins/run_events_spec.js @@ -5,8 +5,6 @@ const plugins = require(`${root}../lib/plugins`) const runEvents = require(`${root}../lib/plugins/run_events`) describe('lib/plugins/run_events', () => { - const enabled = { experimentalRunEvents: true } - context('#execute', () => { beforeEach(() => { sinon.stub(plugins, 'execute') @@ -14,15 +12,8 @@ describe('lib/plugins/run_events', () => { sinon.stub(errors, 'throw') }) - it('returns a promise noop if experimentalRunEvents is false', () => { - return runEvents.execute('before:spec', { experimentalRunEvents: false }) - .then(() => { - expect(plugins.execute).not.to.be.called - }) - }) - it('returns a promise noop if event is not registered', () => { - return runEvents.execute('before:spec', enabled) + return runEvents.execute('before:spec', {}) .then(() => { expect(plugins.execute).not.to.be.called }) @@ -32,7 +23,7 @@ describe('lib/plugins/run_events', () => { plugins.has.returns(true) plugins.execute.resolves('the result') - return runEvents.execute('before:spec', enabled, 'arg1', 'arg2') + return runEvents.execute('before:spec', {}, 'arg1', 'arg2') .then(() => { expect(plugins.execute).to.be.calledWith('before:spec', 'arg1', 'arg2') }) @@ -42,7 +33,7 @@ describe('lib/plugins/run_events', () => { plugins.has.returns(true) plugins.execute.resolves('the result') - return runEvents.execute('before:spec', enabled, 'arg1', 'arg2') + return runEvents.execute('before:spec', {}, 'arg1', 'arg2') .then((result) => { expect(result).to.equal('the result') }) @@ -52,7 +43,7 @@ describe('lib/plugins/run_events', () => { plugins.has.returns(true) plugins.execute.rejects({ stack: 'The event threw an error' }) - return runEvents.execute('before:spec', enabled, 'arg1', 'arg2') + return runEvents.execute('before:spec', {}, 'arg1', 'arg2') .then(() => { expect(errors.throw).to.be.calledWith('PLUGINS_RUN_EVENT_ERROR', 'before:spec', 'The event threw an error') })