Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable an optional namespace parameter for hasAction & hasFilter #15362

Merged
merged 18 commits into from
Aug 26, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions packages/hooks/src/createHasHook.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,24 @@
* @param {Object} hooks Stored hooks, keyed by hook name.
*
* @return {Function} Function that returns whether any handlers are
* attached to a particular hook.
* attached to a particular hook and optional namespace.
*/
function createHasHook( hooks ) {
/**
* Returns how many handlers are attached for the given hook.
* Returns whether any handlers are attached for the given hookName and optional namespace.
*
* @param {string} hookName The name of the hook to check for.
* @param {string} hookName The name of the hook to check for.
* @param {string} namespace Optional. The unique namespace identifying the callback in the form `vendor/plugin/function`.
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
*
* @return {boolean} Whether there are handlers that are attached to the given hook.
*/
return function hasHook( hookName ) {
return function hasHook( hookName, namespace ) {
// Use the namespace if provided.
if ( 'undefined' !== typeof namespace ) {
return hookName in hooks &&
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
hooks[ hookName ].handlers.some( ( hook ) => hook.namespace === namespace );
}

return hookName in hooks;
};
}
Expand Down
38 changes: 38 additions & 0 deletions packages/hooks/src/test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -697,3 +697,41 @@ test( 'removing a filter triggers a hookRemoved action passing all callback deta
'my_callback3'
);
} );

test( 'checking hasAction and hasFilter with named callbacks', () => {
// hasAction tests
addAction( 'test.action', 'my_callback', () => {} );
expect( hasAction( 'test.action', 'not_my_callback' ) ).toBe( false );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( true );

// test removing
removeAction( 'test.action', 'my_callback' );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( false );

// test removeAll
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
addAction( 'test.action', 'my_callback', () => {} );
addAction( 'test.action', 'my_second_callback', () => {} );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( true );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( true );
removeAllActions( 'test.action' );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( false );
expect( hasAction( 'test.action', 'my_callback' ) ).toBe( false );

// hasFilter tests
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
addFilter( 'test.filter', 'my_callback', () => {} );
expect( hasFilter( 'test.filter', 'not_my_callback' ) ).toBe( false );
expect( hasFilter( 'test.filter', 'my_callback' ) ).toBe( true );

// test removing
removeFilter( 'test.filter', 'my_callback' );
expect( hasFilter( 'test.filter', 'my_callback' ) ).toBe( false );

// test removeAll
addFilter( 'test.filter', 'my_callback', () => {} );
adamsilverstein marked this conversation as resolved.
Show resolved Hide resolved
addFilter( 'test.filter', 'my_second_callback', () => {} );
expect( hasFilter( 'test.filter', 'my_callback' ) ).toBe( true );
expect( hasFilter( 'test.filter', 'my_second_callback' ) ).toBe( true );
removeAllFilters( 'test.filter' );
expect( hasFilter( 'test.filter', 'my_callback' ) ).toBe( false );
expect( hasFilter( 'test.filter', 'my_second_callback' ) ).toBe( false );
} );