From b52cd853902cad9cfb18373e8f4840ebf56d703b Mon Sep 17 00:00:00 2001 From: Bernie Reiter Date: Wed, 27 Sep 2023 13:08:35 +0000 Subject: [PATCH] Blocks: Add unit test coverage for Patterns registry. Prior to this changeset, we did not seem to have any unit test coverage for the Patterns registry (`WP_Block_Patterns_Registry`). With Block Hooks logic recently added ([56649]), it is particularly advisable to add some unit tests to the `get_registered()` and `get_all_registered()` methods to guard hooked block insertion against regressions. Fixes #59476. git-svn-id: https://develop.svn.wordpress.org/trunk@56733 602fd350-edb4-49c9-b593-d223f7449a82 --- .../tests/blocks/wpBlockPatternsRegistry.php | 439 ++++++++++++++++++ 1 file changed, 439 insertions(+) create mode 100644 tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php diff --git a/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php b/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php new file mode 100644 index 0000000000000..8eb4fce78b251 --- /dev/null +++ b/tests/phpunit/tests/blocks/wpBlockPatternsRegistry.php @@ -0,0 +1,439 @@ +registry = new WP_Block_Patterns_Registry(); + } + + /** + * Tear down each test method. + * + * @since 6.4.0 + */ + public function tear_down() { + $this->registry = null; + + $registry = WP_Block_Type_Registry::get_instance(); + + if ( $registry->is_registered( 'tests/my-block' ) ) { + $registry->unregister( 'tests/my-block' ); + } + + parent::tear_down(); + } + + /** + * Should reject missing pattern name. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * + * @expectedIncorrectUsage WP_Block_Patterns_Registry::register + */ + public function test_missing_name() { + $name = null; + $settings = array( + 'title' => 'Test Pattern', + 'content' => '

One

', + ); + + $success = $this->registry->register( $name, $settings ); + $this->assertFalse( $success ); + } + + /** + * Should reject non-string name. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * + * @expectedIncorrectUsage WP_Block_Patterns_Registry::register + */ + public function test_invalid_non_string_name() { + $name = 123; + $settings = array( + 'title' => 'Test Pattern', + 'content' => '

One

', + ); + + $success = $this->registry->register( $name, $settings ); + $this->assertFalse( $success ); + } + + /** + * Should missing title. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * + * @expectedIncorrectUsage WP_Block_Patterns_Registry::register + */ + public function test_missing_title() { + $name = 'test/pattern'; + $settings = array( + 'content' => '

One

', + ); + + $success = $this->registry->register( $name, $settings ); + $this->assertFalse( $success ); + } + + /** + * Should reject non-string title. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * + * @expectedIncorrectUsage WP_Block_Patterns_Registry::register + */ + public function test_invalid_non_string_title() { + $name = 'test/pattern'; + $settings = array( + 'title' => 456, + 'content' => '

One

', + ); + + $success = $this->registry->register( $name, $settings ); + $this->assertFalse( $success ); + } + + /** + * Should reject missing content. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * + * @expectedIncorrectUsage WP_Block_Patterns_Registry::register + */ + public function test_missing_content() { + $name = 'Test Pattern'; + $settings = array( + 'title' => 'Test Pattern', + ); + + $success = $this->registry->register( $name, $settings ); + $this->assertFalse( $success ); + } + + /** + * Should reject non-string content. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * + * @expectedIncorrectUsage WP_Block_Patterns_Registry::register + */ + public function test_invalid_non_string_content() { + $name = 'Test Pattern'; + $settings = array( + 'title' => 'Test Pattern', + 'content' => 789, + ); + + $success = $this->registry->register( $name, $settings ); + $this->assertFalse( $success ); + } + + /** + * Should accept valid pattern. + * + * @covers WP_Block_Patterns_Registry::register + * + * @ticket 59476 + */ + public function test_register_block_pattern() { + $name = 'test/pattern'; + $settings = array( + 'title' => 'Pattern One', + 'content' => '

One

', + ); + + $success = $this->registry->register( $name, $settings ); + $this->assertTrue( $success ); + } + + /** + * Unregistering should fail if a pattern is not registered. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::unregister + * + * @expectedIncorrectUsage WP_Block_Patterns_Registry::unregister + */ + public function test_unregister_not_registered_block() { + $success = $this->registry->unregister( 'test/unregistered' ); + $this->assertFalse( $success ); + } + + /** + * Should unregister existing patterns. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::unregister + */ + public function test_unregister_block_pattern() { + $name = 'test/pattern'; + $settings = array( + 'title' => 'Pattern One', + 'content' => '

One

', + ); + + $this->registry->register( $name, $settings ); + $success = $this->registry->unregister( $name ); + $this->assertTrue( $success ); + } + + /** + * Should find all registered patterns. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * @covers WP_Block_Patterns_Registry::get_all_registered + */ + public function test_get_all_registered() { + $pattern_one = array( + 'title' => 'Pattern One', + 'content' => '

One

