From 021956c99e312774dd26babb92a3054b8ae528e1 Mon Sep 17 00:00:00 2001 From: Raymond Cohen Date: Mon, 5 Apr 2021 00:02:10 -0400 Subject: [PATCH] Core: Throw an error when hooks are invoked outside of their module Ref: #1576 --- src/module.js | 3 +++ test/main/modules.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/module.js b/src/module.js index cfa21ff0a..eb1766ed2 100644 --- a/src/module.js +++ b/src/module.js @@ -94,6 +94,9 @@ function processModule( name, options, executeNow, modifiers = {} ) { function setHookFunction( module, hookName ) { return function setHook( callback ) { + if ( config.currentModule !== module ) { + throw new Error( "Do not invoke hooks outside of their providing module." ); + } module.hooks[ hookName ].push( callback ); }; } diff --git a/test/main/modules.js b/test/main/modules.js index c123c05d7..793901d79 100644 --- a/test/main/modules.js +++ b/test/main/modules.js @@ -419,4 +419,35 @@ QUnit.module( "QUnit.module", function() { assert.expect( 9 ); } ); } ); + + QUnit.module( "Improperly invoked hooks", function( hooks ) { + QUnit.module( "Nested module with different hooks variable name", function( innerHooks ) { + this.outerHookRan = false; + try { + hooks.beforeEach( function() { + this.outerHookRan = true; + } ); + } catch ( e ) { + this.beforeEachError = e; + } + + this.innerHookRan = false; + innerHooks.beforeEach( function() { + this.innerHookRan = true; + } ); + + QUnit.test( "calling parent module's beforeEach errors", function( assert ) { + assert.strictEqual( this.beforeEachError.message, + "Do not invoke hooks outside of their providing module." ); + assert.false( this.outerHookRan ); + assert.true( this.innerHookRan ); + } ); + } ); + + QUnit.test( "hooks error when invoked during test execution", function( assert ) { + assert.throws( function() { + hooks.beforeEach( function() { } ); + }, "Do not invoke hooks outside of their providing module." ); + } ); + } ); } );