From b055536eb893d19fa0925aff7344268f5ff56743 Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Mon, 23 Oct 2023 22:38:17 -0300 Subject: [PATCH 01/11] Save a draft version of feature settings And apply them before a full sync --- includes/classes/Features.php | 53 ++++++++++++- includes/classes/IndexHelper.php | 15 ++++ includes/classes/REST/Features.php | 53 +++++++++++-- tests/php/TestFeatureActivation.php | 90 ++++++++++++++++++++++ tests/php/includes/classes/FeatureTest.php | 35 +++++++++ 5 files changed, 238 insertions(+), 8 deletions(-) diff --git a/includes/classes/Features.php b/includes/classes/Features.php index 7e634feba7..2f29db59f5 100644 --- a/includes/classes/Features.php +++ b/includes/classes/Features.php @@ -118,7 +118,13 @@ public function update_feature( $slug, $settings, $force = true ) { $saved_settings = Utils\get_option( 'ep_feature_settings', [] ); $feature_settings = isset( $saved_settings[ $slug ] ) ? $saved_settings[ $slug ] : [ 'force_inactive' => false ]; - $new_feature_settings = wp_parse_args( $feature->default_settings, [ 'force_inactive' => false ] ); + $new_feature_settings = wp_parse_args( + $feature->default_settings, + [ + 'active' => false, + 'force_inactive' => false, + ] + ); $new_feature_settings = wp_parse_args( $feature_settings, $new_feature_settings ); $new_feature_settings = wp_parse_args( $settings, $new_feature_settings ); @@ -316,6 +322,51 @@ public function setup_features() { } } + /** + * Return currnt features settings + * + * @since 5.0.0 + * @return false|array + */ + public function get_feature_settings() { + return Utils\get_option( 'ep_feature_settings', false ); + } + + /** + * Get features settings draft + * + * @since 5.0.0 + * @return false|array + */ + public function get_feature_settings_draft() { + return Utils\get_option( 'ep_feature_settings_draft', false ); + } + + /** + * Update features settings draft + * + * @since 5.0.0 + * @param array $settings_draft New settings draft + */ + public function save_feature_settings_draft( array $settings_draft ) { + Utils\update_option( 'ep_feature_settings_draft', $settings_draft ); + } + + /** + * Apply settings draft (if present) + * + * @since 5.0.0 + */ + public function apply_draft_feature_settings() { + $draft_settings = Utils\get_option( 'ep_feature_settings_draft', false ); + if ( ! $draft_settings ) { + return; + } + + Utils\update_option( 'ep_feature_settings', $draft_settings ); + Utils\delete_option( 'ep_feature_settings_draft' ); + } + /** * Return singleton instance of class * diff --git a/includes/classes/IndexHelper.php b/includes/classes/IndexHelper.php index af8ad6beb8..b469dd4fff 100644 --- a/includes/classes/IndexHelper.php +++ b/includes/classes/IndexHelper.php @@ -91,6 +91,8 @@ public function full_index( $args ) { // For the dashboard, this will be called and exit the script until the queue is empty again. $this->flush_messages_queue(); + $this->maybe_apply_feature_settings(); + while ( $this->has_items_to_be_processed() ) { $this->process_sync_item(); } @@ -1510,6 +1512,19 @@ protected function build_message_errors_data( $messages ) : array { return $errors_list; } + /** + * If this is a full sync, apply the draft feature settings + * + * @since 5.0.0 + */ + protected function maybe_apply_feature_settings() { + if ( ! $this->index_meta['put_mapping'] ) { + return; + } + + Features::factory()->apply_draft_feature_settings(); + } + /** * Return singleton instance of class. * diff --git a/includes/classes/REST/Features.php b/includes/classes/REST/Features.php index 7dabe54ac1..21da08b931 100644 --- a/includes/classes/REST/Features.php +++ b/includes/classes/REST/Features.php @@ -101,7 +101,7 @@ public function check_permission() { * Update features settings. * * @param \WP_REST_Request $request Full details about the request. - * @return void + * @return array */ public function update_settings( \WP_REST_Request $request ) { if ( Utils\is_indexing() ) { @@ -109,10 +109,13 @@ public function update_settings( \WP_REST_Request $request ) { exit; } - $settings = []; + $current_settings = FeaturesStore::factory()->get_feature_settings(); + $new_settings = $current_settings; $features = \ElasticPress\Features::factory()->registered_features; + $settings_that_requires_features = []; + foreach ( $features as $slug => $feature ) { $param = $request->get_param( $slug ); @@ -120,7 +123,10 @@ public function update_settings( \WP_REST_Request $request ) { continue; } - $settings[ $slug ] = []; + if ( empty( $current_settings[ $slug ] ) ) { + $current_settings[ $slug ] = []; + $new_settings[ $slug ] = []; + } $schema = $feature->get_settings_schema(); @@ -128,15 +134,48 @@ public function update_settings( \WP_REST_Request $request ) { $key = $schema['key']; if ( isset( $param[ $key ] ) ) { - $settings[ $slug ][ $key ] = $param[ $key ]; + $new_settings[ $slug ][ $key ] = $param[ $key ]; + + // Only apply to the current settings if does not require a sync + if ( ! empty( $schema['requires_sync'] ) ) { + continue; + } + + /* + * If a setting requires another feature, we have to check for it after running through everything, + * as it is possible that the feature will be active after this foreach. + */ + if ( empty( $schema['requires_feature'] ) ) { + $current_settings[ $slug ][ $key ] = $param[ $key ]; + } else { + if ( ! isset( $settings_that_requires_features[ $slug ] ) ) { + $settings_that_requires_features[ $slug ] = []; + } + $settings_that_requires_features[ $slug ][ $key ] = [ + 'required_feature' => $schema['requires_feature'], + 'value' => $param[ $key ], + ]; + } + } + } + } + + foreach ( $settings_that_requires_features as $feature => $fields ) { + foreach ( $fields as $field_key => $field_data ) { + if ( ! empty( $current_settings[ $field_data['required_feature'] ]['active'] ) ) { + $current_settings[ $feature ][ $field_key ] = $field_data['value']; } } + } - FeaturesStore::factory()->update_feature( $slug, $settings[ $slug ] ); + foreach ( $current_settings as $slug => $feature ) { + FeaturesStore::factory()->update_feature( $slug, $feature ); } - Utils\update_option( 'ep_feature_settings', $settings ); + if ( $current_settings !== $new_settings ) { + FeaturesStore::factory()->save_feature_settings_draft( $new_settings ); + } - wp_send_json_success(); + return [ 'success' => true ]; } } diff --git a/tests/php/TestFeatureActivation.php b/tests/php/TestFeatureActivation.php index e2ef5b247f..4c945a3aad 100644 --- a/tests/php/TestFeatureActivation.php +++ b/tests/php/TestFeatureActivation.php @@ -8,6 +8,8 @@ namespace ElasticPressTest; use ElasticPress; +use \ElasticPress\Features; +use \ElasticPress\REST\Features as FeaturesRest; /** * Feature activation test class @@ -315,6 +317,94 @@ public function testGetSetting() { $this->assertNull( $feature->get_setting( 'non_existent_setting' ) ); } + /** + * Test if feature settings are updated when sent via REST API + * + * @since 5.0.0 + * @group feature-activation + */ + public function test_feature_setting_update() { + Features::factory()->register_feature( + new FeatureTest() + ); + + $controller = new FeaturesRest(); + $request = new \WP_REST_Request( 'PUT', '/elasticpress/v1/features' ); + $request->set_param( + 'test', + [ + 'active' => '1', + 'field_1' => '1', + 'field_2' => '1', + 'field_3' => '1', + 'field_4' => '1', + ] + ); + $request->set_param( 'did-you-mean', [ 'active' => '1' ] ); + + $controller->update_settings( $request ); + + $current_settings = Features::factory()->get_feature_settings(); + + /* + * field_2 will not be set yet as it requires a sync + * field_3 will not be set yet as it requires the did-you-mean-feature + */ + $this->assertSame( + [ + 'active' => false, // requires a sync, so will be false + 'force_inactive' => false, + 'field_1' => '1', + 'field_4' => '1', // As search is already active, this field is set now + ], + $current_settings['test'] + ); + + $draft_settings = Features::factory()->get_feature_settings_draft(); + $this->assertSame( + [ + 'active' => '1', + 'field_1' => '1', + 'field_2' => '1', + 'field_3' => '1', + 'field_4' => '1', + ], + $draft_settings['test'] + ); + } + + /** + * Test if feature settings are applied after a sync + * + * @since 5.0.0 + * @group feature-activation + */ + public function test_feature_setting_applied_after_sync() { + $settings = Features::factory()->get_feature_settings(); + $settings['test'] = [ + 'active' => '1', + 'field_1' => '1', + 'field_2' => '1', + 'field_3' => '1', + ]; + + Features::factory()->save_feature_settings_draft( $settings ); + + $wp_cli = new \ElasticPress\Command(); + + $wp_cli->sync( + [], + [ + 'setup' => true, + 'yes' => true, + ] + ); + ob_clean(); + + $updated_settings = Features::factory()->get_feature_settings(); + $this->assertSame( $settings['test'], $updated_settings['test'] ); + } + /** * Wrapper for Features::handle_feature_activation() calls in admin context. * diff --git a/tests/php/includes/classes/FeatureTest.php b/tests/php/includes/classes/FeatureTest.php index 9492e058f2..46181f590c 100644 --- a/tests/php/includes/classes/FeatureTest.php +++ b/tests/php/includes/classes/FeatureTest.php @@ -51,4 +51,39 @@ public function output_feature_box_summary() { } * Do nothing */ public function setup() { } + + /** + * Set settings schema + */ + public function set_settings_schema() { + $this->settings_schema = [ + [ + 'default' => '0', + 'key' => 'field_1', + 'label' => 'Field 1', + 'type' => 'text', + ], + [ + 'default' => '0', + 'key' => 'field_2', + 'label' => 'Field 2', + 'type' => 'text', + 'requires_sync' => true, + ], + [ + 'default' => '0', + 'key' => 'field_3', + 'label' => 'Field 3', + 'type' => 'text', + 'requires_feature' => 'did-you-mean', + ], + [ + 'default' => '0', + 'key' => 'field_4', + 'label' => 'Field 4', + 'type' => 'text', + 'requires_feature' => 'search', + ], + ]; + } } From ea64a24e1c009ec5a3ef248b517e787645342a1d Mon Sep 17 00:00:00 2001 From: Jacob Peattie Date: Tue, 24 Oct 2023 20:54:30 +1100 Subject: [PATCH 02/11] Front-end support for draft settings. --- assets/js/features/config.js | 5 +++-- assets/js/features/index.js | 12 ++++++++++-- assets/js/features/provider.js | 6 +++--- includes/classes/REST/Features.php | 5 ++++- includes/classes/Screen/Features.php | 18 +++++++++++------- 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/assets/js/features/config.js b/assets/js/features/config.js index 07994ceffe..0ef95bfe9b 100644 --- a/assets/js/features/config.js +++ b/assets/js/features/config.js @@ -1,6 +1,7 @@ /** * Window dependencies. */ -const { apiUrl, epioLogoUrl, features, indexMeta, settings, syncUrl } = window.epDashboard; +const { apiUrl, epioLogoUrl, features, indexMeta, settings, settingsDraft, syncUrl } = + window.epDashboard; -export { apiUrl, epioLogoUrl, features, indexMeta, settings, syncUrl }; +export { apiUrl, epioLogoUrl, features, indexMeta, settings, settingsDraft, syncUrl }; diff --git a/assets/js/features/index.js b/assets/js/features/index.js index 2b956eb7c0..cf7f416e8c 100644 --- a/assets/js/features/index.js +++ b/assets/js/features/index.js @@ -8,7 +8,15 @@ import { __ } from '@wordpress/i18n'; * Internal dependencies. */ import { SettingsScreenProvider } from '../settings-screen'; -import { apiUrl, epioLogoUrl, features, indexMeta, settings, syncUrl } from './config'; +import { + apiUrl, + epioLogoUrl, + features, + indexMeta, + settings, + settingsDraft, + syncUrl, +} from './config'; import { FeatureSettingsProvider } from './provider'; import Features from './apps/features'; @@ -26,7 +34,7 @@ const App = () => ( save_feature_settings_draft( $new_settings ); } - return [ 'success' => true ]; + return [ + 'data' => $current_settings, + 'success' => true, + ]; } } diff --git a/includes/classes/Screen/Features.php b/includes/classes/Screen/Features.php index 3b4422698f..5dab17a3d8 100644 --- a/includes/classes/Screen/Features.php +++ b/includes/classes/Screen/Features.php @@ -8,6 +8,7 @@ namespace ElasticPress\Screen; +use ElasticPress\Features as FeaturesStore; use ElasticPress\REST; use ElasticPress\Screen; use ElasticPress\Utils; @@ -59,7 +60,9 @@ public function admin_enqueue_scripts() { Utils\get_asset_info( 'features-script', 'version' ) ); - $features = \ElasticPress\Features::factory()->registered_features; + $store = FeaturesStore::factory(); + + $features = $store->registered_features; $features = array_map( fn( $f ) => $f->get_json(), $features ); $features = array_values( $features ); @@ -68,12 +71,13 @@ public function admin_enqueue_scripts() { admin_url( 'admin.php?page=elasticpress-sync' ); $data = [ - 'apiUrl' => rest_url( 'elasticpress/v1/features' ), - 'epioLogoUrl' => esc_url( plugins_url( '/images/logo-elasticpress-io.svg', EP_FILE ) ), - 'features' => $features, - 'indexMeta' => Utils\get_indexing_status(), - 'settings' => Utils\get_option( 'ep_feature_settings', [] ), - 'syncUrl' => $sync_url, + 'apiUrl' => rest_url( 'elasticpress/v1/features' ), + 'epioLogoUrl' => esc_url( plugins_url( '/images/logo-elasticpress-io.svg', EP_FILE ) ), + 'features' => $features, + 'indexMeta' => Utils\get_indexing_status(), + 'settings' => $store->get_feature_settings(), + 'settingsDraft' => $store->get_feature_settings_draft(), + 'syncUrl' => $sync_url, ]; wp_localize_script( 'ep_features_script', 'epDashboard', $data ); From 96c160f68434a85bbb7b3d8856986230426b8b07 Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Tue, 24 Oct 2023 08:12:52 -0300 Subject: [PATCH 03/11] Update features using the update_feature method --- includes/classes/Features.php | 5 ++++- includes/classes/REST/Features.php | 4 +--- tests/php/TestFeatureActivation.php | 11 ++++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/includes/classes/Features.php b/includes/classes/Features.php index 2f29db59f5..fc6d98172c 100644 --- a/includes/classes/Features.php +++ b/includes/classes/Features.php @@ -363,7 +363,10 @@ public function apply_draft_feature_settings() { return; } - Utils\update_option( 'ep_feature_settings', $draft_settings ); + foreach ( $draft_settings as $feature => $settings ) { + $this->update_feature( $feature, $settings ); + } + Utils\delete_option( 'ep_feature_settings_draft' ); } diff --git a/includes/classes/REST/Features.php b/includes/classes/REST/Features.php index 5fc641bfe7..c8be3a0024 100644 --- a/includes/classes/REST/Features.php +++ b/includes/classes/REST/Features.php @@ -172,9 +172,7 @@ public function update_settings( \WP_REST_Request $request ) { FeaturesStore::factory()->update_feature( $slug, $feature ); } - if ( $current_settings !== $new_settings ) { - FeaturesStore::factory()->save_feature_settings_draft( $new_settings ); - } + FeaturesStore::factory()->save_feature_settings_draft( $new_settings ); return [ 'data' => $current_settings, diff --git a/tests/php/TestFeatureActivation.php b/tests/php/TestFeatureActivation.php index 4c945a3aad..201334bfa1 100644 --- a/tests/php/TestFeatureActivation.php +++ b/tests/php/TestFeatureActivation.php @@ -402,7 +402,16 @@ public function test_feature_setting_applied_after_sync() { ob_clean(); $updated_settings = Features::factory()->get_feature_settings(); - $this->assertSame( $settings['test'], $updated_settings['test'] ); + $this->assertSame( + $updated_settings['test'], + [ + 'active' => true, + 'force_inactive' => false, + 'field_1' => '1', + 'field_2' => '1', + 'field_3' => '1', + ] + ); } /** From 3a20f4ac64cbb6c3483a4d198284c73c55b4c4ac Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Tue, 24 Oct 2023 09:54:25 -0300 Subject: [PATCH 04/11] Setup features as soon as possible --- includes/classes/Features.php | 1 + includes/classes/IndexHelper.php | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/includes/classes/Features.php b/includes/classes/Features.php index fc6d98172c..d68b63f899 100644 --- a/includes/classes/Features.php +++ b/includes/classes/Features.php @@ -366,6 +366,7 @@ public function apply_draft_feature_settings() { foreach ( $draft_settings as $feature => $settings ) { $this->update_feature( $feature, $settings ); } + $this->setup_features(); Utils\delete_option( 'ep_feature_settings_draft' ); } diff --git a/includes/classes/IndexHelper.php b/includes/classes/IndexHelper.php index b469dd4fff..bad8e7c626 100644 --- a/includes/classes/IndexHelper.php +++ b/includes/classes/IndexHelper.php @@ -85,14 +85,13 @@ public function full_index( $args ) { $this->args = apply_filters( 'ep_sync_args', $args, $this->index_meta ); if ( false === $this->index_meta ) { + $this->maybe_apply_feature_settings(); $this->build_index_meta(); } // For the dashboard, this will be called and exit the script until the queue is empty again. $this->flush_messages_queue(); - $this->maybe_apply_feature_settings(); - while ( $this->has_items_to_be_processed() ) { $this->process_sync_item(); } @@ -1518,7 +1517,7 @@ protected function build_message_errors_data( $messages ) : array { * @since 5.0.0 */ protected function maybe_apply_feature_settings() { - if ( ! $this->index_meta['put_mapping'] ) { + if ( empty( $this->args['put_mapping'] ) ) { return; } From 2c7ead78a896fc0ae11d72377c110a5de8b2ecda Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Tue, 24 Oct 2023 11:56:44 -0300 Subject: [PATCH 05/11] Update draft using update_feature() --- includes/classes/Features.php | 16 +++++++++++----- includes/classes/REST/Features.php | 4 ++-- tests/php/TestFeatureActivation.php | 11 ++++++----- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/includes/classes/Features.php b/includes/classes/Features.php index d68b63f899..144ffc622c 100644 --- a/includes/classes/Features.php +++ b/includes/classes/Features.php @@ -89,13 +89,14 @@ public function get_registered_feature( $slug ) { /** * Activate or deactivate a feature * - * @param string $slug Feature slug + * @param string $slug Feature slug * @param array $settings Array of settings - * @param bool $force Whether to force activate/deactivate - * @since 2.2 + * @param bool $force Whether to force activate/deactivate + * @param string $target Whether to update a feature settings' draft or current + * @since 2.2, 5.0.0 added $target * @return array|bool */ - public function update_feature( $slug, $settings, $force = true ) { + public function update_feature( $slug, $settings, $force = true, $target = 'current' ) { /** * Get the feature being saved. */ @@ -115,7 +116,7 @@ public function update_feature( $slug, $settings, $force = true ) { /** * Prepare settings */ - $saved_settings = Utils\get_option( 'ep_feature_settings', [] ); + $saved_settings = $this->get_feature_settings(); $feature_settings = isset( $saved_settings[ $slug ] ) ? $saved_settings[ $slug ] : [ 'force_inactive' => false ]; $new_feature_settings = wp_parse_args( @@ -144,6 +145,11 @@ public function update_feature( $slug, $settings, $force = true ) { $new_settings = wp_parse_args( [ $slug => $new_feature_settings ], $saved_settings ); $new_settings = apply_filters( 'ep_sanitize_feature_settings', $new_settings, $feature ); + if ( 'draft' === $target ) { + Utils\update_option( 'ep_feature_settings_draft', $new_settings ); + return true; + } + Utils\update_option( 'ep_feature_settings', $new_settings ); /** diff --git a/includes/classes/REST/Features.php b/includes/classes/REST/Features.php index c8be3a0024..dfd6206fa0 100644 --- a/includes/classes/REST/Features.php +++ b/includes/classes/REST/Features.php @@ -157,6 +157,8 @@ public function update_settings( \WP_REST_Request $request ) { ]; } } + + FeaturesStore::factory()->update_feature( $slug, $new_settings[ $slug ], true, 'draft' ); } } @@ -172,8 +174,6 @@ public function update_settings( \WP_REST_Request $request ) { FeaturesStore::factory()->update_feature( $slug, $feature ); } - FeaturesStore::factory()->save_feature_settings_draft( $new_settings ); - return [ 'data' => $current_settings, 'success' => true, diff --git a/tests/php/TestFeatureActivation.php b/tests/php/TestFeatureActivation.php index 201334bfa1..94d1994c68 100644 --- a/tests/php/TestFeatureActivation.php +++ b/tests/php/TestFeatureActivation.php @@ -363,11 +363,12 @@ public function test_feature_setting_update() { $draft_settings = Features::factory()->get_feature_settings_draft(); $this->assertSame( [ - 'active' => '1', - 'field_1' => '1', - 'field_2' => '1', - 'field_3' => '1', - 'field_4' => '1', + 'active' => true, + 'force_inactive' => false, + 'field_1' => '1', + 'field_2' => '1', + 'field_3' => '1', + 'field_4' => '1', ], $draft_settings['test'] ); From cb1d680b253f7c97bf026142b2ea24af8bb94b9f Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Tue, 24 Oct 2023 12:45:04 -0300 Subject: [PATCH 06/11] Use the correct base of settings --- includes/classes/Features.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/classes/Features.php b/includes/classes/Features.php index 144ffc622c..71c129959c 100644 --- a/includes/classes/Features.php +++ b/includes/classes/Features.php @@ -116,7 +116,7 @@ public function update_feature( $slug, $settings, $force = true, $target = 'curr /** * Prepare settings */ - $saved_settings = $this->get_feature_settings(); + $saved_settings = 'draft' === $target ? $this->get_feature_settings_draft() : $this->get_feature_settings(); $feature_settings = isset( $saved_settings[ $slug ] ) ? $saved_settings[ $slug ] : [ 'force_inactive' => false ]; $new_feature_settings = wp_parse_args( From a74bf3a5d30deac1eed6fe167f6ed8469aa7603a Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Tue, 24 Oct 2023 13:20:05 -0300 Subject: [PATCH 07/11] Update feature in the right place --- includes/classes/Command.php | 2 +- includes/classes/Features.php | 10 ---------- includes/classes/REST/Features.php | 4 ++-- tests/php/TestFeatureActivation.php | 9 ++++++--- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/includes/classes/Command.php b/includes/classes/Command.php index 92cc4a9e69..8c937afecb 100644 --- a/includes/classes/Command.php +++ b/includes/classes/Command.php @@ -174,7 +174,7 @@ public function list_features( $args, $assoc_args ) { $list_all = \WP_CLI\Utils\get_flag_value( $assoc_args, 'all', null ); if ( empty( $list_all ) ) { - $features = Utils\get_option( 'ep_feature_settings', [] ); + $features = Features::factory()->get_feature_settings(); WP_CLI::line( esc_html__( 'Active features:', 'elasticpress' ) ); diff --git a/includes/classes/Features.php b/includes/classes/Features.php index 71c129959c..76d2203d68 100644 --- a/includes/classes/Features.php +++ b/includes/classes/Features.php @@ -348,16 +348,6 @@ public function get_feature_settings_draft() { return Utils\get_option( 'ep_feature_settings_draft', false ); } - /** - * Update features settings draft - * - * @since 5.0.0 - * @param array $settings_draft New settings draft - */ - public function save_feature_settings_draft( array $settings_draft ) { - Utils\update_option( 'ep_feature_settings_draft', $settings_draft ); - } - /** * Apply settings draft (if present) * diff --git a/includes/classes/REST/Features.php b/includes/classes/REST/Features.php index dfd6206fa0..19b9e0a85a 100644 --- a/includes/classes/REST/Features.php +++ b/includes/classes/REST/Features.php @@ -157,9 +157,9 @@ public function update_settings( \WP_REST_Request $request ) { ]; } } - - FeaturesStore::factory()->update_feature( $slug, $new_settings[ $slug ], true, 'draft' ); } + + FeaturesStore::factory()->update_feature( $slug, $new_settings[ $slug ], true, 'draft' ); } foreach ( $settings_that_requires_features as $feature => $fields ) { diff --git a/tests/php/TestFeatureActivation.php b/tests/php/TestFeatureActivation.php index 94d1994c68..ffe5a60f95 100644 --- a/tests/php/TestFeatureActivation.php +++ b/tests/php/TestFeatureActivation.php @@ -381,15 +381,18 @@ public function test_feature_setting_update() { * @group feature-activation */ public function test_feature_setting_applied_after_sync() { - $settings = Features::factory()->get_feature_settings(); - $settings['test'] = [ + Features::factory()->register_feature( + new FeatureTest() + ); + + $test_settings = [ 'active' => '1', 'field_1' => '1', 'field_2' => '1', 'field_3' => '1', ]; - Features::factory()->save_feature_settings_draft( $settings ); + Features::factory()->update_feature( 'test', $test_settings, true, 'draft' ); $wp_cli = new \ElasticPress\Command(); From d9d6ca43de3e465984d0640f1c40ffb5ad0232a5 Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Tue, 24 Oct 2023 14:02:11 -0300 Subject: [PATCH 08/11] Debug cypress tests --- .../cypress/integration/features/instant-results.cy.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/cypress/integration/features/instant-results.cy.js b/tests/cypress/integration/features/instant-results.cy.js index fcfec06190..b1d4edbc49 100644 --- a/tests/cypress/integration/features/instant-results.cy.js +++ b/tests/cypress/integration/features/instant-results.cy.js @@ -232,6 +232,9 @@ describe('Instant Results Feature', { tags: '@slow' }, () => { cy.get('.components-form-token-field__input').type( '{backspace}{backspace}{backspace}price{downArrow}{enter}{esc}', ); + + cy.screenshot('instant-results-facets'); + cy.contains('button', 'Save changes').click(); cy.wait('@apiRequest'); @@ -240,8 +243,13 @@ describe('Instant Results Feature', { tags: '@slow' }, () => { * Perform a search. */ cy.visit('/'); - cy.intercept('*search=ergonomic*').as('apiRequest'); + cy.get('.wp-block-search').last().as('searchBlock'); + cy.get('@searchBlock').find('button').click(); + cy.screenshot('instant-results-modal'); + cy.get('body').type('{esc}'); + + cy.intercept('*search=ergonomic*').as('apiRequest'); cy.get('@searchBlock').find('input[type="search"]').type('ergonomic'); cy.get('@searchBlock').find('button').click(); cy.get('.ep-search-modal').should('be.visible'); From 9c978b9f6ffe1f9cab6113bda5bf28833c658ca0 Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Tue, 24 Oct 2023 14:41:08 -0300 Subject: [PATCH 09/11] Wait until the modal is visible --- tests/cypress/integration/features/instant-results.cy.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/cypress/integration/features/instant-results.cy.js b/tests/cypress/integration/features/instant-results.cy.js index b1d4edbc49..b5073840f3 100644 --- a/tests/cypress/integration/features/instant-results.cy.js +++ b/tests/cypress/integration/features/instant-results.cy.js @@ -246,6 +246,7 @@ describe('Instant Results Feature', { tags: '@slow' }, () => { cy.get('.wp-block-search').last().as('searchBlock'); cy.get('@searchBlock').find('button').click(); + cy.get('.ep-search-modal').should('be.visible'); cy.screenshot('instant-results-modal'); cy.get('body').type('{esc}'); From d0e40bd97ca9d111a123d5bf9ee2c9e85d69f5ea Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Tue, 24 Oct 2023 15:21:29 -0300 Subject: [PATCH 10/11] Set test back to original --- .../integration/features/instant-results.cy.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/tests/cypress/integration/features/instant-results.cy.js b/tests/cypress/integration/features/instant-results.cy.js index b5073840f3..fcfec06190 100644 --- a/tests/cypress/integration/features/instant-results.cy.js +++ b/tests/cypress/integration/features/instant-results.cy.js @@ -232,9 +232,6 @@ describe('Instant Results Feature', { tags: '@slow' }, () => { cy.get('.components-form-token-field__input').type( '{backspace}{backspace}{backspace}price{downArrow}{enter}{esc}', ); - - cy.screenshot('instant-results-facets'); - cy.contains('button', 'Save changes').click(); cy.wait('@apiRequest'); @@ -243,14 +240,8 @@ describe('Instant Results Feature', { tags: '@slow' }, () => { * Perform a search. */ cy.visit('/'); - - cy.get('.wp-block-search').last().as('searchBlock'); - cy.get('@searchBlock').find('button').click(); - cy.get('.ep-search-modal').should('be.visible'); - cy.screenshot('instant-results-modal'); - cy.get('body').type('{esc}'); - cy.intercept('*search=ergonomic*').as('apiRequest'); + cy.get('.wp-block-search').last().as('searchBlock'); cy.get('@searchBlock').find('input[type="search"]').type('ergonomic'); cy.get('@searchBlock').find('button').click(); cy.get('.ep-search-modal').should('be.visible'); From 0d51d070ea9012043b70de6aa6e95a5c673483ec Mon Sep 17 00:00:00 2001 From: Felipe Elia Date: Tue, 24 Oct 2023 16:28:30 -0300 Subject: [PATCH 11/11] Delete draft option on uninstall and save setting if deactivating --- includes/classes/REST/Features.php | 4 ++-- uninstall.php | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/includes/classes/REST/Features.php b/includes/classes/REST/Features.php index 19b9e0a85a..96e0d25cea 100644 --- a/includes/classes/REST/Features.php +++ b/includes/classes/REST/Features.php @@ -136,8 +136,8 @@ public function update_settings( \WP_REST_Request $request ) { if ( isset( $param[ $key ] ) ) { $new_settings[ $slug ][ $key ] = $param[ $key ]; - // Only apply to the current settings if does not require a sync - if ( ! empty( $schema['requires_sync'] ) ) { + // Only apply to the current settings if does not require a sync or if it is activating it + if ( ! empty( $schema['requires_sync'] ) && ! empty( $param[ $key ] ) ) { continue; } diff --git a/uninstall.php b/uninstall.php index 880f7a121f..95c7cb312a 100644 --- a/uninstall.php +++ b/uninstall.php @@ -28,6 +28,7 @@ class EP_Uninstaller { 'ep_host', 'ep_index_meta', 'ep_feature_settings', + 'ep_feature_settings_draft', 'ep_version', 'ep_intro_shown', 'ep_last_sync',