', + ); + $this->registry->register( 'test/one', $pattern_one ); + + $pattern_two = array( + 'title' => 'Pattern Two', + 'content' => '

Two

', + ); + $this->registry->register( 'test/two', $pattern_two ); + + $pattern_three = array( + 'title' => 'Pattern Three', + 'content' => '

Three

', + ); + $this->registry->register( 'test/three', $pattern_three ); + + $pattern_one['name'] = 'test/one'; + $pattern_two['name'] = 'test/two'; + $pattern_three['name'] = 'test/three'; + + $expected = array( + $pattern_one, + $pattern_two, + $pattern_three, + ); + + $registered = $this->registry->get_all_registered(); + $this->assertSame( $expected, $registered ); + } + + /** + * Should not find pattern that's not registered. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * @covers WP_Block_Patterns_Registry::get_registered + */ + public function test_get_registered_rejects_unknown_pattern_name() { + $pattern_one = array( + 'title' => 'Pattern One', + 'content' => '

One

', + ); + $this->registry->register( 'test/one', $pattern_one ); + + $pattern_two = array( + 'title' => 'Pattern Two', + 'content' => '

Two

', + ); + $this->registry->register( 'test/two', $pattern_two ); + + $pattern = $this->registry->get_registered( 'test/three' ); + $this->assertNull( $pattern ); + } + + /** + * Should find registered pattern by name. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * @covers WP_Block_Patterns_Registry::get_registered + */ + public function test_get_registered() { + $pattern_one = array( + 'title' => 'Pattern One', + 'content' => '

One

', + ); + $this->registry->register( 'test/one', $pattern_one ); + + $pattern_two = array( + 'title' => 'Pattern Two', + 'content' => '

Two

', + ); + $this->registry->register( 'test/two', $pattern_two ); + + $pattern_three = array( + 'title' => 'Pattern Three', + 'content' => '

Three

', + ); + $this->registry->register( 'test/three', $pattern_three ); + + $pattern_two['name'] = 'test/two'; + + $pattern = $this->registry->get_registered( 'test/two' ); + $this->assertSame( $pattern_two, $pattern ); + } + + /** + * Should insert hooked blocks into registered patterns. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * @covers WP_Block_Patterns_Registry::get_all_registered + */ + public function test_get_all_registered_includes_hooked_blocks() { + register_block_type( + 'tests/my-block', + array( + 'block_hooks' => array( + 'core/paragraph' => 'after', + ), + ) + ); + + $pattern_one = array( + 'title' => 'Pattern One', + 'content' => '

One

', + ); + $this->registry->register( 'test/one', $pattern_one ); + + $pattern_two = array( + 'title' => 'Pattern Two', + 'content' => '

Two

', + ); + $this->registry->register( 'test/two', $pattern_two ); + + $pattern_three = array( + 'title' => 'Pattern Three', + 'content' => '

Three

', + ); + $this->registry->register( 'test/three', $pattern_three ); + + $pattern_one['name'] = 'test/one'; + $pattern_two['name'] = 'test/two'; + $pattern_two['content'] .= ''; + $pattern_three['name'] = 'test/three'; + $pattern_three['content'] .= ''; + + $expected = array( + $pattern_one, + $pattern_two, + $pattern_three, + ); + + $registered = $this->registry->get_all_registered(); + $this->assertSame( $expected, $registered ); + } + + /** + * Should insert hooked blocks into registered patterns. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * @covers WP_Block_Patterns_Registry::get_registered + */ + public function test_get_registered_includes_hooked_blocks() { + register_block_type( + 'tests/my-block', + array( + 'block_hooks' => array( + 'core/heading' => 'before', + ), + ) + ); + + $pattern_one = array( + 'title' => 'Pattern One', + 'content' => '

One

', + ); + $this->registry->register( 'test/one', $pattern_one ); + + $pattern_two = array( + 'title' => 'Pattern Two', + 'content' => '

Two

', + ); + $this->registry->register( 'test/two', $pattern_two ); + + $pattern_one['name'] = 'test/one'; + $pattern_one['content'] = '' . $pattern_one['content']; + + $pattern = $this->registry->get_registered( 'test/one' ); + $this->assertSame( $pattern_one, $pattern ); + } + + /** + * Should return false for pattern that's not registered. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * @covers WP_Block_Patterns_Registry::is_registered + */ + public function test_is_registered_for_unknown_pattern() { + $pattern = $this->registry->is_registered( 'test/one' ); + $this->assertFalse( $pattern ); + } + + /** + * Should return true if pattern is registered. + * + * @ticket 59476 + * + * @covers WP_Block_Patterns_Registry::register + * @covers WP_Block_Patterns_Registry::is_registered + */ + public function test_is_registered_for_known_pattern() { + $pattern_one = array( + 'title' => 'Pattern One', + 'content' => '

One

', + ); + $this->registry->register( 'test/one', $pattern_one ); + + $result = $this->registry->is_registered( 'test/one' ); + $this->assertTrue( $result ); + } +}