From f2b0c16b9d84e4e79022d12dfceed66621c1f56d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Tue, 22 Nov 2022 13:50:03 +0100 Subject: [PATCH 01/15] Bail early for given origin --- .../class-wp-theme-json-resolver-6-2.php | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php b/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php index 7adb37ffbd9e0..c52b06285804f 100644 --- a/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php +++ b/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php @@ -57,4 +57,62 @@ public static function _clean_cached_data_upon_upgrading( $upgrader, $options ) } } + /** + * Returns the data merged from multiple origins. + * + * There are four sources of data (origins) for a site: + * + * - default => WordPress + * - blocks => each one of the blocks provides data for itself + * - theme => the active theme + * - custom => data provided by the user + * + * The custom's has higher priority than the theme's, the theme's higher than blocks', + * and block's higher than default's. + * + * Unlike the getters + * {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_core_data/ get_core_data}, + * {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_theme_data/ get_theme_data}, + * and {@link https://developer.wordpress.org/reference/classes/wp_theme_json_resolver/get_user_data/ get_user_data}, + * this method returns data after it has been merged with the previous origins. + * This means that if the same piece of data is declared in different origins + * (default, blocks, theme, custom), the last origin overrides the previous. + * + * For example, if the user has set a background color + * for the paragraph block, and the theme has done it as well, + * the user preference wins. + * + * @param string $origin Optional. To what level should we merge data:'default', 'blocks', 'theme' or 'custom'. + * 'custom' is used as default value as well as fallback value if the origin is unknown. + * + * @return WP_Theme_JSON + */ + public static function get_merged_data( $origin = 'custom' ) { + if ( is_array( $origin ) ) { + _deprecated_argument( __FUNCTION__, '5.9.0' ); + } + + $result = static::get_core_data(); + if ( 'default' === $origin ) { + $result->set_spacing_sizes(); + return $result; + } + + $result->merge( static::get_block_data() ); + if ( 'blocks' === $origin ) { + $result->set_spacing_sizes(); + return $result; + } + + $result->merge( static::get_theme_data() ); + if ( 'theme' === $origin ) { + $result->set_spacing_sizes(); + return $result; + } + + $result->merge( static::get_user_data() ); + + $result->set_spacing_sizes(); + return $result; + } } From 4683653f050edcadf4343dea886c7482eef53773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Thu, 24 Nov 2022 12:32:08 +0100 Subject: [PATCH 02/15] Remove method from experimental, it is stable --- ...class-wp-theme-json-resolver-gutenberg.php | 43 ------------------- 1 file changed, 43 deletions(-) diff --git a/lib/experimental/class-wp-theme-json-resolver-gutenberg.php b/lib/experimental/class-wp-theme-json-resolver-gutenberg.php index 8974241e43a88..fd13681e5a12e 100644 --- a/lib/experimental/class-wp-theme-json-resolver-gutenberg.php +++ b/lib/experimental/class-wp-theme-json-resolver-gutenberg.php @@ -165,47 +165,4 @@ private static function remove_JSON_comments( $array ) { return $array; } - /** - * Returns the data merged from multiple origins. - * - * There are three sources of data (origins) for a site: - * default, theme, and custom. The custom's has higher priority - * than the theme's, and the theme's higher than default's. - * - * Unlike the getters {@link get_core_data}, - * {@link get_theme_data}, and {@link get_user_data}, - * this method returns data after it has been merged - * with the previous origins. This means that if the same piece of data - * is declared in different origins (user, theme, and core), - * the last origin overrides the previous. - * - * For example, if the user has set a background color - * for the paragraph block, and the theme has done it as well, - * the user preference wins. - * - * @since 5.8.0 - * @since 5.9.0 Added user data, removed the `$settings` parameter, - * added the `$origin` parameter. - * - * @param string $origin Optional. To what level should we merge data. - * Valid values are 'theme' or 'custom'. Default 'custom'. - * @return WP_Theme_JSON - */ - public static function get_merged_data( $origin = 'custom' ) { - if ( is_array( $origin ) ) { - _deprecated_argument( __FUNCTION__, '5.9' ); - } - - $result = new WP_Theme_JSON_Gutenberg(); - $result->merge( static::get_core_data() ); - $result->merge( static::get_block_data() ); - $result->merge( static::get_theme_data() ); - if ( 'custom' === $origin ) { - $result->merge( static::get_user_data() ); - } - // Generate the default spacing sizes presets. - $result->set_spacing_sizes(); - - return $result; - } } From 1eabb78385506ed689e9d3b8ba85a5a6af874c58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Thu, 24 Nov 2022 12:38:43 +0100 Subject: [PATCH 03/15] Only call set spacing presets when necessary --- lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php b/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php index c52b06285804f..2499663972cfc 100644 --- a/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php +++ b/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php @@ -100,7 +100,6 @@ public static function get_merged_data( $origin = 'custom' ) { $result->merge( static::get_block_data() ); if ( 'blocks' === $origin ) { - $result->set_spacing_sizes(); return $result; } @@ -111,8 +110,6 @@ public static function get_merged_data( $origin = 'custom' ) { } $result->merge( static::get_user_data() ); - - $result->set_spacing_sizes(); return $result; } } From 845495d85f4f48685322268e909c31b119b659bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Thu, 24 Nov 2022 13:03:08 +0100 Subject: [PATCH 04/15] Add test coverage per origin --- phpunit/class-wp-theme-json-resolver-test.php | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/phpunit/class-wp-theme-json-resolver-test.php b/phpunit/class-wp-theme-json-resolver-test.php index 153db8c560679..062db4148172a 100644 --- a/phpunit/class-wp-theme-json-resolver-test.php +++ b/phpunit/class-wp-theme-json-resolver-test.php @@ -358,4 +358,54 @@ public function test_get_user_data_from_wp_global_styles_does_not_use_uncached_q $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( $theme ); $this->assertEmpty( $user_cpt, 'User CPT is expected to be empty.' ); } + + /** + * @covers WP_Theme_JSON_Resolver::get_merged_data + */ + public function test_get_merged_data_returns_origin_default() { + switch_theme( 'block-theme' ); // make sure there is data from the theme origin + $settings = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'default' )->get_settings(); + $this->assertTrue( isset( $settings['color']['palette']['default'] ) ); + $this->assertFalse( isset( $settings['color']['palette']['theme'] ) ); + $this->assertFalse( isset( $settings['color']['palette']['custom'] ) ); + } + + /** + * @covers WP_Theme_JSON_Resolver::get_merged_data + */ + public function test_get_merged_data_returns_origin_theme() { + switch_theme( 'block-theme' ); // make sure there is data from the theme origin + $settings = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'theme' )->get_settings(); + $this->assertTrue( isset( $settings['color']['palette']['default'] ) ); + $this->assertTrue( isset( $settings['color']['palette']['theme'] ) ); + $this->assertFalse( isset( $settings['color']['palette']['custom'] ) ); + } + + /** + * @covers WP_Theme_JSON_Resolver::get_merged_data + */ + public function test_get_merged_data_returns_origin_custom() { + switch_theme( 'block-theme' ); // make sure there is data from the theme origin + + // start saving user data + wp_set_current_user( self::$administrator_id ); + $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); + $config = json_decode( $user_cpt['post_content'], true ); + $config['settings']['color']['palette']['custom'] = array( + array( + 'color' => 'hotpink', + 'name' => 'My color', + 'slug' => 'my-color' + ) + ); + $user_cpt['post_content'] = wp_json_encode( $config ); + wp_update_post( $user_cpt, true, false ); + // end saving user data + + $settings = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data()->get_settings(); + $this->assertTrue( isset( $settings['color']['palette']['default'] ) ); + $this->assertTrue( isset( $settings['color']['palette']['theme'] ) ); + $this->assertTrue( isset( $settings['color']['palette']['custom'] ) ); + } + } From 3a5602a60073d8c7880f6570b1ad555e376852d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Thu, 24 Nov 2022 14:49:12 +0100 Subject: [PATCH 05/15] Add blocks origin test and improve them all --- phpunit/class-wp-theme-json-resolver-test.php | 201 ++++++++++++++++-- 1 file changed, 184 insertions(+), 17 deletions(-) diff --git a/phpunit/class-wp-theme-json-resolver-test.php b/phpunit/class-wp-theme-json-resolver-test.php index 062db4148172a..6fc12156fc9e5 100644 --- a/phpunit/class-wp-theme-json-resolver-test.php +++ b/phpunit/class-wp-theme-json-resolver-test.php @@ -363,31 +363,195 @@ public function test_get_user_data_from_wp_global_styles_does_not_use_uncached_q * @covers WP_Theme_JSON_Resolver::get_merged_data */ public function test_get_merged_data_returns_origin_default() { - switch_theme( 'block-theme' ); // make sure there is data from the theme origin - $settings = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'default' )->get_settings(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ) ); - $this->assertFalse( isset( $settings['color']['palette']['theme'] ) ); - $this->assertFalse( isset( $settings['color']['palette']['custom'] ) ); + // Make sure there is data from the blocks origin. + register_block_type( + 'my/block-with-styles', + array( + 'api_version' => 2, + 'attributes' => array( + 'borderColor' => array( + 'type' => 'string', + ), + 'style' => array( + 'type' => 'object', + ), + ), + 'supports' => array( + '__experimentalStyle' => array( + 'typography' => array( + 'fontSize' => '42rem', + ), + ), + ), + ), + ); + + // Make sure there is data from the theme origin. + switch_theme( 'block-theme' ); + + // Make sure there is data from the user origin. + wp_set_current_user( self::$administrator_id ); + $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); + $config = json_decode( $user_cpt['post_content'], true ); + $config['settings']['color']['palette']['custom'] = array( + array( + 'color' => 'hotpink', + 'name' => 'My color', + 'slug' => 'my-color' + ) + ); + $user_cpt['post_content'] = wp_json_encode( $config ); + wp_update_post( $user_cpt, true, false ); + + $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'default' ); + $settings = $theme_json->get_settings(); + $styles = $theme_json->get_styles_block_nodes(); + $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); + $this->assertFalse( isset( $styles[4] ) , 'block styles are not present' ); + $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); + $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); + unregister_block_type( 'my/block-with-styles' ); + } + + /** + * @covers WP_Theme_JSON_Resolver::get_merged_data + */ + public function test_get_merged_data_returns_origin_blocks() { + // Make sure there is data from the blocks origin. + register_block_type( + 'my/block-with-styles', + array( + 'api_version' => 2, + 'attributes' => array( + 'borderColor' => array( + 'type' => 'string', + ), + 'style' => array( + 'type' => 'object', + ), + ), + 'supports' => array( + '__experimentalStyle' => array( + 'typography' => array( + 'fontSize' => '42rem', + ), + ), + ), + ), + ); + + // Make sure there is data from the theme origin. + switch_theme( 'block-theme' ); + + // Make sure there is data from the user origin. + wp_set_current_user( self::$administrator_id ); + $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); + $config = json_decode( $user_cpt['post_content'], true ); + $config['settings']['color']['palette']['custom'] = array( + array( + 'color' => 'hotpink', + 'name' => 'My color', + 'slug' => 'my-color' + ) + ); + $user_cpt['post_content'] = wp_json_encode( $config ); + wp_update_post( $user_cpt, true, false ); + + $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'blocks' ); + $settings = $theme_json->get_settings(); + $styles = $theme_json->get_styles_block_nodes(); + $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); + $this->assertSame( $styles[4]['name'], 'my/block-with-styles' , 'block styles are present' ); + $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); + $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); + unregister_block_type( 'my/block-with-styles' ); } /** * @covers WP_Theme_JSON_Resolver::get_merged_data */ public function test_get_merged_data_returns_origin_theme() { - switch_theme( 'block-theme' ); // make sure there is data from the theme origin - $settings = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'theme' )->get_settings(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ) ); - $this->assertTrue( isset( $settings['color']['palette']['theme'] ) ); - $this->assertFalse( isset( $settings['color']['palette']['custom'] ) ); + // Make sure there is data from the blocks origin. + register_block_type( + 'my/block-with-styles', + array( + 'api_version' => 2, + 'attributes' => array( + 'borderColor' => array( + 'type' => 'string', + ), + 'style' => array( + 'type' => 'object', + ), + ), + 'supports' => array( + '__experimentalStyle' => array( + 'typography' => array( + 'fontSize' => '42rem', + ), + ), + ), + ), + ); + + // Make sure there is data from the theme origin. + switch_theme( 'block-theme' ); + + // Make sure there is data from the user origin. + wp_set_current_user( self::$administrator_id ); + $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); + $config = json_decode( $user_cpt['post_content'], true ); + $config['settings']['color']['palette']['custom'] = array( + array( + 'color' => 'hotpink', + 'name' => 'My color', + 'slug' => 'my-color' + ) + ); + $user_cpt['post_content'] = wp_json_encode( $config ); + wp_update_post( $user_cpt, true, false ); + + $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'theme' ); + $settings = $theme_json->get_settings(); + $styles = $theme_json->get_styles_block_nodes(); + $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); + $this->assertSame( $styles[4]['name'], 'my/block-with-styles' , 'block styles are present' ); + $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette is present' ); + $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); + unregister_block_type( 'my/block-with-styles' ); } /** * @covers WP_Theme_JSON_Resolver::get_merged_data */ public function test_get_merged_data_returns_origin_custom() { - switch_theme( 'block-theme' ); // make sure there is data from the theme origin + // Make sure there is data from the blocks origin. + register_block_type( + 'my/block-with-styles', + array( + 'api_version' => 2, + 'attributes' => array( + 'borderColor' => array( + 'type' => 'string', + ), + 'style' => array( + 'type' => 'object', + ), + ), + 'supports' => array( + '__experimentalStyle' => array( + 'typography' => array( + 'fontSize' => '42rem', + ), + ), + ), + ), + ); + + // Make sure there is data from the theme origin. + switch_theme( 'block-theme' ); - // start saving user data + // Make sure there is data from the user origin. wp_set_current_user( self::$administrator_id ); $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); $config = json_decode( $user_cpt['post_content'], true ); @@ -400,12 +564,15 @@ public function test_get_merged_data_returns_origin_custom() { ); $user_cpt['post_content'] = wp_json_encode( $config ); wp_update_post( $user_cpt, true, false ); - // end saving user data - $settings = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data()->get_settings(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ) ); - $this->assertTrue( isset( $settings['color']['palette']['theme'] ) ); - $this->assertTrue( isset( $settings['color']['palette']['custom'] ) ); + $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data(); + $settings = $theme_json->get_settings(); + $styles = $theme_json->get_styles_block_nodes(); + $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); + $this->assertSame( $styles[4]['name'], 'my/block-with-styles' , 'block styles are present' ); + $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette is present' ); + $this->assertTrue( isset( $settings['color']['palette']['custom'] ), 'user palette is present' ); + unregister_block_type( 'my/block-with-styles' ); } } From 60ec9b7cccafe946e3248d1aec0147c639e563e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Thu, 24 Nov 2022 16:40:39 +0100 Subject: [PATCH 06/15] Extract utility functions --- phpunit/class-wp-theme-json-resolver-test.php | 137 ++++-------------- 1 file changed, 28 insertions(+), 109 deletions(-) diff --git a/phpunit/class-wp-theme-json-resolver-test.php b/phpunit/class-wp-theme-json-resolver-test.php index 6fc12156fc9e5..936df34ca0be4 100644 --- a/phpunit/class-wp-theme-json-resolver-test.php +++ b/phpunit/class-wp-theme-json-resolver-test.php @@ -359,13 +359,9 @@ public function test_get_user_data_from_wp_global_styles_does_not_use_uncached_q $this->assertEmpty( $user_cpt, 'User CPT is expected to be empty.' ); } - /** - * @covers WP_Theme_JSON_Resolver::get_merged_data - */ - public function test_get_merged_data_returns_origin_default() { - // Make sure there is data from the blocks origin. + public function register_block_data( $block_name ) { register_block_type( - 'my/block-with-styles', + $block_name, array( 'api_version' => 2, 'attributes' => array( @@ -385,11 +381,9 @@ public function test_get_merged_data_returns_origin_default() { ), ), ); + } - // Make sure there is data from the theme origin. - switch_theme( 'block-theme' ); - - // Make sure there is data from the user origin. + public function register_user_data() { wp_set_current_user( self::$administrator_id ); $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); $config = json_decode( $user_cpt['post_content'], true ); @@ -402,6 +396,20 @@ public function test_get_merged_data_returns_origin_default() { ); $user_cpt['post_content'] = wp_json_encode( $config ); wp_update_post( $user_cpt, true, false ); + } + + /** + * @covers WP_Theme_JSON_Resolver::get_merged_data + */ + public function test_get_merged_data_returns_origin_default() { + // Make sure there is data from the blocks origin. + self::register_block_data( 'my/block-with-styles' ); + + // Make sure there is data from the theme origin. + switch_theme( 'block-theme' ); + + // Make sure there is data from the user origin. + self::register_user_data(); $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'default' ); $settings = $theme_json->get_settings(); @@ -410,6 +418,7 @@ public function test_get_merged_data_returns_origin_default() { $this->assertFalse( isset( $styles[4] ) , 'block styles are not present' ); $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); + unregister_block_type( 'my/block-with-styles' ); } @@ -418,44 +427,13 @@ public function test_get_merged_data_returns_origin_default() { */ public function test_get_merged_data_returns_origin_blocks() { // Make sure there is data from the blocks origin. - register_block_type( - 'my/block-with-styles', - array( - 'api_version' => 2, - 'attributes' => array( - 'borderColor' => array( - 'type' => 'string', - ), - 'style' => array( - 'type' => 'object', - ), - ), - 'supports' => array( - '__experimentalStyle' => array( - 'typography' => array( - 'fontSize' => '42rem', - ), - ), - ), - ), - ); + self::register_block_data( 'my/block-with-styles' ); // Make sure there is data from the theme origin. switch_theme( 'block-theme' ); // Make sure there is data from the user origin. - wp_set_current_user( self::$administrator_id ); - $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); - $config = json_decode( $user_cpt['post_content'], true ); - $config['settings']['color']['palette']['custom'] = array( - array( - 'color' => 'hotpink', - 'name' => 'My color', - 'slug' => 'my-color' - ) - ); - $user_cpt['post_content'] = wp_json_encode( $config ); - wp_update_post( $user_cpt, true, false ); + self::register_user_data(); $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'blocks' ); $settings = $theme_json->get_settings(); @@ -464,6 +442,7 @@ public function test_get_merged_data_returns_origin_blocks() { $this->assertSame( $styles[4]['name'], 'my/block-with-styles' , 'block styles are present' ); $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); + unregister_block_type( 'my/block-with-styles' ); } @@ -472,44 +451,13 @@ public function test_get_merged_data_returns_origin_blocks() { */ public function test_get_merged_data_returns_origin_theme() { // Make sure there is data from the blocks origin. - register_block_type( - 'my/block-with-styles', - array( - 'api_version' => 2, - 'attributes' => array( - 'borderColor' => array( - 'type' => 'string', - ), - 'style' => array( - 'type' => 'object', - ), - ), - 'supports' => array( - '__experimentalStyle' => array( - 'typography' => array( - 'fontSize' => '42rem', - ), - ), - ), - ), - ); + self::register_block_data( 'my/block-with-styles' ); // Make sure there is data from the theme origin. switch_theme( 'block-theme' ); // Make sure there is data from the user origin. - wp_set_current_user( self::$administrator_id ); - $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); - $config = json_decode( $user_cpt['post_content'], true ); - $config['settings']['color']['palette']['custom'] = array( - array( - 'color' => 'hotpink', - 'name' => 'My color', - 'slug' => 'my-color' - ) - ); - $user_cpt['post_content'] = wp_json_encode( $config ); - wp_update_post( $user_cpt, true, false ); + self::register_user_data(); $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'theme' ); $settings = $theme_json->get_settings(); @@ -518,6 +466,7 @@ public function test_get_merged_data_returns_origin_theme() { $this->assertSame( $styles[4]['name'], 'my/block-with-styles' , 'block styles are present' ); $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette is present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); + unregister_block_type( 'my/block-with-styles' ); } @@ -526,44 +475,13 @@ public function test_get_merged_data_returns_origin_theme() { */ public function test_get_merged_data_returns_origin_custom() { // Make sure there is data from the blocks origin. - register_block_type( - 'my/block-with-styles', - array( - 'api_version' => 2, - 'attributes' => array( - 'borderColor' => array( - 'type' => 'string', - ), - 'style' => array( - 'type' => 'object', - ), - ), - 'supports' => array( - '__experimentalStyle' => array( - 'typography' => array( - 'fontSize' => '42rem', - ), - ), - ), - ), - ); + self::register_block_data( 'my/block-with-styles' ); // Make sure there is data from the theme origin. switch_theme( 'block-theme' ); // Make sure there is data from the user origin. - wp_set_current_user( self::$administrator_id ); - $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); - $config = json_decode( $user_cpt['post_content'], true ); - $config['settings']['color']['palette']['custom'] = array( - array( - 'color' => 'hotpink', - 'name' => 'My color', - 'slug' => 'my-color' - ) - ); - $user_cpt['post_content'] = wp_json_encode( $config ); - wp_update_post( $user_cpt, true, false ); + self::register_user_data(); $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data(); $settings = $theme_json->get_settings(); @@ -572,6 +490,7 @@ public function test_get_merged_data_returns_origin_custom() { $this->assertSame( $styles[4]['name'], 'my/block-with-styles' , 'block styles are present' ); $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette is present' ); $this->assertTrue( isset( $settings['color']['palette']['custom'] ), 'user palette is present' ); + unregister_block_type( 'my/block-with-styles' ); } From 40bb25c46524597bcf16b648c011f6e218607a96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Thu, 24 Nov 2022 16:45:05 +0100 Subject: [PATCH 07/15] Improve block styles check --- phpunit/class-wp-theme-json-resolver-test.php | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/phpunit/class-wp-theme-json-resolver-test.php b/phpunit/class-wp-theme-json-resolver-test.php index 936df34ca0be4..c38037d7b2e1a 100644 --- a/phpunit/class-wp-theme-json-resolver-test.php +++ b/phpunit/class-wp-theme-json-resolver-test.php @@ -415,7 +415,10 @@ public function test_get_merged_data_returns_origin_default() { $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); - $this->assertFalse( isset( $styles[4] ) , 'block styles are not present' ); + $block_styles = array_filter( $styles, function( $element ) { + return isset( $element['name'] ) && $element['name'] === 'my/block-with-styles'; + } ); + $this->assertTrue( count( $block_styles ) === 0 , 'block styles are not present' ); $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); @@ -439,7 +442,10 @@ public function test_get_merged_data_returns_origin_blocks() { $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); - $this->assertSame( $styles[4]['name'], 'my/block-with-styles' , 'block styles are present' ); + $block_styles = array_filter( $styles, function( $element ) { + return isset( $element['name'] ) && $element['name'] === 'my/block-with-styles'; + } ); + $this->assertTrue( count( $block_styles ) === 1 , 'block styles are present' ); $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); @@ -463,7 +469,10 @@ public function test_get_merged_data_returns_origin_theme() { $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); - $this->assertSame( $styles[4]['name'], 'my/block-with-styles' , 'block styles are present' ); + $block_styles = array_filter( $styles, function( $element ) { + return isset( $element['name'] ) && $element['name'] === 'my/block-with-styles'; + } ); + $this->assertTrue( count( $block_styles ) === 1 , 'block styles are present' ); $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette is present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); @@ -487,7 +496,10 @@ public function test_get_merged_data_returns_origin_custom() { $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); - $this->assertSame( $styles[4]['name'], 'my/block-with-styles' , 'block styles are present' ); + $block_styles = array_filter( $styles, function( $element ) { + return isset( $element['name'] ) && $element['name'] === 'my/block-with-styles'; + } ); + $this->assertTrue( count( $block_styles ) === 1 , 'block styles are present' ); $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette is present' ); $this->assertTrue( isset( $settings['color']['palette']['custom'] ), 'user palette is present' ); From 795319a07b9fe31d833fb8fe2b4e17e030f02dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Thu, 24 Nov 2022 17:27:02 +0100 Subject: [PATCH 08/15] Clean cached data --- lib/compat/wordpress-6.2/default-filters.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/compat/wordpress-6.2/default-filters.php b/lib/compat/wordpress-6.2/default-filters.php index 927ff2bd12aa3..4df9ad39dc608 100644 --- a/lib/compat/wordpress-6.2/default-filters.php +++ b/lib/compat/wordpress-6.2/default-filters.php @@ -18,7 +18,9 @@ */ add_action( 'switch_theme', 'wp_theme_has_theme_json_clean_cache' ); +add_action( 'switch_theme', array( 'WP_Theme_JSON_Resolver_Gutenberg', 'clean_cached_data' ) ); add_action( 'start_previewing_theme', 'wp_theme_has_theme_json_clean_cache' ); +add_action( 'start_previewing_theme', array( 'WP_Theme_JSON_Resolver_Gutenberg', 'clean_cached_data' ) ); add_action( 'upgrader_process_complete', '_wp_theme_has_theme_json_clean_cache_upon_upgrading_active_theme', 10, 2 ); add_action( 'save_post_wp_global_styles', array( 'WP_Theme_JSON_Resolver_Gutenberg', 'clean_cached_data' ) ); add_action( 'activated_plugin', array( 'WP_Theme_JSON_Resolver_Gutenberg', 'clean_cached_data' ) ); From 6865e70f29d25378b044d9aa9b9359b27fc3e4a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Thu, 24 Nov 2022 17:50:01 +0100 Subject: [PATCH 09/15] Fix lint issues --- phpunit/class-wp-theme-json-resolver-test.php | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/phpunit/class-wp-theme-json-resolver-test.php b/phpunit/class-wp-theme-json-resolver-test.php index c38037d7b2e1a..90c3a98a572b4 100644 --- a/phpunit/class-wp-theme-json-resolver-test.php +++ b/phpunit/class-wp-theme-json-resolver-test.php @@ -379,22 +379,22 @@ public function register_block_data( $block_name ) { ), ), ), - ), + ) ); } public function register_user_data() { wp_set_current_user( self::$administrator_id ); $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); - $config = json_decode( $user_cpt['post_content'], true ); + $config = json_decode( $user_cpt['post_content'], true ); $config['settings']['color']['palette']['custom'] = array( array( 'color' => 'hotpink', 'name' => 'My color', - 'slug' => 'my-color' - ) + 'slug' => 'my-color', + ), ); - $user_cpt['post_content'] = wp_json_encode( $config ); + $user_cpt['post_content'] = wp_json_encode( $config ); wp_update_post( $user_cpt, true, false ); } @@ -415,10 +415,13 @@ public function test_get_merged_data_returns_origin_default() { $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); - $block_styles = array_filter( $styles, function( $element ) { - return isset( $element['name'] ) && $element['name'] === 'my/block-with-styles'; - } ); - $this->assertTrue( count( $block_styles ) === 0 , 'block styles are not present' ); + $block_styles = array_filter( + $styles, + function( $element ) { + return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; + } + ); + $this->assertTrue( count( $block_styles ) === 0, 'block styles are not present' ); $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); @@ -442,10 +445,13 @@ public function test_get_merged_data_returns_origin_blocks() { $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); - $block_styles = array_filter( $styles, function( $element ) { - return isset( $element['name'] ) && $element['name'] === 'my/block-with-styles'; - } ); - $this->assertTrue( count( $block_styles ) === 1 , 'block styles are present' ); + $block_styles = array_filter( + $styles, + function( $element ) { + return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; + } + ); + $this->assertTrue( count( $block_styles ) === 1, 'block styles are present' ); $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); @@ -469,10 +475,13 @@ public function test_get_merged_data_returns_origin_theme() { $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); - $block_styles = array_filter( $styles, function( $element ) { - return isset( $element['name'] ) && $element['name'] === 'my/block-with-styles'; - } ); - $this->assertTrue( count( $block_styles ) === 1 , 'block styles are present' ); + $block_styles = array_filter( + $styles, + function( $element ) { + return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; + } + ); + $this->assertTrue( count( $block_styles ) === 1, 'block styles are present' ); $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette is present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); @@ -496,10 +505,13 @@ public function test_get_merged_data_returns_origin_custom() { $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); - $block_styles = array_filter( $styles, function( $element ) { - return isset( $element['name'] ) && $element['name'] === 'my/block-with-styles'; - } ); - $this->assertTrue( count( $block_styles ) === 1 , 'block styles are present' ); + $block_styles = array_filter( + $styles, + function( $element ) { + return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; + } + ); + $this->assertTrue( count( $block_styles ) === 1, 'block styles are present' ); $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette is present' ); $this->assertTrue( isset( $settings['color']['palette']['custom'] ), 'user palette is present' ); From 1de4692795de30231ce3be2acbdf4a59bdd665d4 Mon Sep 17 00:00:00 2001 From: Glen Davies Date: Fri, 25 Nov 2022 11:31:50 +1300 Subject: [PATCH 10/15] Add the spacing sizes generation back in before final return --- lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php b/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php index 2499663972cfc..eadbc759e0ced 100644 --- a/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php +++ b/lib/compat/wordpress-6.2/class-wp-theme-json-resolver-6-2.php @@ -110,6 +110,7 @@ public static function get_merged_data( $origin = 'custom' ) { } $result->merge( static::get_user_data() ); + $result->set_spacing_sizes(); return $result; } } From 3b0e7bfe50899d678f6bad60964537c9cd49510b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Fri, 25 Nov 2022 08:38:29 +0100 Subject: [PATCH 11/15] Update phpunit/class-wp-theme-json-resolver-test.php Co-authored-by: Anton Vlasenko <43744263+anton-vlasenko@users.noreply.github.com> --- phpunit/class-wp-theme-json-resolver-test.php | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/phpunit/class-wp-theme-json-resolver-test.php b/phpunit/class-wp-theme-json-resolver-test.php index 90c3a98a572b4..f1ac27575ad93 100644 --- a/phpunit/class-wp-theme-json-resolver-test.php +++ b/phpunit/class-wp-theme-json-resolver-test.php @@ -383,7 +383,7 @@ public function register_block_data( $block_name ) { ); } - public function register_user_data() { + private function register_user_data() { wp_set_current_user( self::$administrator_id ); $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); $config = json_decode( $user_cpt['post_content'], true ); @@ -403,13 +403,13 @@ public function register_user_data() { */ public function test_get_merged_data_returns_origin_default() { // Make sure there is data from the blocks origin. - self::register_block_data( 'my/block-with-styles' ); + $this->register_block_data( 'my/block-with-styles' ); // Make sure there is data from the theme origin. switch_theme( 'block-theme' ); // Make sure there is data from the user origin. - self::register_user_data(); + $this->register_user_data(); $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'default' ); $settings = $theme_json->get_settings(); @@ -417,7 +417,7 @@ public function test_get_merged_data_returns_origin_default() { $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); $block_styles = array_filter( $styles, - function( $element ) { + static function( $element ) { return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; } ); @@ -433,25 +433,25 @@ function( $element ) { */ public function test_get_merged_data_returns_origin_blocks() { // Make sure there is data from the blocks origin. - self::register_block_data( 'my/block-with-styles' ); + $this->register_block_data( 'my/block-with-styles' ); // Make sure there is data from the theme origin. switch_theme( 'block-theme' ); // Make sure there is data from the user origin. - self::register_user_data(); + $this->register_user_data(); $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'blocks' ); $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); + $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette must be present' ); $block_styles = array_filter( $styles, - function( $element ) { + static function( $element ) { return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; } ); - $this->assertTrue( count( $block_styles ) === 1, 'block styles are present' ); + $this->assertTrue( count( $block_styles ) === 1, 'block styles must be defined' ); $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); @@ -463,26 +463,26 @@ function( $element ) { */ public function test_get_merged_data_returns_origin_theme() { // Make sure there is data from the blocks origin. - self::register_block_data( 'my/block-with-styles' ); + $this::register_block_data( 'my/block-with-styles' ); // Make sure there is data from the theme origin. switch_theme( 'block-theme' ); // Make sure there is data from the user origin. - self::register_user_data(); + $this->register_user_data(); $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'theme' ); $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); + $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette must be defined' ); $block_styles = array_filter( $styles, - function( $element ) { + static function( $element ) { return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; } ); $this->assertTrue( count( $block_styles ) === 1, 'block styles are present' ); - $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette is present' ); + $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette must be defined' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); unregister_block_type( 'my/block-with-styles' ); @@ -493,27 +493,27 @@ function( $element ) { */ public function test_get_merged_data_returns_origin_custom() { // Make sure there is data from the blocks origin. - self::register_block_data( 'my/block-with-styles' ); + $this->register_block_data( 'my/block-with-styles' ); // Make sure there is data from the theme origin. switch_theme( 'block-theme' ); // Make sure there is data from the user origin. - self::register_user_data(); + $this->register_user_data(); $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data(); $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); + $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette isn\'t defined' ); $block_styles = array_filter( $styles, - function( $element ) { + static function( $element ) { return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; } ); $this->assertTrue( count( $block_styles ) === 1, 'block styles are present' ); $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette is present' ); - $this->assertTrue( isset( $settings['color']['palette']['custom'] ), 'user palette is present' ); + $this->assertTrue( isset( $settings['color']['palette']['custom'] ), 'user palette isn\'t defined' ); unregister_block_type( 'my/block-with-styles' ); } From 75c12020f97137caa8cc8402fa098c6ccec222f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Fri, 25 Nov 2022 08:51:55 +0100 Subject: [PATCH 12/15] Fix suggestions --- phpunit/class-wp-theme-json-resolver-test.php | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/phpunit/class-wp-theme-json-resolver-test.php b/phpunit/class-wp-theme-json-resolver-test.php index f1ac27575ad93..04a32f9d595ad 100644 --- a/phpunit/class-wp-theme-json-resolver-test.php +++ b/phpunit/class-wp-theme-json-resolver-test.php @@ -359,7 +359,7 @@ public function test_get_user_data_from_wp_global_styles_does_not_use_uncached_q $this->assertEmpty( $user_cpt, 'User CPT is expected to be empty.' ); } - public function register_block_data( $block_name ) { + private function register_block_data( $block_name ) { register_block_type( $block_name, array( @@ -451,7 +451,7 @@ static function( $element ) { return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; } ); - $this->assertTrue( count( $block_styles ) === 1, 'block styles must be defined' ); + $this->assertTrue( count( $block_styles ) === 1, 'block styles must be present' ); $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); @@ -463,7 +463,7 @@ static function( $element ) { */ public function test_get_merged_data_returns_origin_theme() { // Make sure there is data from the blocks origin. - $this::register_block_data( 'my/block-with-styles' ); + $this->register_block_data( 'my/block-with-styles' ); // Make sure there is data from the theme origin. switch_theme( 'block-theme' ); @@ -474,15 +474,15 @@ public function test_get_merged_data_returns_origin_theme() { $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'theme' ); $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette must be defined' ); + $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette must be present' ); $block_styles = array_filter( $styles, static function( $element ) { return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; } ); - $this->assertTrue( count( $block_styles ) === 1, 'block styles are present' ); - $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette must be defined' ); + $this->assertTrue( count( $block_styles ) === 1, 'block styles must be present' ); + $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette must be present' ); $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); unregister_block_type( 'my/block-with-styles' ); @@ -504,16 +504,16 @@ public function test_get_merged_data_returns_origin_custom() { $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data(); $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette isn\'t defined' ); + $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette must be present' ); $block_styles = array_filter( $styles, static function( $element ) { return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; } ); - $this->assertTrue( count( $block_styles ) === 1, 'block styles are present' ); - $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette is present' ); - $this->assertTrue( isset( $settings['color']['palette']['custom'] ), 'user palette isn\'t defined' ); + $this->assertTrue( count( $block_styles ) === 1, 'block styles must be present' ); + $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette must be present' ); + $this->assertTrue( isset( $settings['color']['palette']['custom'] ), 'user palette must be present' ); unregister_block_type( 'my/block-with-styles' ); } From 7228291e14b5a01829748356559e60c2806399e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Fri, 25 Nov 2022 09:52:38 +0100 Subject: [PATCH 13/15] Use data provider in test --- phpunit/class-wp-theme-json-resolver-test.php | 162 ++++++++---------- 1 file changed, 70 insertions(+), 92 deletions(-) diff --git a/phpunit/class-wp-theme-json-resolver-test.php b/phpunit/class-wp-theme-json-resolver-test.php index 04a32f9d595ad..2c8e2dfa2305e 100644 --- a/phpunit/class-wp-theme-json-resolver-test.php +++ b/phpunit/class-wp-theme-json-resolver-test.php @@ -399,69 +399,23 @@ private function register_user_data() { } /** + * Test that get_merged_data returns the data merged up to the proper origin. + * * @covers WP_Theme_JSON_Resolver::get_merged_data + * + * @dataProvider data_get_merged_data_returns_origin + * + * @param string $origin What origin to get data from. + * @param bool $core_palette Whether the core palette is present. + * @param string $core_palette_text Message. + * @param string $block_styles Whether the block styles are present. + * @param string $block_styles_text Message + * @param bool $theme_palette Whether the theme palette is present. + * @param string $theme_palette_text Message. + * @param bool $user_palette Whether the user palette is present. + * @param string $user_palette_text Message. */ - public function test_get_merged_data_returns_origin_default() { - // Make sure there is data from the blocks origin. - $this->register_block_data( 'my/block-with-styles' ); - - // Make sure there is data from the theme origin. - switch_theme( 'block-theme' ); - - // Make sure there is data from the user origin. - $this->register_user_data(); - - $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'default' ); - $settings = $theme_json->get_settings(); - $styles = $theme_json->get_styles_block_nodes(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette is present' ); - $block_styles = array_filter( - $styles, - static function( $element ) { - return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; - } - ); - $this->assertTrue( count( $block_styles ) === 0, 'block styles are not present' ); - $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); - $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); - - unregister_block_type( 'my/block-with-styles' ); - } - - /** - * @covers WP_Theme_JSON_Resolver::get_merged_data - */ - public function test_get_merged_data_returns_origin_blocks() { - // Make sure there is data from the blocks origin. - $this->register_block_data( 'my/block-with-styles' ); - - // Make sure there is data from the theme origin. - switch_theme( 'block-theme' ); - - // Make sure there is data from the user origin. - $this->register_user_data(); - - $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'blocks' ); - $settings = $theme_json->get_settings(); - $styles = $theme_json->get_styles_block_nodes(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette must be present' ); - $block_styles = array_filter( - $styles, - static function( $element ) { - return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; - } - ); - $this->assertTrue( count( $block_styles ) === 1, 'block styles must be present' ); - $this->assertFalse( isset( $settings['color']['palette']['theme'] ), 'theme palette is not present' ); - $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); - - unregister_block_type( 'my/block-with-styles' ); - } - - /** - * @covers WP_Theme_JSON_Resolver::get_merged_data - */ - public function test_get_merged_data_returns_origin_theme() { + public function test_get_merged_data_returns_origin( $origin, $core_palette, $core_palette_text, $block_styles, $block_styles_text, $theme_palette, $theme_palette_text, $user_palette, $user_palette_text ) { // Make sure there is data from the blocks origin. $this->register_block_data( 'my/block-with-styles' ); @@ -471,51 +425,75 @@ public function test_get_merged_data_returns_origin_theme() { // Make sure there is data from the user origin. $this->register_user_data(); - $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( 'theme' ); + $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( $origin ); $settings = $theme_json->get_settings(); $styles = $theme_json->get_styles_block_nodes(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette must be present' ); - $block_styles = array_filter( + $this->assertSame( $core_palette, isset( $settings['color']['palette']['default'] ), $core_palette_text ); + $styles = array_filter( $styles, static function( $element ) { return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; } ); - $this->assertTrue( count( $block_styles ) === 1, 'block styles must be present' ); - $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette must be present' ); - $this->assertFalse( isset( $settings['color']['palette']['custom'] ), 'user palette is not present' ); + $this->assertSame( $block_styles, count( $styles ) === 1, $block_styles_text ); + $this->assertSame( $theme_palette, isset( $settings['color']['palette']['theme'] ), $theme_palette_text ); + $this->assertSame( $user_palette, isset( $settings['color']['palette']['custom'] ), $user_palette_text ); unregister_block_type( 'my/block-with-styles' ); } /** - * @covers WP_Theme_JSON_Resolver::get_merged_data + * Data provider for test_get_merged_data_returns_origin + * + * @return array */ - public function test_get_merged_data_returns_origin_custom() { - // Make sure there is data from the blocks origin. - $this->register_block_data( 'my/block-with-styles' ); - - // Make sure there is data from the theme origin. - switch_theme( 'block-theme' ); - - // Make sure there is data from the user origin. - $this->register_user_data(); - - $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data(); - $settings = $theme_json->get_settings(); - $styles = $theme_json->get_styles_block_nodes(); - $this->assertTrue( isset( $settings['color']['palette']['default'] ), 'core palette must be present' ); - $block_styles = array_filter( - $styles, - static function( $element ) { - return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; - } + public function data_get_merged_data_returns_origin() { + return array( + 'origin_default' => array( + 'origin' => 'default', + 'core_palette' => true, + 'core_palette_text' => 'Core palette must be present', + 'block_styles' => false, + 'block_styles_text' => 'Block styles should not be present', + 'theme_palette' => false, + 'theme_palette_text' => 'Theme palette should not be present', + 'user_palette' => false, + 'user_palette_text' => 'User palette should not be present', + ), + 'origin_blocks' => array( + 'origin' => 'blocks', + 'core_palette' => true, + 'core_palette_text' => 'Core palette must be present', + 'block_styles' => true, + 'block_styles_text' => 'Block styles must be present', + 'theme_palette' => false, + 'theme_palette_text' => 'Theme palette should not be present', + 'user_palette' => false, + 'user_palette_text' => 'User palette should not be present', + ), + 'origin_theme' => array( + 'origin' => 'theme', + 'core_palette' => true, + 'core_palette_text' => 'Core palette must be present', + 'block_styles' => true, + 'block_styles_text' => 'Block styles must be present', + 'theme_palette' => true, + 'theme_palette_text' => 'Theme palette must be present', + 'user_palette' => false, + 'user_palette_text' => 'User palette should not be present', + ), + 'origin_custom' => array( + 'origin' => 'custom', + 'core_palette' => true, + 'core_palette_text' => 'Core palette must be present', + 'block_styles' => true, + 'block_styles_text' => 'Block styles must be present', + 'theme_palette' => true, + 'theme_palette_text' => 'Theme palette must be present', + 'user_palette' => true, + 'user_palette_text' => 'User palette must be present', + ), ); - $this->assertTrue( count( $block_styles ) === 1, 'block styles must be present' ); - $this->assertTrue( isset( $settings['color']['palette']['theme'] ), 'theme palette must be present' ); - $this->assertTrue( isset( $settings['color']['palette']['custom'] ), 'user palette must be present' ); - - unregister_block_type( 'my/block-with-styles' ); } } From 6d06e331be10d4b5a2afbaf6948541fb15c7a7e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Fri, 25 Nov 2022 09:54:03 +0100 Subject: [PATCH 14/15] Inline utility functions --- phpunit/class-wp-theme-json-resolver-test.php | 56 ++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/phpunit/class-wp-theme-json-resolver-test.php b/phpunit/class-wp-theme-json-resolver-test.php index 2c8e2dfa2305e..99c39e6434a16 100644 --- a/phpunit/class-wp-theme-json-resolver-test.php +++ b/phpunit/class-wp-theme-json-resolver-test.php @@ -359,9 +359,27 @@ public function test_get_user_data_from_wp_global_styles_does_not_use_uncached_q $this->assertEmpty( $user_cpt, 'User CPT is expected to be empty.' ); } - private function register_block_data( $block_name ) { + /** + * Test that get_merged_data returns the data merged up to the proper origin. + * + * @covers WP_Theme_JSON_Resolver::get_merged_data + * + * @dataProvider data_get_merged_data_returns_origin + * + * @param string $origin What origin to get data from. + * @param bool $core_palette Whether the core palette is present. + * @param string $core_palette_text Message. + * @param string $block_styles Whether the block styles are present. + * @param string $block_styles_text Message + * @param bool $theme_palette Whether the theme palette is present. + * @param string $theme_palette_text Message. + * @param bool $user_palette Whether the user palette is present. + * @param string $user_palette_text Message. + */ + public function test_get_merged_data_returns_origin( $origin, $core_palette, $core_palette_text, $block_styles, $block_styles_text, $theme_palette, $theme_palette_text, $user_palette, $user_palette_text ) { + // Make sure there is data from the blocks origin. register_block_type( - $block_name, + 'my/block-with-styles', array( 'api_version' => 2, 'attributes' => array( @@ -381,9 +399,11 @@ private function register_block_data( $block_name ) { ), ) ); - } - private function register_user_data() { + // Make sure there is data from the theme origin. + switch_theme( 'block-theme' ); + + // Make sure there is data from the user origin. wp_set_current_user( self::$administrator_id ); $user_cpt = WP_Theme_JSON_Resolver_Gutenberg::get_user_data_from_wp_global_styles( wp_get_theme(), true ); $config = json_decode( $user_cpt['post_content'], true ); @@ -396,34 +416,6 @@ private function register_user_data() { ); $user_cpt['post_content'] = wp_json_encode( $config ); wp_update_post( $user_cpt, true, false ); - } - - /** - * Test that get_merged_data returns the data merged up to the proper origin. - * - * @covers WP_Theme_JSON_Resolver::get_merged_data - * - * @dataProvider data_get_merged_data_returns_origin - * - * @param string $origin What origin to get data from. - * @param bool $core_palette Whether the core palette is present. - * @param string $core_palette_text Message. - * @param string $block_styles Whether the block styles are present. - * @param string $block_styles_text Message - * @param bool $theme_palette Whether the theme palette is present. - * @param string $theme_palette_text Message. - * @param bool $user_palette Whether the user palette is present. - * @param string $user_palette_text Message. - */ - public function test_get_merged_data_returns_origin( $origin, $core_palette, $core_palette_text, $block_styles, $block_styles_text, $theme_palette, $theme_palette_text, $user_palette, $user_palette_text ) { - // Make sure there is data from the blocks origin. - $this->register_block_data( 'my/block-with-styles' ); - - // Make sure there is data from the theme origin. - switch_theme( 'block-theme' ); - - // Make sure there is data from the user origin. - $this->register_user_data(); $theme_json = WP_Theme_JSON_Resolver_Gutenberg::get_merged_data( $origin ); $settings = $theme_json->get_settings(); From 07903d344c2745601c3076a5a8f3f48410223b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com> Date: Fri, 25 Nov 2022 09:55:55 +0100 Subject: [PATCH 15/15] Fix lint issues --- phpunit/class-wp-theme-json-resolver-test.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/phpunit/class-wp-theme-json-resolver-test.php b/phpunit/class-wp-theme-json-resolver-test.php index 99c39e6434a16..f872b251a7784 100644 --- a/phpunit/class-wp-theme-json-resolver-test.php +++ b/phpunit/class-wp-theme-json-resolver-test.php @@ -370,7 +370,7 @@ public function test_get_user_data_from_wp_global_styles_does_not_use_uncached_q * @param bool $core_palette Whether the core palette is present. * @param string $core_palette_text Message. * @param string $block_styles Whether the block styles are present. - * @param string $block_styles_text Message + * @param string $block_styles_text Message. * @param bool $theme_palette Whether the theme palette is present. * @param string $theme_palette_text Message. * @param bool $user_palette Whether the user palette is present. @@ -452,7 +452,7 @@ public function data_get_merged_data_returns_origin() { 'user_palette' => false, 'user_palette_text' => 'User palette should not be present', ), - 'origin_blocks' => array( + 'origin_blocks' => array( 'origin' => 'blocks', 'core_palette' => true, 'core_palette_text' => 'Core palette must be present', @@ -463,7 +463,7 @@ public function data_get_merged_data_returns_origin() { 'user_palette' => false, 'user_palette_text' => 'User palette should not be present', ), - 'origin_theme' => array( + 'origin_theme' => array( 'origin' => 'theme', 'core_palette' => true, 'core_palette_text' => 'Core palette must be present', @@ -474,7 +474,7 @@ public function data_get_merged_data_returns_origin() { 'user_palette' => false, 'user_palette_text' => 'User palette should not be present', ), - 'origin_custom' => array( + 'origin_custom' => array( 'origin' => 'custom', 'core_palette' => true, 'core_palette_text' => 'Core palette must be present',