diff --git a/phpcs.xml.dist b/phpcs.xml.dist index 32c6acc06d8b1..453ef5c794745 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -244,6 +244,7 @@ + diff --git a/tests/phpunit/tests/theme/base.php b/tests/phpunit/tests/theme/base.php new file mode 100644 index 0000000000000..182efa5df81e4 --- /dev/null +++ b/tests/phpunit/tests/theme/base.php @@ -0,0 +1,66 @@ +orig_theme_dir = $GLOBALS['wp_theme_directories']; + $this->theme_root = realpath( DIR_TESTDATA . '/themedir1' ); + + // /themes is necessary as theme.php functions assume /themes is the root if there is only one root. + $GLOBALS['wp_theme_directories'] = array( WP_CONTENT_DIR . '/themes', $this->theme_root ); + + // Set up the new root. + add_filter( 'theme_root', array( $this, 'filter_set_theme_root' ) ); + add_filter( 'stylesheet_root', array( $this, 'filter_set_theme_root' ) ); + add_filter( 'template_root', array( $this, 'filter_set_theme_root' ) ); + + // Clear caches. + wp_clean_themes_cache(); + unset( $GLOBALS['wp_themes'] ); + } + + public function tear_down() { + $GLOBALS['wp_theme_directories'] = $this->orig_theme_dir; + + // Clear up the filters to modify the theme root. + remove_filter( 'theme_root', array( $this, 'filter_set_theme_root' ) ); + remove_filter( 'stylesheet_root', array( $this, 'filter_set_theme_root' ) ); + remove_filter( 'template_root', array( $this, 'filter_set_theme_root' ) ); + + wp_clean_themes_cache(); + unset( $GLOBALS['wp_themes'] ); + + parent::tear_down(); + } + + /** + * Cleans up global scope. + * + * @global WP_Styles $wp_styles + */ + public function clean_up_global_scope() { + global $wp_styles; + parent::clean_up_global_scope(); + $wp_styles = null; + } + + public function filter_set_theme_root() { + return $this->theme_root; + } +} diff --git a/tests/phpunit/tests/theme/wpAddGlobalStylesForBlocks.php b/tests/phpunit/tests/theme/wpAddGlobalStylesForBlocks.php index c3286f813e010..33bf1d52c836f 100644 --- a/tests/phpunit/tests/theme/wpAddGlobalStylesForBlocks.php +++ b/tests/phpunit/tests/theme/wpAddGlobalStylesForBlocks.php @@ -1,81 +1,117 @@ test_blocks ) ) { + foreach ( $this->test_blocks as $test_block ) { + unregister_block_type( $test_block ); + } + $this->test_blocks = array(); + } + + parent::tear_down(); + } /** - * Original theme directory. - * - * @var string + * @ticket 56915 */ - private $orig_theme_dir; + public function test_third_party_blocks_inline_styles_not_register_to_global_styles() { + switch_theme( 'block-theme' ); - public function set_up() { - parent::set_up(); + wp_register_style( 'global-styles', false, array(), true, true ); + wp_add_global_styles_for_blocks(); - $this->orig_theme_dir = $GLOBALS['wp_theme_directories']; - $this->theme_root = realpath( DIR_TESTDATA . '/themedir1' ); + $this->assertNotContains( + '.wp-block-my-third-party-block{background-color: hotpink;}', + $this->get_global_styles() + ); + } + + /** + * @ticket 56915 + */ + public function test_third_party_blocks_inline_styles_get_registered_to_global_styles() { + $this->set_up_third_party_block(); + + wp_register_style( 'global-styles', false, array(), true, true ); - // /themes is necessary as theme.php functions assume /themes is the root if there is only one root. - $GLOBALS['wp_theme_directories'] = array( WP_CONTENT_DIR . '/themes', $this->theme_root ); + $this->assertNotContains( + '.wp-block-my-third-party-block{background-color: hotpink;}', + $this->get_global_styles(), + 'Third party block inline style should not be registered before running wp_add_global_styles_for_blocks()' + ); - // Set up the new root. - add_filter( 'theme_root', array( $this, 'filter_set_theme_root' ) ); - add_filter( 'stylesheet_root', array( $this, 'filter_set_theme_root' ) ); - add_filter( 'template_root', array( $this, 'filter_set_theme_root' ) ); + wp_add_global_styles_for_blocks(); - // Clear caches. - wp_clean_themes_cache(); - unset( $GLOBALS['wp_themes'] ); + $this->assertContains( + '.wp-block-my-third-party-block{background-color: hotpink;}', + $this->get_global_styles(), + 'Third party block inline style should be registered after running wp_add_global_styles_for_blocks()' + ); } - public function tear_down() { - $GLOBALS['wp_theme_directories'] = $this->orig_theme_dir; + /** + * @ticket 56915 + */ + public function test_third_party_blocks_inline_styles_get_registered_to_global_styles_when_per_block() { + $this->set_up_third_party_block(); + add_filter( 'should_load_separate_core_block_assets', '__return_true' ); - // Clear up the filters to modify the theme root. - remove_filter( 'theme_root', array( $this, 'filter_set_theme_root' ) ); - remove_filter( 'stylesheet_root', array( $this, 'filter_set_theme_root' ) ); - remove_filter( 'template_root', array( $this, 'filter_set_theme_root' ) ); + wp_register_style( 'global-styles', false, array(), true, true ); - wp_clean_themes_cache(); - unset( $GLOBALS['wp_themes'] ); + $this->assertNotContains( + '.wp-block-my-third-party-block{background-color: hotpink;}', + $this->get_global_styles(), + 'Third party block inline style should not be registered before running wp_add_global_styles_for_blocks()' + ); - parent::tear_down(); + wp_add_global_styles_for_blocks(); + + $this->assertContains( + '.wp-block-my-third-party-block{background-color: hotpink;}', + $this->get_global_styles(), + 'Third party block inline style should be registered after running wp_add_global_styles_for_blocks()' + ); } /** - * Cleans up global scope. - * - * @global WP_Styles $wp_styles + * @ticket 56915 */ - public function clean_up_global_scope() { - global $wp_styles; - parent::clean_up_global_scope(); - $wp_styles = null; - } + public function test_third_party_blocks_inline_styles_get_rendered() { + $this->set_up_third_party_block(); + add_filter( 'should_load_separate_core_block_assets', '__return_true' ); - public function filter_set_theme_root() { - return $this->theme_root; + wp_register_style( 'global-styles', false, array(), true, true ); + wp_enqueue_style( 'global-styles' ); + wp_add_global_styles_for_blocks(); + + $this->assertStringContainsString( + '.wp-block-my-third-party-block{background-color: hotpink;}', + get_echo( 'wp_print_styles' ) + ); } - public function test_styles_for_third_party_blocks() { + private function set_up_third_party_block() { switch_theme( 'block-theme' ); - // The 3rd party block styles are only missing - // if the assets are loaded per block. - add_filter( 'should_load_separate_core_block_assets', '__return_true' ); - $name = 'my/third-party-block'; $settings = array( 'icon' => 'text', @@ -83,12 +119,12 @@ public function test_styles_for_third_party_blocks() { 'render_callback' => 'foo', ); register_block_type( $name, $settings ); - wp_enqueue_global_styles(); - unregister_block_type( $name ); - $this->assertStringContainsString( '.wp-block-my-third-party-block{background-color: hotpink;}', get_echo( 'wp_print_styles' ), '3rd party block styles are included' ); - - switch_theme( WP_DEFAULT_THEME ); + $this->test_blocks[] = $name; } + private function get_global_styles() { + $actual = wp_styles()->get_data( 'global-styles', 'after' ); + return is_array( $actual ) ? $actual : array(); + } }