From 21a9d8c04ead4b3cbe710c6f6d69a58333e4f900 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Mon, 3 Feb 2025 19:05:41 +0100 Subject: [PATCH 01/31] E2E Tests: Add Block Hooks Test plugin --- packages/e2e-tests/plugins/block-hooks.php | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 packages/e2e-tests/plugins/block-hooks.php diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php new file mode 100644 index 00000000000000..763a99ceefbb43 --- /dev/null +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -0,0 +1,49 @@ + 'accent', + ); + $hooked_block['innerContent'] = array( + sprintf( + '

This block was inserted by the Block Hooks API in the %1$s position next to the %2$s anchor block.

', + $relative_position, + $anchor_block['blockName'] + ) + ); + } + + return $hooked_block; +} +add_filter( 'hooked_block_core/paragraph', 'gutenberg_test_set_hooked_block_inner_html', 10, 4 ); From 983508a622187a75167311042e4dfa8143a2601a Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 5 Feb 2025 12:52:48 +0100 Subject: [PATCH 02/31] Add basic e2e test --- test/e2e/specs/editor/plugins/block-hooks.js | 49 ++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 test/e2e/specs/editor/plugins/block-hooks.js diff --git a/test/e2e/specs/editor/plugins/block-hooks.js b/test/e2e/specs/editor/plugins/block-hooks.js new file mode 100644 index 00000000000000..0a7e814380140f --- /dev/null +++ b/test/e2e/specs/editor/plugins/block-hooks.js @@ -0,0 +1,49 @@ +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); + +test.describe( 'Block Hooks API', () => { + const anchorBlockMarkup = ` +

This is a test paragraph.

+`; + + const getHookedBlockMarkup = ( + relativePosition, + anchorBlock + ) => ` +

+This block was inserted by the Block Hooks API in the ${ relativePosition } position next to the ${ anchorBlock } anchor block. +

`; + + let post; + + test.beforeAll( async ( { requestUtils } ) => { + post = await requestUtils.createPost( { + title: 'Block Hooks', + status: 'publish', + content: anchorBlockMarkup, + } ); + + await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' ); + } ); + + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.deactivatePlugin( 'gutenberg-test-block-hooks' ); + + await requestUtils.deleteAllPosts(); + } ); + + test( 'should convert to a preformatted block', async ( { + admin, + editor, + } ) => { + await admin.editPost( post.id ); + await expect + .poll( editor.getEditedPostContent ) + .toBe( + anchorBlockMarkup + + getHookedBlockMarkup( 'last_child', 'core/post-content' ) + ); + } ); +} ); From 20e1ff816f636b271b71556ffdecaccc987bc482 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 5 Feb 2025 13:00:20 +0100 Subject: [PATCH 03/31] WPCS --- packages/e2e-tests/plugins/block-hooks.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php index 763a99ceefbb43..8df7da997ebeab 100644 --- a/packages/e2e-tests/plugins/block-hooks.php +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -15,24 +15,24 @@ function gutenberg_test_insert_hooked_blocks( $hooked_blocks, $position, $anchor } if ( - ( $anchor_block === 'core/heading' && $position === 'before' ) || - ( $anchor_block === 'core/post-content' && $position === 'last_child' ) || - ( $anchor_block === 'core/block' && $position === 'first_child' ) + ( 'core/heading' === $anchor_block && 'before' === $position ) || + ( 'core/post-content' === $anchor_block && 'last_child' === $position ) || + ( 'core/block' === $anchor_block && 'first_child' === $position ) ) { $hooked_blocks[] = 'core/paragraph'; } - return $hooked_blocks; + return $hooked_blocks; } add_filter( 'hooked_block_types', 'gutenberg_test_insert_hooked_blocks', 10, 4 ); function gutenberg_test_set_hooked_block_inner_html( $hooked_block, $hooked_block_type, $relative_position, $anchor_block ) { if ( - ( $anchor_block['blockName'] === 'core/heading' && 'before' === $relative_position ) || - ( $anchor_block['blockName'] === 'core/post-content' && 'last_child' === $relative_position ) || - ( $anchor_block['blockName'] === 'core/block' && 'first_child' === $relative_position ) + ( 'core/heading' === $anchor_block['blockName']&& 'before' === $relative_position ) || + ( 'core/post-content' === $anchor_block['blockName'] && 'last_child' === $relative_position ) || + ( 'core/block' === $anchor_block['blockName']&& 'first_child' === $relative_position ) ) { - $hooked_block['attrs'] = array( + $hooked_block['attrs'] = array( 'backgroundColor' => 'accent', ); $hooked_block['innerContent'] = array( @@ -40,7 +40,7 @@ function gutenberg_test_set_hooked_block_inner_html( $hooked_block, $hooked_bloc '

This block was inserted by the Block Hooks API in the %1$s position next to the %2$s anchor block.

', $relative_position, $anchor_block['blockName'] - ) + ), ); } From 68fee6c05e8da482665031e8c8dc823f38ffad2e Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 5 Feb 2025 13:02:22 +0100 Subject: [PATCH 04/31] More WPCS --- packages/e2e-tests/plugins/block-hooks.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php index 8df7da997ebeab..9203b6d22642dd 100644 --- a/packages/e2e-tests/plugins/block-hooks.php +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -28,9 +28,9 @@ function gutenberg_test_insert_hooked_blocks( $hooked_blocks, $position, $anchor function gutenberg_test_set_hooked_block_inner_html( $hooked_block, $hooked_block_type, $relative_position, $anchor_block ) { if ( - ( 'core/heading' === $anchor_block['blockName']&& 'before' === $relative_position ) || + ( 'core/heading' === $anchor_block['blockName'] && 'before' === $relative_position ) || ( 'core/post-content' === $anchor_block['blockName'] && 'last_child' === $relative_position ) || - ( 'core/block' === $anchor_block['blockName']&& 'first_child' === $relative_position ) + ( 'core/block' === $anchor_block['blockName'] && 'first_child' === $relative_position ) ) { $hooked_block['attrs'] = array( 'backgroundColor' => 'accent', From eed4fe08e629588c666e145f3c64c5a0f85a85e8 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 5 Feb 2025 13:22:42 +0100 Subject: [PATCH 05/31] Change test file suffix to .spec.js --- .../specs/editor/plugins/{block-hooks.js => block-hooks.spec.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/e2e/specs/editor/plugins/{block-hooks.js => block-hooks.spec.js} (100%) diff --git a/test/e2e/specs/editor/plugins/block-hooks.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js similarity index 100% rename from test/e2e/specs/editor/plugins/block-hooks.js rename to test/e2e/specs/editor/plugins/block-hooks.spec.js From 1b199686e87c19da4eedcb28a9beada138984552 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 5 Feb 2025 13:44:16 +0100 Subject: [PATCH 06/31] Rename plugin so it can be found --- packages/e2e-tests/plugins/block-hooks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php index 9203b6d22642dd..314dde800e0434 100644 --- a/packages/e2e-tests/plugins/block-hooks.php +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -1,6 +1,6 @@ Date: Wed, 5 Feb 2025 14:07:13 +0100 Subject: [PATCH 07/31] Fix test description --- test/e2e/specs/editor/plugins/block-hooks.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index 0a7e814380140f..e175cad2d7c3d2 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -34,7 +34,7 @@ This block was inserted by the Block Hooks API in the ${ relativePosition await requestUtils.deleteAllPosts(); } ); - test( 'should convert to a preformatted block', async ( { + test( 'should insert hooked block as last child of Post Content block in editor', async ( { admin, editor, } ) => { From a1f8bcbd3c132a4a97263265bdefa4c4080b572f Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Tue, 11 Feb 2025 14:26:07 +0100 Subject: [PATCH 08/31] Add custom class name to facilitate locating block --- packages/e2e-tests/plugins/block-hooks.php | 5 +++-- test/e2e/specs/editor/plugins/block-hooks.spec.js | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php index 314dde800e0434..0b3814cca0c44a 100644 --- a/packages/e2e-tests/plugins/block-hooks.php +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -33,11 +33,12 @@ function gutenberg_test_set_hooked_block_inner_html( $hooked_block, $hooked_bloc ( 'core/block' === $anchor_block['blockName'] && 'first_child' === $relative_position ) ) { $hooked_block['attrs'] = array( - 'backgroundColor' => 'accent', + 'className' => "hooked-block-${relative_position}-" . $anchor_block['blockName'], ); $hooked_block['innerContent'] = array( sprintf( - '

This block was inserted by the Block Hooks API in the %1$s position next to the %2$s anchor block.

', + '

This block was inserted by the Block Hooks API in the %2$s position next to the %3$s anchor block.

', + $hooked_block['attrs']['className'], $relative_position, $anchor_block['blockName'] ), diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index e175cad2d7c3d2..84e324adfb46c5 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -11,8 +11,8 @@ test.describe( 'Block Hooks API', () => { const getHookedBlockMarkup = ( relativePosition, anchorBlock - ) => ` -

+ ) => ` +

This block was inserted by the Block Hooks API in the ${ relativePosition } position next to the ${ anchorBlock } anchor block.

`; From 61a8c8e6bb4ea177313553e3898f3df2decd63f0 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Tue, 11 Feb 2025 16:06:50 +0100 Subject: [PATCH 09/31] Introduce helper --- .../e2e/specs/editor/plugins/block-hooks.spec.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index 84e324adfb46c5..4b96156c556c5e 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -8,13 +8,19 @@ test.describe( 'Block Hooks API', () => {

This is a test paragraph.

`; - const getHookedBlockMarkup = ( - relativePosition, - anchorBlock - ) => ` -

+ const getHookedBlockClassName = ( relativePosition, anchorBlock ) => + `hooked-block-${ relativePosition }-${ anchorBlock }`; + + const getHookedBlockMarkup = ( relativePosition, anchorBlock ) => { + const className = getHookedBlockClassName( + relativePosition, + anchorBlock + ); + return ` +

This block was inserted by the Block Hooks API in the ${ relativePosition } position next to the ${ anchorBlock } anchor block.

`; + }; let post; From 0fbdcc0c27dfea45fff874ba42174163b2a96ff3 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Tue, 11 Feb 2025 16:10:24 +0100 Subject: [PATCH 10/31] Truncate 'core/' from block class name --- packages/e2e-tests/plugins/block-hooks.php | 2 +- test/e2e/specs/editor/plugins/block-hooks.spec.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php index 0b3814cca0c44a..a1cd392dbbcdab 100644 --- a/packages/e2e-tests/plugins/block-hooks.php +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -33,7 +33,7 @@ function gutenberg_test_set_hooked_block_inner_html( $hooked_block, $hooked_bloc ( 'core/block' === $anchor_block['blockName'] && 'first_child' === $relative_position ) ) { $hooked_block['attrs'] = array( - 'className' => "hooked-block-${relative_position}-" . $anchor_block['blockName'], + 'className' => "hooked-block-${relative_position}-" . str_replace( 'core/', '', $anchor_block['blockName'] ), ); $hooked_block['innerContent'] = array( sprintf( diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index 4b96156c556c5e..2fb3a2435bb9f3 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -9,7 +9,10 @@ test.describe( 'Block Hooks API', () => { `; const getHookedBlockClassName = ( relativePosition, anchorBlock ) => - `hooked-block-${ relativePosition }-${ anchorBlock }`; + `hooked-block-${ relativePosition }-${ anchorBlock.replace( + 'core/', + '' + ) }`; const getHookedBlockMarkup = ( relativePosition, anchorBlock ) => { const className = getHookedBlockClassName( From 60d9a2d40671fde990fcec84c36a8bddc7be49bc Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Tue, 11 Feb 2025 16:13:52 +0100 Subject: [PATCH 11/31] Add frontend test --- test/e2e/specs/editor/plugins/block-hooks.spec.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index 2fb3a2435bb9f3..9f27f5acf422ca 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -43,6 +43,17 @@ This block was inserted by the Block Hooks API in the ${ relativePosition await requestUtils.deleteAllPosts(); } ); + test( 'should insert hooked block as last child of Post Content block on frontend', async ( { + page, + } ) => { + await page.goto( `/?p=${ post.id }` ); + await expect( + page.locator( + getHookedBlockClassName( 'last_child', 'core/post-content' ) + ) + ).toHaveCount( 1 ); + } ); + test( 'should insert hooked block as last child of Post Content block in editor', async ( { admin, editor, From 0a941c6735e6f22b16274687015f90a658039efa Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Tue, 11 Feb 2025 16:27:35 +0100 Subject: [PATCH 12/31] Fix selector --- test/e2e/specs/editor/plugins/block-hooks.spec.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index 9f27f5acf422ca..d9102539d19d4e 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -14,6 +14,9 @@ test.describe( 'Block Hooks API', () => { '' ) }`; + const getHookedBlockSelector = ( relativePosition, anchorBlock ) => + '.' + getHookedBlockClassName( relativePosition, anchorBlock ); + const getHookedBlockMarkup = ( relativePosition, anchorBlock ) => { const className = getHookedBlockClassName( relativePosition, @@ -49,7 +52,7 @@ This block was inserted by the Block Hooks API in the ${ relativePosition await page.goto( `/?p=${ post.id }` ); await expect( page.locator( - getHookedBlockClassName( 'last_child', 'core/post-content' ) + getHookedBlockSelector( 'last_child', 'core/post-content' ) ) ).toHaveCount( 1 ); } ); From 7983d017c20fc5937308cfcc41c6b21926b3c25e Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Tue, 11 Feb 2025 16:58:19 +0100 Subject: [PATCH 13/31] Rewrite editor test --- .../specs/editor/plugins/block-hooks.spec.js | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index d9102539d19d4e..fbd307108b542f 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -17,17 +17,6 @@ test.describe( 'Block Hooks API', () => { const getHookedBlockSelector = ( relativePosition, anchorBlock ) => '.' + getHookedBlockClassName( relativePosition, anchorBlock ); - const getHookedBlockMarkup = ( relativePosition, anchorBlock ) => { - const className = getHookedBlockClassName( - relativePosition, - anchorBlock - ); - return ` -

-This block was inserted by the Block Hooks API in the ${ relativePosition } position next to the ${ anchorBlock } anchor block. -

`; - }; - let post; test.beforeAll( async ( { requestUtils } ) => { @@ -62,11 +51,17 @@ This block was inserted by the Block Hooks API in the ${ relativePosition editor, } ) => { await admin.editPost( post.id ); - await expect - .poll( editor.getEditedPostContent ) - .toBe( - anchorBlockMarkup + - getHookedBlockMarkup( 'last_child', 'core/post-content' ) - ); + await expect.poll( editor.getBlocks ).toMatchObject( [ + { name: 'core/paragraph' }, + { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( + 'last_child', + 'core/post-content' + ), + }, + }, + ] ); } ); } ); From 7a803501c22d831c4b799717eca74470458c06e3 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 12 Feb 2025 15:28:21 +0100 Subject: [PATCH 14/31] Move hooked block up --- test/e2e/specs/editor/plugins/block-hooks.spec.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index fbd307108b542f..1464758f8c8142 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -17,6 +17,9 @@ test.describe( 'Block Hooks API', () => { const getHookedBlockSelector = ( relativePosition, anchorBlock ) => '.' + getHookedBlockClassName( relativePosition, anchorBlock ); + const getHookedBlockContent = ( relativePosition, anchorBlock ) => + `This block was inserted by the Block Hooks API in the ${ relativePosition } position next to the ${ anchorBlock } anchor block.`; + let post; test.beforeAll( async ( { requestUtils } ) => { @@ -63,5 +66,11 @@ test.describe( 'Block Hooks API', () => { }, }, ] ); + + const hookedBlock = editor.canvas.getByText( + getHookedBlockContent( 'last_child', 'core/post-content' ) + ); + await editor.selectBlocks( hookedBlock ); + await editor.clickBlockToolbarButton( 'Move up' ); } ); } ); From 47f6bec7eb0486798ed17b4d2b530beb3b1bad6b Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 12 Feb 2025 16:00:05 +0100 Subject: [PATCH 15/31] Fix interpolated string var --- packages/e2e-tests/plugins/block-hooks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php index a1cd392dbbcdab..e66581cb0886bf 100644 --- a/packages/e2e-tests/plugins/block-hooks.php +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -33,7 +33,7 @@ function gutenberg_test_set_hooked_block_inner_html( $hooked_block, $hooked_bloc ( 'core/block' === $anchor_block['blockName'] && 'first_child' === $relative_position ) ) { $hooked_block['attrs'] = array( - 'className' => "hooked-block-${relative_position}-" . str_replace( 'core/', '', $anchor_block['blockName'] ), + 'className' => "hooked-block-{$relative_position}-" . str_replace( 'core/', '', $anchor_block['blockName'] ), ); $hooked_block['innerContent'] = array( sprintf( From 14f5059447a466871b8cf240591f690c0235ce3b Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 12 Feb 2025 16:10:09 +0100 Subject: [PATCH 16/31] Add TODO --- test/e2e/specs/editor/plugins/block-hooks.spec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index 1464758f8c8142..d83aec64146278 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -47,6 +47,7 @@ test.describe( 'Block Hooks API', () => { getHookedBlockSelector( 'last_child', 'core/post-content' ) ) ).toHaveCount( 1 ); + // TODO: Verify that it's after the test paragraph. } ); test( 'should insert hooked block as last child of Post Content block in editor', async ( { From 89645cc3e2b3cc26d683dac359893696d0f70502 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 12 Feb 2025 16:11:00 +0100 Subject: [PATCH 17/31] Add more test coverage --- .../specs/editor/plugins/block-hooks.spec.js | 57 +++++++++++++++---- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index d83aec64146278..0f8268f0ea9f09 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -53,25 +53,58 @@ test.describe( 'Block Hooks API', () => { test( 'should insert hooked block as last child of Post Content block in editor', async ( { admin, editor, + page, } ) => { - await admin.editPost( post.id ); - await expect.poll( editor.getBlocks ).toMatchObject( [ - { name: 'core/paragraph' }, - { - name: 'core/paragraph', - attributes: { - className: getHookedBlockClassName( - 'last_child', - 'core/post-content' - ), - }, + const expectedHookedBlock = { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( + 'last_child', + 'core/post-content' + ), }, - ] ); + }; + + await admin.editPost( post.id ); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + { name: 'core/paragraph' }, + expectedHookedBlock, + ] ); const hookedBlock = editor.canvas.getByText( getHookedBlockContent( 'last_child', 'core/post-content' ) ); await editor.selectBlocks( hookedBlock ); await editor.clickBlockToolbarButton( 'Move up' ); + + // Save updated post. + const saveButton = page + .getByRole( 'region', { name: 'Editor top bar' } ) + .getByRole( 'button', { name: 'Save', exact: true } ); + await saveButton.click(); + await page + .getByRole( 'button', { name: 'Dismiss this notice' } ) + .filter( { hasText: 'updated' } ) + .waitFor(); + + // Reload and verify that the new position of the hooked block has been persisted. + await page.reload(); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + expectedHookedBlock, + { name: 'core/paragraph' }, + ] ); + + // Verify that the frontend reflects the changes made in the editor. + await page.goto( `/?p=${ post.id }` ); + await expect( + page.locator( + getHookedBlockSelector( 'last_child', 'core/post-content' ) + ) + ).toHaveCount( 1 ); + // TODO: Verify that it's before the test paragraph. } ); } ); From 2b9f127e8e8a08b5058ebaaeded55c4f6379c032 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 12 Feb 2025 18:07:13 +0100 Subject: [PATCH 18/31] Add assertions about element order --- .../e2e/specs/editor/plugins/block-hooks.spec.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index 0f8268f0ea9f09..f4c78912aa16fd 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -4,8 +4,8 @@ const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); test.describe( 'Block Hooks API', () => { - const anchorBlockMarkup = ` -

This is a test paragraph.

+ const anchorBlockMarkup = ` +

This is a test paragraph.

`; const getHookedBlockClassName = ( relativePosition, anchorBlock ) => @@ -47,7 +47,11 @@ test.describe( 'Block Hooks API', () => { getHookedBlockSelector( 'last_child', 'core/post-content' ) ) ).toHaveCount( 1 ); - // TODO: Verify that it's after the test paragraph. + // Verify that the hook block is inserted after the test paragraph. + await expect( page.locator( '.entry-content p' ) ).toHaveClass( [ + 'test-paragraph', + getHookedBlockClassName( 'last_child', 'core/post-content' ), + ] ); } ); test( 'should insert hooked block as last child of Post Content block in editor', async ( { @@ -105,6 +109,10 @@ test.describe( 'Block Hooks API', () => { getHookedBlockSelector( 'last_child', 'core/post-content' ) ) ).toHaveCount( 1 ); - // TODO: Verify that it's before the test paragraph. + // Verify that the hooked block is now before the test paragraph. + await expect( page.locator( '.entry-content p' ) ).toHaveClass( [ + getHookedBlockClassName( 'last_child', 'core/post-content' ), + 'test-paragraph', + ] ); } ); } ); From dda5ea042c1ea522ec96b24be53293e4112ebfe9 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 12 Feb 2025 18:17:40 +0100 Subject: [PATCH 19/31] Move consts up one level --- .../specs/editor/plugins/block-hooks.spec.js | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index f4c78912aa16fd..c837cea500fd0b 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -3,23 +3,23 @@ */ const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); -test.describe( 'Block Hooks API', () => { - const anchorBlockMarkup = ` +const anchorBlockMarkup = `

This is a test paragraph.

`; - const getHookedBlockClassName = ( relativePosition, anchorBlock ) => - `hooked-block-${ relativePosition }-${ anchorBlock.replace( - 'core/', - '' - ) }`; +const getHookedBlockClassName = ( relativePosition, anchorBlock ) => + `hooked-block-${ relativePosition }-${ anchorBlock.replace( + 'core/', + '' + ) }`; - const getHookedBlockSelector = ( relativePosition, anchorBlock ) => - '.' + getHookedBlockClassName( relativePosition, anchorBlock ); +const getHookedBlockSelector = ( relativePosition, anchorBlock ) => + '.' + getHookedBlockClassName( relativePosition, anchorBlock ); - const getHookedBlockContent = ( relativePosition, anchorBlock ) => - `This block was inserted by the Block Hooks API in the ${ relativePosition } position next to the ${ anchorBlock } anchor block.`; +const getHookedBlockContent = ( relativePosition, anchorBlock ) => + `This block was inserted by the Block Hooks API in the ${ relativePosition } position next to the ${ anchorBlock } anchor block.`; +test.describe( 'Block Hooks API', () => { let post; test.beforeAll( async ( { requestUtils } ) => { From 9b2ee0e5a93f99a66465405cafd064598c983c5c Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Thu, 13 Feb 2025 10:08:01 +0100 Subject: [PATCH 20/31] Rename test-paragraph class to dummy-paragraph --- test/e2e/specs/editor/plugins/block-hooks.spec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index c837cea500fd0b..3b42f16bfc32cb 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -3,8 +3,8 @@ */ const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); -const anchorBlockMarkup = ` -

This is a test paragraph.

+const anchorBlockMarkup = ` +

This is a dummy paragraph.

`; const getHookedBlockClassName = ( relativePosition, anchorBlock ) => @@ -49,7 +49,7 @@ test.describe( 'Block Hooks API', () => { ).toHaveCount( 1 ); // Verify that the hook block is inserted after the test paragraph. await expect( page.locator( '.entry-content p' ) ).toHaveClass( [ - 'test-paragraph', + 'dummy-paragraph', getHookedBlockClassName( 'last_child', 'core/post-content' ), ] ); } ); @@ -112,7 +112,7 @@ test.describe( 'Block Hooks API', () => { // Verify that the hooked block is now before the test paragraph. await expect( page.locator( '.entry-content p' ) ).toHaveClass( [ getHookedBlockClassName( 'last_child', 'core/post-content' ), - 'test-paragraph', + 'dummy-paragraph', ] ); } ); } ); From 2b97811d4b105f4589d364dc5e34772d33ffc3c3 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Thu, 13 Feb 2025 10:24:45 +0100 Subject: [PATCH 21/31] Add test coverage for 'after' insertion --- packages/e2e-tests/plugins/block-hooks.php | 4 +-- .../specs/editor/plugins/block-hooks.spec.js | 34 ++++++++++++++----- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php index e66581cb0886bf..c4679a7bac6eb6 100644 --- a/packages/e2e-tests/plugins/block-hooks.php +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -15,7 +15,7 @@ function gutenberg_test_insert_hooked_blocks( $hooked_blocks, $position, $anchor } if ( - ( 'core/heading' === $anchor_block && 'before' === $position ) || + ( 'core/heading' === $anchor_block && 'after' === $position ) || ( 'core/post-content' === $anchor_block && 'last_child' === $position ) || ( 'core/block' === $anchor_block && 'first_child' === $position ) ) { @@ -28,7 +28,7 @@ function gutenberg_test_insert_hooked_blocks( $hooked_blocks, $position, $anchor function gutenberg_test_set_hooked_block_inner_html( $hooked_block, $hooked_block_type, $relative_position, $anchor_block ) { if ( - ( 'core/heading' === $anchor_block['blockName'] && 'before' === $relative_position ) || + ( 'core/heading' === $anchor_block['blockName'] && 'after' === $relative_position ) || ( 'core/post-content' === $anchor_block['blockName'] && 'last_child' === $relative_position ) || ( 'core/block' === $anchor_block['blockName'] && 'first_child' === $relative_position ) ) { diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index 3b42f16bfc32cb..e1e61cf60e8990 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -3,7 +3,10 @@ */ const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); -const anchorBlockMarkup = ` +const anchorBlockMarkup = ` +

This is a dummy heading

+ +

This is a dummy paragraph.

`; @@ -38,7 +41,7 @@ test.describe( 'Block Hooks API', () => { await requestUtils.deleteAllPosts(); } ); - test( 'should insert hooked block as last child of Post Content block on frontend', async ( { + test( 'should insert hooked blocks into post content on frontend', async ( { page, } ) => { await page.goto( `/?p=${ post.id }` ); @@ -48,18 +51,27 @@ test.describe( 'Block Hooks API', () => { ) ).toHaveCount( 1 ); // Verify that the hook block is inserted after the test paragraph. - await expect( page.locator( '.entry-content p' ) ).toHaveClass( [ + await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ + 'wp-block-heading', + getHookedBlockClassName( 'after', 'core/heading' ), 'dummy-paragraph', getHookedBlockClassName( 'last_child', 'core/post-content' ), ] ); } ); - test( 'should insert hooked block as last child of Post Content block in editor', async ( { + test( 'should insert hooked blocks into post content in editor', async ( { admin, editor, page, } ) => { - const expectedHookedBlock = { + const expectedHookedBlockAfterHeading = { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( 'after', 'core/heading' ), + }, + }; + + const expectedHookedBlockLastChild = { name: 'core/paragraph', attributes: { className: getHookedBlockClassName( @@ -73,8 +85,10 @@ test.describe( 'Block Hooks API', () => { await expect .poll( editor.getBlocks ) .toMatchObject( [ + { name: 'core/heading' }, + expectedHookedBlockAfterHeading, { name: 'core/paragraph' }, - expectedHookedBlock, + expectedHookedBlockLastChild, ] ); const hookedBlock = editor.canvas.getByText( @@ -98,7 +112,9 @@ test.describe( 'Block Hooks API', () => { await expect .poll( editor.getBlocks ) .toMatchObject( [ - expectedHookedBlock, + { name: 'core/heading' }, + expectedHookedBlockAfterHeading, + expectedHookedBlockLastChild, { name: 'core/paragraph' }, ] ); @@ -110,7 +126,9 @@ test.describe( 'Block Hooks API', () => { ) ).toHaveCount( 1 ); // Verify that the hooked block is now before the test paragraph. - await expect( page.locator( '.entry-content p' ) ).toHaveClass( [ + await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ + 'wp-block-heading', + getHookedBlockClassName( 'after', 'core/heading' ), getHookedBlockClassName( 'last_child', 'core/post-content' ), 'dummy-paragraph', ] ); From dd7a6442f6ae7adf43241ec0e83bc10679aefdce Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Thu, 13 Feb 2025 10:28:04 +0100 Subject: [PATCH 22/31] Remove now-obsolete assertions --- test/e2e/specs/editor/plugins/block-hooks.spec.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index e1e61cf60e8990..bb7038c1a981f2 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -16,9 +16,6 @@ const getHookedBlockClassName = ( relativePosition, anchorBlock ) => '' ) }`; -const getHookedBlockSelector = ( relativePosition, anchorBlock ) => - '.' + getHookedBlockClassName( relativePosition, anchorBlock ); - const getHookedBlockContent = ( relativePosition, anchorBlock ) => `This block was inserted by the Block Hooks API in the ${ relativePosition } position next to the ${ anchorBlock } anchor block.`; @@ -45,12 +42,6 @@ test.describe( 'Block Hooks API', () => { page, } ) => { await page.goto( `/?p=${ post.id }` ); - await expect( - page.locator( - getHookedBlockSelector( 'last_child', 'core/post-content' ) - ) - ).toHaveCount( 1 ); - // Verify that the hook block is inserted after the test paragraph. await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ 'wp-block-heading', getHookedBlockClassName( 'after', 'core/heading' ), @@ -120,12 +111,6 @@ test.describe( 'Block Hooks API', () => { // Verify that the frontend reflects the changes made in the editor. await page.goto( `/?p=${ post.id }` ); - await expect( - page.locator( - getHookedBlockSelector( 'last_child', 'core/post-content' ) - ) - ).toHaveCount( 1 ); - // Verify that the hooked block is now before the test paragraph. await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ 'wp-block-heading', getHookedBlockClassName( 'after', 'core/heading' ), From 70bcc01f323300345fb9ffacfbd36a3559a66046 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Thu, 13 Feb 2025 10:32:14 +0100 Subject: [PATCH 23/31] Update test description --- test/e2e/specs/editor/plugins/block-hooks.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index bb7038c1a981f2..2405164864a1f1 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -50,7 +50,7 @@ test.describe( 'Block Hooks API', () => { ] ); } ); - test( 'should insert hooked blocks into post content in editor', async ( { + test( 'should insert hooked blocks into post content in editor and respect changes made there', async ( { admin, editor, page, From 8eb1de1a1d9fcb8209f68ad65096e7ef299da7e1 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Thu, 13 Feb 2025 16:08:06 +0100 Subject: [PATCH 24/31] Add test coverage for Synced Patterns --- packages/e2e-tests/plugins/block-hooks.php | 20 +- .../specs/editor/plugins/block-hooks.spec.js | 293 +++++++++++++----- 2 files changed, 225 insertions(+), 88 deletions(-) diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php index c4679a7bac6eb6..70e283060c1c88 100644 --- a/packages/e2e-tests/plugins/block-hooks.php +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -17,7 +17,7 @@ function gutenberg_test_insert_hooked_blocks( $hooked_blocks, $position, $anchor if ( ( 'core/heading' === $anchor_block && 'after' === $position ) || ( 'core/post-content' === $anchor_block && 'last_child' === $position ) || - ( 'core/block' === $anchor_block && 'first_child' === $position ) + ( 'core/block' === $anchor_block && 'last_child' === $position ) ) { $hooked_blocks[] = 'core/paragraph'; } @@ -30,7 +30,7 @@ function gutenberg_test_set_hooked_block_inner_html( $hooked_block, $hooked_bloc if ( ( 'core/heading' === $anchor_block['blockName'] && 'after' === $relative_position ) || ( 'core/post-content' === $anchor_block['blockName'] && 'last_child' === $relative_position ) || - ( 'core/block' === $anchor_block['blockName'] && 'first_child' === $relative_position ) + ( 'core/block' === $anchor_block['blockName'] && 'last_child' === $relative_position ) ) { $hooked_block['attrs'] = array( 'className' => "hooked-block-{$relative_position}-" . str_replace( 'core/', '', $anchor_block['blockName'] ), @@ -48,3 +48,19 @@ function gutenberg_test_set_hooked_block_inner_html( $hooked_block, $hooked_bloc return $hooked_block; } add_filter( 'hooked_block_core/paragraph', 'gutenberg_test_set_hooked_block_inner_html', 10, 4 ); + +function gutenberg_register_wp_ignored_hooked_blocks_meta() { + register_post_meta( + 'post', + '_wp_ignored_hooked_blocks', + array( + 'show_in_rest' => true, + 'single' => true, + 'type' => 'string', + 'auth_callback' => function() { + return current_user_can( 'edit_posts' ); + } + ) + ); +} +add_action( 'rest_api_init', 'gutenberg_register_wp_ignored_hooked_blocks_meta' ); diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index 2405164864a1f1..a92b90b8baf795 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -20,102 +20,223 @@ const getHookedBlockContent = ( relativePosition, anchorBlock ) => `This block was inserted by the Block Hooks API in the ${ relativePosition } position next to the ${ anchorBlock } anchor block.`; test.describe( 'Block Hooks API', () => { - let post; + test.describe( 'Hooked blocks in Post Content', () => { + let post; - test.beforeAll( async ( { requestUtils } ) => { - post = await requestUtils.createPost( { - title: 'Block Hooks', - status: 'publish', - content: anchorBlockMarkup, + test.beforeAll( async ( { requestUtils } ) => { + post = await requestUtils.createPost( { + title: 'Block Hooks', + status: 'publish', + content: anchorBlockMarkup, + } ); + + await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' ); } ); - await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' ); - } ); + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.deactivatePlugin( 'gutenberg-test-block-hooks' ); - test.afterAll( async ( { requestUtils } ) => { - await requestUtils.deactivatePlugin( 'gutenberg-test-block-hooks' ); + await requestUtils.deleteAllPosts(); + } ); - await requestUtils.deleteAllPosts(); - } ); + test( 'should insert hooked blocks into post content on frontend', async ( { + page, + } ) => { + await page.goto( `/?p=${ post.id }` ); + await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ + 'wp-block-heading', + getHookedBlockClassName( 'after', 'core/heading' ), + 'dummy-paragraph', + getHookedBlockClassName( 'last_child', 'core/post-content' ), + ] ); + } ); - test( 'should insert hooked blocks into post content on frontend', async ( { - page, - } ) => { - await page.goto( `/?p=${ post.id }` ); - await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ - 'wp-block-heading', - getHookedBlockClassName( 'after', 'core/heading' ), - 'dummy-paragraph', - getHookedBlockClassName( 'last_child', 'core/post-content' ), - ] ); + test( 'should insert hooked blocks into post content in editor and respect changes made there', async ( { + admin, + editor, + page, + } ) => { + const expectedHookedBlockAfterHeading = { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( + 'after', + 'core/heading' + ), + }, + }; + + const expectedHookedBlockLastChild = { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( + 'last_child', + 'core/post-content' + ), + }, + }; + + await admin.editPost( post.id ); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + { name: 'core/heading' }, + expectedHookedBlockAfterHeading, + { name: 'core/paragraph' }, + expectedHookedBlockLastChild, + ] ); + + const hookedBlock = editor.canvas.getByText( + getHookedBlockContent( 'last_child', 'core/post-content' ) + ); + await editor.selectBlocks( hookedBlock ); + await editor.clickBlockToolbarButton( 'Move up' ); + + // Save updated post. + const saveButton = page + .getByRole( 'region', { name: 'Editor top bar' } ) + .getByRole( 'button', { name: 'Save', exact: true } ); + await saveButton.click(); + await page + .getByRole( 'button', { name: 'Dismiss this notice' } ) + .filter( { hasText: 'updated' } ) + .waitFor(); + + // Reload and verify that the new position of the hooked block has been persisted. + await page.reload(); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + { name: 'core/heading' }, + expectedHookedBlockAfterHeading, + expectedHookedBlockLastChild, + { name: 'core/paragraph' }, + ] ); + + // Verify that the frontend reflects the changes made in the editor. + await page.goto( `/?p=${ post.id }` ); + await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ + 'wp-block-heading', + getHookedBlockClassName( 'after', 'core/heading' ), + getHookedBlockClassName( 'last_child', 'core/post-content' ), + 'dummy-paragraph', + ] ); + } ); } ); - test( 'should insert hooked blocks into post content in editor and respect changes made there', async ( { - admin, - editor, - page, - } ) => { - const expectedHookedBlockAfterHeading = { - name: 'core/paragraph', - attributes: { - className: getHookedBlockClassName( 'after', 'core/heading' ), - }, - }; - - const expectedHookedBlockLastChild = { - name: 'core/paragraph', - attributes: { - className: getHookedBlockClassName( - 'last_child', - 'core/post-content' - ), - }, - }; - - await admin.editPost( post.id ); - await expect - .poll( editor.getBlocks ) - .toMatchObject( [ - { name: 'core/heading' }, - expectedHookedBlockAfterHeading, - { name: 'core/paragraph' }, - expectedHookedBlockLastChild, - ] ); + test.describe( 'Hooked blocks in Synced Patterns', () => { + let post, syncedPattern; + test.beforeAll( async ( { requestUtils } ) => { + syncedPattern = await requestUtils.createBlock( { + title: 'Synced Pattern', + status: 'publish', + content: anchorBlockMarkup, + } ); + + await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' ); + + post = await requestUtils.createPost( { + title: 'Block Hooks in Synced Patterns', + status: 'publish', + content: ``, + meta: { + // Prevent Block Hooks from injecting blocks into + // post content so they won't distract from the ones + // injected into the synced pattern. + _wp_ignored_hooked_blocks: '["core/paragraph"]', + }, + } ); + } ); + + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.deactivatePlugin( 'gutenberg-test-block-hooks' ); + + await requestUtils.deleteAllPosts(); + await requestUtils.deleteAllBlocks(); + } ); - const hookedBlock = editor.canvas.getByText( - getHookedBlockContent( 'last_child', 'core/post-content' ) - ); - await editor.selectBlocks( hookedBlock ); - await editor.clickBlockToolbarButton( 'Move up' ); - - // Save updated post. - const saveButton = page - .getByRole( 'region', { name: 'Editor top bar' } ) - .getByRole( 'button', { name: 'Save', exact: true } ); - await saveButton.click(); - await page - .getByRole( 'button', { name: 'Dismiss this notice' } ) - .filter( { hasText: 'updated' } ) - .waitFor(); - - // Reload and verify that the new position of the hooked block has been persisted. - await page.reload(); - await expect - .poll( editor.getBlocks ) - .toMatchObject( [ - { name: 'core/heading' }, - expectedHookedBlockAfterHeading, - expectedHookedBlockLastChild, - { name: 'core/paragraph' }, + test( 'should insert hooked blocks into synced pattern on frontend', async ( { + page, + } ) => { + await page.goto( `/?p=${ post.id }` ); + await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ + 'wp-block-heading', + getHookedBlockClassName( 'after', 'core/heading' ), + 'dummy-paragraph', + getHookedBlockClassName( 'last_child', 'core/block' ), ] ); + } ); - // Verify that the frontend reflects the changes made in the editor. - await page.goto( `/?p=${ post.id }` ); - await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ - 'wp-block-heading', - getHookedBlockClassName( 'after', 'core/heading' ), - getHookedBlockClassName( 'last_child', 'core/post-content' ), - 'dummy-paragraph', - ] ); + test( 'should insert hooked blocks into synced pattern in editor and respect changes made there', async ( { + admin, + editor, + page, + } ) => { + const expectedHookedBlockAfterHeading = { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( + 'after', + 'core/heading' + ), + }, + }; + + const expectedHookedBlockLastChild = { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( + 'last_child', + 'core/block' + ), + }, + }; + + await admin.editPost( syncedPattern.id ); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + { name: 'core/heading' }, + expectedHookedBlockAfterHeading, + { name: 'core/paragraph' }, + expectedHookedBlockLastChild, + ] ); + + const hookedBlock = editor.canvas.getByText( + getHookedBlockContent( 'last_child', 'core/block' ) + ); + await editor.selectBlocks( hookedBlock ); + await editor.clickBlockToolbarButton( 'Move up' ); + + // Save updated post. + const saveButton = page + .getByRole( 'region', { name: 'Editor top bar' } ) + .getByRole( 'button', { name: 'Save', exact: true } ); + await saveButton.click(); + await page + .getByRole( 'button', { name: 'Dismiss this notice' } ) + .filter( { hasText: 'updated' } ) + .waitFor(); + + // Reload and verify that the new position of the hooked block has been persisted. + await page.reload(); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + { name: 'core/heading' }, + expectedHookedBlockAfterHeading, + expectedHookedBlockLastChild, + { name: 'core/paragraph' }, + ] ); + + // Verify that the frontend reflects the changes made in the editor. + await page.goto( `/?p=${ post.id }` ); + await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ + 'wp-block-heading', + getHookedBlockClassName( 'after', 'core/heading' ), + getHookedBlockClassName( 'last_child', 'core/block' ), + 'dummy-paragraph', + ] ); + } ); } ); } ); From a757d563158bd5b090ace06cb9cd559557e9fb3e Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Thu, 13 Feb 2025 16:11:07 +0100 Subject: [PATCH 25/31] Rename var --- test/e2e/specs/editor/plugins/block-hooks.spec.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index a92b90b8baf795..af7be79269f54f 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -3,7 +3,7 @@ */ const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); -const anchorBlockMarkup = ` +const dummyBlockContent = `

This is a dummy heading

@@ -27,7 +27,7 @@ test.describe( 'Block Hooks API', () => { post = await requestUtils.createPost( { title: 'Block Hooks', status: 'publish', - content: anchorBlockMarkup, + content: dummyBlockContent, } ); await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' ); @@ -130,7 +130,7 @@ test.describe( 'Block Hooks API', () => { syncedPattern = await requestUtils.createBlock( { title: 'Synced Pattern', status: 'publish', - content: anchorBlockMarkup, + content: dummyBlockContent, } ); await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' ); From acead15f4285078e92b237ae79861943a87c3277 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Thu, 13 Feb 2025 16:38:14 +0100 Subject: [PATCH 26/31] Merge test cases --- .../specs/editor/plugins/block-hooks.spec.js | 342 +++++++----------- 1 file changed, 133 insertions(+), 209 deletions(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index af7be79269f54f..ceef247665d1e3 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -20,223 +20,147 @@ const getHookedBlockContent = ( relativePosition, anchorBlock ) => `This block was inserted by the Block Hooks API in the ${ relativePosition } position next to the ${ anchorBlock } anchor block.`; test.describe( 'Block Hooks API', () => { - test.describe( 'Hooked blocks in Post Content', () => { - let post; - - test.beforeAll( async ( { requestUtils } ) => { - post = await requestUtils.createPost( { - title: 'Block Hooks', - status: 'publish', - content: dummyBlockContent, + [ + { + name: 'Post Content', + postType: 'post', + blockType: 'core/post-content', + createMethod: 'createPost', + }, + { + name: 'Synced Pattern', + postType: 'wp_block', + blockType: 'core/block', + createMethod: 'createBlock', + }, + ].forEach( ( { name, postType, blockType, createMethod } ) => { + test.describe( `Hooked blocks in ${ name }`, () => { + let postObject, containerPost; + test.beforeAll( async ( { requestUtils } ) => { + postObject = await requestUtils[ createMethod ]( { + title: name, + status: 'publish', + content: dummyBlockContent, + } ); + + await requestUtils.activatePlugin( + 'gutenberg-test-block-hooks' + ); + + if ( postType !== 'post' ) { + // We need a container post to hold our block instance. + containerPost = await requestUtils.createPost( { + title: `Block Hooks in ${ name }`, + status: 'publish', + content: ``, + meta: { + // Prevent Block Hooks from injecting blocks into the container + // post content so they won't distract from the ones injected + // into the block instance. + _wp_ignored_hooked_blocks: '["core/paragraph"]', + }, + } ); + } else { + containerPost = postObject; + } } ); - await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' ); - } ); - - test.afterAll( async ( { requestUtils } ) => { - await requestUtils.deactivatePlugin( 'gutenberg-test-block-hooks' ); - - await requestUtils.deleteAllPosts(); - } ); - - test( 'should insert hooked blocks into post content on frontend', async ( { - page, - } ) => { - await page.goto( `/?p=${ post.id }` ); - await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ - 'wp-block-heading', - getHookedBlockClassName( 'after', 'core/heading' ), - 'dummy-paragraph', - getHookedBlockClassName( 'last_child', 'core/post-content' ), - ] ); - } ); - - test( 'should insert hooked blocks into post content in editor and respect changes made there', async ( { - admin, - editor, - page, - } ) => { - const expectedHookedBlockAfterHeading = { - name: 'core/paragraph', - attributes: { - className: getHookedBlockClassName( - 'after', - 'core/heading' - ), - }, - }; - - const expectedHookedBlockLastChild = { - name: 'core/paragraph', - attributes: { - className: getHookedBlockClassName( - 'last_child', - 'core/post-content' - ), - }, - }; - - await admin.editPost( post.id ); - await expect - .poll( editor.getBlocks ) - .toMatchObject( [ - { name: 'core/heading' }, - expectedHookedBlockAfterHeading, - { name: 'core/paragraph' }, - expectedHookedBlockLastChild, - ] ); - - const hookedBlock = editor.canvas.getByText( - getHookedBlockContent( 'last_child', 'core/post-content' ) - ); - await editor.selectBlocks( hookedBlock ); - await editor.clickBlockToolbarButton( 'Move up' ); - - // Save updated post. - const saveButton = page - .getByRole( 'region', { name: 'Editor top bar' } ) - .getByRole( 'button', { name: 'Save', exact: true } ); - await saveButton.click(); - await page - .getByRole( 'button', { name: 'Dismiss this notice' } ) - .filter( { hasText: 'updated' } ) - .waitFor(); - - // Reload and verify that the new position of the hooked block has been persisted. - await page.reload(); - await expect - .poll( editor.getBlocks ) - .toMatchObject( [ - { name: 'core/heading' }, - expectedHookedBlockAfterHeading, - expectedHookedBlockLastChild, - { name: 'core/paragraph' }, - ] ); - - // Verify that the frontend reflects the changes made in the editor. - await page.goto( `/?p=${ post.id }` ); - await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ - 'wp-block-heading', - getHookedBlockClassName( 'after', 'core/heading' ), - getHookedBlockClassName( 'last_child', 'core/post-content' ), - 'dummy-paragraph', - ] ); - } ); - } ); - - test.describe( 'Hooked blocks in Synced Patterns', () => { - let post, syncedPattern; - test.beforeAll( async ( { requestUtils } ) => { - syncedPattern = await requestUtils.createBlock( { - title: 'Synced Pattern', - status: 'publish', - content: dummyBlockContent, - } ); + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.deactivatePlugin( + 'gutenberg-test-block-hooks' + ); - await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' ); - - post = await requestUtils.createPost( { - title: 'Block Hooks in Synced Patterns', - status: 'publish', - content: ``, - meta: { - // Prevent Block Hooks from injecting blocks into - // post content so they won't distract from the ones - // injected into the synced pattern. - _wp_ignored_hooked_blocks: '["core/paragraph"]', - }, + await requestUtils.deleteAllPosts(); + await requestUtils.deleteAllBlocks(); } ); - } ); - - test.afterAll( async ( { requestUtils } ) => { - await requestUtils.deactivatePlugin( 'gutenberg-test-block-hooks' ); - - await requestUtils.deleteAllPosts(); - await requestUtils.deleteAllBlocks(); - } ); - - test( 'should insert hooked blocks into synced pattern on frontend', async ( { - page, - } ) => { - await page.goto( `/?p=${ post.id }` ); - await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ - 'wp-block-heading', - getHookedBlockClassName( 'after', 'core/heading' ), - 'dummy-paragraph', - getHookedBlockClassName( 'last_child', 'core/block' ), - ] ); - } ); - test( 'should insert hooked blocks into synced pattern in editor and respect changes made there', async ( { - admin, - editor, - page, - } ) => { - const expectedHookedBlockAfterHeading = { - name: 'core/paragraph', - attributes: { - className: getHookedBlockClassName( - 'after', - 'core/heading' - ), - }, - }; - - const expectedHookedBlockLastChild = { - name: 'core/paragraph', - attributes: { - className: getHookedBlockClassName( - 'last_child', - 'core/block' - ), - }, - }; - - await admin.editPost( syncedPattern.id ); - await expect - .poll( editor.getBlocks ) - .toMatchObject( [ - { name: 'core/heading' }, - expectedHookedBlockAfterHeading, - { name: 'core/paragraph' }, - expectedHookedBlockLastChild, + test( `should insert hooked blocks into ${ name } on frontend`, async ( { + page, + } ) => { + await page.goto( `/?p=${ containerPost.id }` ); + await expect( + page.locator( '.entry-content > *' ) + ).toHaveClass( [ + 'wp-block-heading', + getHookedBlockClassName( 'after', 'core/heading' ), + 'dummy-paragraph', + getHookedBlockClassName( 'last_child', blockType ), ] ); + } ); - const hookedBlock = editor.canvas.getByText( - getHookedBlockContent( 'last_child', 'core/block' ) - ); - await editor.selectBlocks( hookedBlock ); - await editor.clickBlockToolbarButton( 'Move up' ); - - // Save updated post. - const saveButton = page - .getByRole( 'region', { name: 'Editor top bar' } ) - .getByRole( 'button', { name: 'Save', exact: true } ); - await saveButton.click(); - await page - .getByRole( 'button', { name: 'Dismiss this notice' } ) - .filter( { hasText: 'updated' } ) - .waitFor(); - - // Reload and verify that the new position of the hooked block has been persisted. - await page.reload(); - await expect - .poll( editor.getBlocks ) - .toMatchObject( [ - { name: 'core/heading' }, - expectedHookedBlockAfterHeading, - expectedHookedBlockLastChild, - { name: 'core/paragraph' }, + test( `should insert hooked blocks into ${ name } in editor and respect changes made there`, async ( { + admin, + editor, + page, + } ) => { + const expectedHookedBlockAfterHeading = { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( + 'after', + 'core/heading' + ), + }, + }; + + const expectedHookedBlockLastChild = { + name: 'core/paragraph', + attributes: { + className: getHookedBlockClassName( + 'last_child', + blockType + ), + }, + }; + + await admin.editPost( postObject.id ); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + { name: 'core/heading' }, + expectedHookedBlockAfterHeading, + { name: 'core/paragraph' }, + expectedHookedBlockLastChild, + ] ); + + const hookedBlock = editor.canvas.getByText( + getHookedBlockContent( 'last_child', blockType ) + ); + await editor.selectBlocks( hookedBlock ); + await editor.clickBlockToolbarButton( 'Move up' ); + + // Save updated post. + const saveButton = page + .getByRole( 'region', { name: 'Editor top bar' } ) + .getByRole( 'button', { name: 'Save', exact: true } ); + await saveButton.click(); + await page + .getByRole( 'button', { name: 'Dismiss this notice' } ) + .filter( { hasText: 'updated' } ) + .waitFor(); + + // Reload and verify that the new position of the hooked block has been persisted. + await page.reload(); + await expect + .poll( editor.getBlocks ) + .toMatchObject( [ + { name: 'core/heading' }, + expectedHookedBlockAfterHeading, + expectedHookedBlockLastChild, + { name: 'core/paragraph' }, + ] ); + + // Verify that the frontend reflects the changes made in the editor. + await page.goto( `/?p=${ containerPost.id }` ); + await expect( + page.locator( '.entry-content > *' ) + ).toHaveClass( [ + 'wp-block-heading', + getHookedBlockClassName( 'after', 'core/heading' ), + getHookedBlockClassName( 'last_child', blockType ), + 'dummy-paragraph', ] ); - - // Verify that the frontend reflects the changes made in the editor. - await page.goto( `/?p=${ post.id }` ); - await expect( page.locator( '.entry-content > *' ) ).toHaveClass( [ - 'wp-block-heading', - getHookedBlockClassName( 'after', 'core/heading' ), - getHookedBlockClassName( 'last_child', 'core/block' ), - 'dummy-paragraph', - ] ); + } ); } ); } ); } ); From 92e7ff49fbf5831d8a5ddaa0719426df53e86c92 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Thu, 13 Feb 2025 18:08:15 +0100 Subject: [PATCH 27/31] Add basic Navigation block coverage --- packages/e2e-tests/plugins/block-hooks.php | 4 ++ .../specs/editor/plugins/block-hooks.spec.js | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php index 70e283060c1c88..142a7e63b1d609 100644 --- a/packages/e2e-tests/plugins/block-hooks.php +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -22,6 +22,10 @@ function gutenberg_test_insert_hooked_blocks( $hooked_blocks, $position, $anchor $hooked_blocks[] = 'core/paragraph'; } + if ( 'core/navigation' === $anchor_block && 'first_child' === $position ) { + $hooked_blocks[] = 'core/home-link'; + } + return $hooked_blocks; } add_filter( 'hooked_block_types', 'gutenberg_test_insert_hooked_blocks', 10, 4 ); diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index ceef247665d1e3..f35864f09f5a44 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -163,4 +163,49 @@ test.describe( 'Block Hooks API', () => { } ); } ); } ); + + test.describe( `Hooked blocks in Navigation Menu`, () => { + let postObject, containerPost; + test.beforeAll( async ( { requestUtils } ) => { + postObject = await requestUtils.createNavigationMenu( { + title: 'Navigation Menu', + status: 'publish', + content: '', + } ); + + await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' ); + + // We need a container post to hold our block instance. + containerPost = await requestUtils.createPost( { + title: `Block Hooks in Navigation Menu`, + status: 'publish', + content: ``, + meta: { + // Prevent Block Hooks from injecting blocks into the container + // post content so they won't distract from the ones injected + // into the block instance. + _wp_ignored_hooked_blocks: '["core/paragraph"]', + }, + } ); + } ); + + test.afterAll( async ( { requestUtils } ) => { + await requestUtils.deactivatePlugin( 'gutenberg-test-block-hooks' ); + + await requestUtils.deleteAllPosts(); + await requestUtils.deleteAllBlocks(); + } ); + + test( `should insert hooked blocks into Navigation Menu on frontend`, async ( { + page, + } ) => { + await page.goto( `/?p=${ containerPost.id }` ); + await expect( + page.locator( '.wp-block-navigation__container > *' ) + ).toHaveClass( [ + 'wp-block-navigation-item wp-block-home-link', + 'wp-block-page-list', + ] ); + } ); + } ); } ); From fe75a0d3ac20487088507d6eb6a79999938b48cf Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Thu, 13 Feb 2025 18:18:37 +0100 Subject: [PATCH 28/31] Slightly less basic --- packages/e2e-tests/plugins/block-hooks.php | 4 ++++ test/e2e/specs/editor/plugins/block-hooks.spec.js | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php index 142a7e63b1d609..d2d723b73013d0 100644 --- a/packages/e2e-tests/plugins/block-hooks.php +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -26,6 +26,10 @@ function gutenberg_test_insert_hooked_blocks( $hooked_blocks, $position, $anchor $hooked_blocks[] = 'core/home-link'; } + if ( 'core/navigation-link' === $anchor_block && 'after' === $position ) { + $hooked_blocks[] = 'core/page-list'; + } + return $hooked_blocks; } add_filter( 'hooked_block_types', 'gutenberg_test_insert_hooked_blocks', 10, 4 ); diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index f35864f09f5a44..f44233252ff375 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -170,7 +170,8 @@ test.describe( 'Block Hooks API', () => { postObject = await requestUtils.createNavigationMenu( { title: 'Navigation Menu', status: 'publish', - content: '', + content: + '', // '', } ); await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' ); @@ -204,6 +205,7 @@ test.describe( 'Block Hooks API', () => { page.locator( '.wp-block-navigation__container > *' ) ).toHaveClass( [ 'wp-block-navigation-item wp-block-home-link', + ' wp-block-navigation-item wp-block-navigation-link', 'wp-block-page-list', ] ); } ); From 46153253e3d2aea0ec47d3160dd60d2964d2a7be Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Thu, 13 Feb 2025 19:14:30 +0100 Subject: [PATCH 29/31] More Nav block coverage --- .../specs/editor/plugins/block-hooks.spec.js | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index f44233252ff375..822b80cde225f5 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -209,5 +209,84 @@ test.describe( 'Block Hooks API', () => { 'wp-block-page-list', ] ); } ); + + test( `should insert hooked blocks into Navigation Menu in editor and respect changes made there`, async ( { + admin, + editor, + page, + } ) => { + await admin.visitSiteEditor( { + postId: postObject.id, + postType: 'wp_navigation', + canvas: 'edit', + } ); + + // Since the Navigation block is a controlled block, we need + // to specify its client ID when calling `getBlocks`. + let navigationBlock = editor.canvas.getByRole( 'document', { + name: 'Block: Navigation', + } ); + let navigationClientId = + await navigationBlock.getAttribute( 'data-block' ); + + await expect + .poll( () => + editor.getBlocks( { + clientId: navigationClientId, + } ) + ) + .toMatchObject( [ + { name: 'core/home-link' }, + { name: 'core/navigation-link' }, + { name: 'core/page-list' }, + ] ); + + const hookedBlock = editor.canvas.getByRole( 'document', { + name: 'Block: Home Link', + } ); + await editor.selectBlocks( hookedBlock ); + await editor.clickBlockToolbarButton( 'Move right' ); + + // Save updated post. + const saveButton = page + .getByRole( 'region', { name: 'Editor top bar' } ) + .getByRole( 'button', { name: 'Save', exact: true } ); + await saveButton.click(); + await page + .getByRole( 'button', { name: 'Dismiss this notice' } ) + .filter( { hasText: 'updated' } ) + .waitFor(); + + // Reload and verify that the new position of the hooked block has been persisted. + await page.reload(); + + navigationBlock = editor.canvas.getByRole( 'document', { + name: 'Block: Navigation', + } ); + navigationClientId = + await navigationBlock.getAttribute( 'data-block' ); + + await expect + .poll( () => + editor.getBlocks( { + clientId: navigationClientId, + } ) + ) + .toMatchObject( [ + { name: 'core/navigation-link' }, + { name: 'core/home-link' }, + { name: 'core/page-list' }, + ] ); + + // Verify that the frontend reflects the changes made in the editor. + await page.goto( `/?p=${ containerPost.id }` ); + await expect( + page.locator( '.wp-block-navigation__container > *' ) + ).toHaveClass( [ + ' wp-block-navigation-item wp-block-navigation-link', + 'wp-block-navigation-item wp-block-home-link', + 'wp-block-page-list', + ] ); + } ); } ); } ); From 495e14a4bd64cfbce95854e376eb0b900b525224 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Thu, 13 Feb 2025 22:43:35 +0100 Subject: [PATCH 30/31] WPCS --- packages/e2e-tests/plugins/block-hooks.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/e2e-tests/plugins/block-hooks.php b/packages/e2e-tests/plugins/block-hooks.php index d2d723b73013d0..34905954770554 100644 --- a/packages/e2e-tests/plugins/block-hooks.php +++ b/packages/e2e-tests/plugins/block-hooks.php @@ -23,11 +23,11 @@ function gutenberg_test_insert_hooked_blocks( $hooked_blocks, $position, $anchor } if ( 'core/navigation' === $anchor_block && 'first_child' === $position ) { - $hooked_blocks[] = 'core/home-link'; + $hooked_blocks[] = 'core/home-link'; } if ( 'core/navigation-link' === $anchor_block && 'after' === $position ) { - $hooked_blocks[] = 'core/page-list'; + $hooked_blocks[] = 'core/page-list'; } return $hooked_blocks; @@ -62,12 +62,12 @@ function gutenberg_register_wp_ignored_hooked_blocks_meta() { 'post', '_wp_ignored_hooked_blocks', array( - 'show_in_rest' => true, - 'single' => true, - 'type' => 'string', - 'auth_callback' => function() { + 'show_in_rest' => true, + 'single' => true, + 'type' => 'string', + 'auth_callback' => function () { return current_user_can( 'edit_posts' ); - } + }, ) ); } From 26c253930320695fa4bab5ba87cd4d18a3a0f393 Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Fri, 14 Feb 2025 17:41:00 +0100 Subject: [PATCH 31/31] Remove stray comment --- test/e2e/specs/editor/plugins/block-hooks.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/specs/editor/plugins/block-hooks.spec.js b/test/e2e/specs/editor/plugins/block-hooks.spec.js index 822b80cde225f5..5289f2a2d86bbb 100644 --- a/test/e2e/specs/editor/plugins/block-hooks.spec.js +++ b/test/e2e/specs/editor/plugins/block-hooks.spec.js @@ -171,7 +171,7 @@ test.describe( 'Block Hooks API', () => { title: 'Navigation Menu', status: 'publish', content: - '', // '', + '', } ); await requestUtils.activatePlugin( 'gutenberg-test-block-hooks' );