Description
Current behavior
Seemingly, as of cypress 10, if you have multiple plugins that register handlers for before:run
, after:run
, before:spec
, or after:spec
, only the last registered handler is dispatched.
Desired behavior
All event handlers should be dispatched.
Test code to reproduce
I've added a test spec for the scenario in the fork/branch: https://github.com/jeremygiberson/cypress/tree/run-events-multiple-bug. See pull request #22429
const { defineConfig } = require('cypress')
module.exports = defineConfig({
// setupNodeEvents can be defined in either
// the e2e or component configuration
e2e: {
setupNodeEvents(on, config) {
on('before:run', ()=>{ console.log('before:run first handler') });
on('before:run', ()=>{ console.log('before:run second handler') });
}
}
})
On execution of cypress test, you will only see the presence of "before:run second handler" in the output.
Cypress Version
^10.0.0
Other
Based on cursory investigation it seems like this is due to the EventRegistrar implementation. It seems like this is the class that handles plugin event registration.
But the implementation is such that there can only be a single callback for an event.
export class EventRegistrar {
private _registeredEvents: Record<string, Function> = {}
}
Presumably, the implementation should be such that multiple callbacks can be registered per event.
export class EventRegistrar {
private _registeredEvents: Record<string, Array<Function>> = {}
}
I'm not familiar with the cypress internals, so take with a grain of salt.