mirrored from git://develop.git.wordpress.org/
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Backports a new block context feature from Gutenberg. The purpose of this feature is to be able to establish values in a block hierarchy which can be consumed by blocks anywhere lower in the same hierarchy. These values can be established either by the framework, or by other blocks which provide these values. See documentation: https://github.com/WordPress/gutenberg/blob/master/docs/designers-developers/developers/block-api/block-context.md Props aduth, epiqueras. Fixes #49927. git-svn-id: https://develop.svn.wordpress.org/trunk@48224 602fd350-edb4-49c9-b593-d223f7449a82
- Loading branch information
Showing
3 changed files
with
261 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,215 @@ | ||
<?php | ||
/** | ||
* WP_Block_Context Tests | ||
* | ||
* @package WordPress | ||
* @subpackage Blocks | ||
* @since 5.5.0 | ||
*/ | ||
|
||
/** | ||
* Tests for WP_Block_Context | ||
* | ||
* @since 5.5.0 | ||
* | ||
* @group blocks | ||
*/ | ||
class WP_Block_Context_Test extends WP_UnitTestCase { | ||
|
||
/** | ||
* Registered block names. | ||
* | ||
* @var string[] | ||
*/ | ||
private $registered_block_names = array(); | ||
|
||
/** | ||
* Sets up each test method. | ||
*/ | ||
public function setUp() { | ||
global $post; | ||
|
||
parent::setUp(); | ||
|
||
$args = array( | ||
'post_content' => 'example', | ||
'post_excerpt' => '', | ||
); | ||
|
||
$post = $this->factory()->post->create_and_get( $args ); | ||
setup_postdata( $post ); | ||
} | ||
|
||
/** | ||
* Tear down each test method. | ||
*/ | ||
public function tearDown() { | ||
parent::tearDown(); | ||
|
||
while ( ! empty( $this->registered_block_names ) ) { | ||
$block_name = array_pop( $this->registered_block_names ); | ||
unregister_block_type( $block_name ); | ||
} | ||
} | ||
|
||
/** | ||
* Registers a block type. | ||
* | ||
* @param string|WP_Block_Type $name Block type name including namespace, or alternatively a | ||
* complete WP_Block_Type instance. In case a WP_Block_Type | ||
* is provided, the $args parameter will be ignored. | ||
* @param array $args { | ||
* Optional. Array of block type arguments. Any arguments may be defined, however the | ||
* ones described below are supported by default. Default empty array. | ||
* | ||
* @type callable $render_callback Callback used to render blocks of this block type. | ||
* } | ||
*/ | ||
protected function register_block_type( $name, $args ) { | ||
register_block_type( $name, $args ); | ||
|
||
$this->registered_block_names[] = $name; | ||
} | ||
|
||
/** | ||
* Tests that a block which provides context makes that context available to | ||
* its inner blocks. | ||
* | ||
* @ticket 49927 | ||
*/ | ||
function test_provides_block_context() { | ||
$provided_context = array(); | ||
|
||
$this->register_block_type( | ||
'gutenberg/test-context-provider', | ||
array( | ||
'attributes' => array( | ||
'contextWithAssigned' => array( | ||
'type' => 'number', | ||
), | ||
'contextWithDefault' => array( | ||
'type' => 'number', | ||
'default' => 0, | ||
), | ||
'contextWithoutDefault' => array( | ||
'type' => 'number', | ||
), | ||
'contextNotRequested' => array( | ||
'type' => 'number', | ||
), | ||
), | ||
'provides_context' => array( | ||
'gutenberg/contextWithAssigned' => 'contextWithAssigned', | ||
'gutenberg/contextWithDefault' => 'contextWithDefault', | ||
'gutenberg/contextWithoutDefault' => 'contextWithoutDefault', | ||
'gutenberg/contextNotRequested' => 'contextNotRequested', | ||
), | ||
) | ||
); | ||
|
||
$this->register_block_type( | ||
'gutenberg/test-context-consumer', | ||
array( | ||
'uses_context' => array( | ||
'gutenberg/contextWithDefault', | ||
'gutenberg/contextWithAssigned', | ||
'gutenberg/contextWithoutDefault', | ||
), | ||
'render_callback' => function( $attributes, $content, $block ) use ( &$provided_context ) { | ||
$provided_context[] = $block->context; | ||
|
||
return ''; | ||
}, | ||
) | ||
); | ||
|
||
$parsed_blocks = parse_blocks( | ||
'<!-- wp:gutenberg/test-context-provider {"contextWithAssigned":10} -->' . | ||
'<!-- wp:gutenberg/test-context-consumer /-->' . | ||
'<!-- /wp:gutenberg/test-context-provider -->' | ||
); | ||
|
||
render_block( $parsed_blocks[0] ); | ||
|
||
$this->assertEquals( | ||
array( | ||
'gutenberg/contextWithDefault' => 0, | ||
'gutenberg/contextWithAssigned' => 10, | ||
), | ||
$provided_context[0] | ||
); | ||
} | ||
|
||
/** | ||
* Tests that a block can receive default-provided context through | ||
* render_block. | ||
* | ||
* @ticket 49927 | ||
*/ | ||
function test_provides_default_context() { | ||
global $post; | ||
|
||
$provided_context = array(); | ||
|
||
$this->register_block_type( | ||
'gutenberg/test-context-consumer', | ||
array( | ||
'uses_context' => array( 'postId', 'postType' ), | ||
'render_callback' => function( $attributes, $content, $block ) use ( &$provided_context ) { | ||
$provided_context[] = $block->context; | ||
|
||
return ''; | ||
}, | ||
) | ||
); | ||
|
||
$parsed_blocks = parse_blocks( '<!-- wp:gutenberg/test-context-consumer /-->' ); | ||
|
||
render_block( $parsed_blocks[0] ); | ||
|
||
$this->assertEquals( | ||
array( | ||
'postId' => $post->ID, | ||
'postType' => $post->post_type, | ||
), | ||
$provided_context[0] | ||
); | ||
} | ||
|
||
/** | ||
* Tests that default block context can be filtered. | ||
* | ||
* @ticket 49927 | ||
*/ | ||
function test_default_context_is_filterable() { | ||
$provided_context = array(); | ||
|
||
$this->register_block_type( | ||
'gutenberg/test-context-consumer', | ||
array( | ||
'uses_context' => array( 'example' ), | ||
'render_callback' => function( $attributes, $content, $block ) use ( &$provided_context ) { | ||
$provided_context[] = $block->context; | ||
|
||
return ''; | ||
}, | ||
) | ||
); | ||
|
||
$filter_block_context = function( $context ) { | ||
$context['example'] = 'ok'; | ||
return $context; | ||
}; | ||
|
||
$parsed_blocks = parse_blocks( '<!-- wp:gutenberg/test-context-consumer /-->' ); | ||
|
||
add_filter( 'render_block_context', $filter_block_context ); | ||
|
||
render_block( $parsed_blocks[0] ); | ||
|
||
remove_filter( 'render_block_context', $filter_block_context ); | ||
|
||
$this->assertEquals( array( 'example' => 'ok' ), $provided_context[0] ); | ||
} | ||
|
||
} |