diff --git a/includes/class-convertkit-setup.php b/includes/class-convertkit-setup.php index 16200426..e9de880a 100644 --- a/includes/class-convertkit-setup.php +++ b/includes/class-convertkit-setup.php @@ -44,6 +44,13 @@ public function update() { return; } + /** + * 2.5.2: Migrate Forminator to ConvertKit Form Mappings + */ + if ( ! $current_version || version_compare( $current_version, '2.5.2', '<' ) ) { + $this->migrate_forminator_form_mapping_settings(); + } + /** * 2.5.2: Migrate Contact Form 7 to ConvertKit Form Mappings */ @@ -98,7 +105,52 @@ public function update() { } /** - * 2.5.2: Prefix any Contact Form 7 to ConvertKit Form ID mappings with `form_`, now that + * 2.5.2: Prefix any Forminator to ConvertKit Form ID mappings with `form:`, now that + * the Plugin supports adding a subscriber to a Form, Tag or Sequence. + * + * @since 2.5.2 + */ + private function migrate_forminator_form_mapping_settings() { + + $convertkit_forminator_settings = new ConvertKit_Forminator_Settings(); + + // Bail if no settings exist. + if ( ! $convertkit_forminator_settings->has_settings() ) { + return; + } + + // Get settings. + $settings = $convertkit_forminator_settings->get(); + + // Iterate through settings. + foreach ( $settings as $forminator_form_id => $convertkit_form_id ) { + // Skip keys that are non-numeric e.g. `creator_network_recommendations_*`. + if ( ! is_numeric( $forminator_form_id ) ) { + continue; + } + + // Skip values that are blank i.e. no ConvertKit Form ID specified. + if ( empty( $convertkit_form_id ) ) { + continue; + } + + // Skip values that are non-numeric i.e. the `form_` prefix was already added. + // This should never happen as this routine runs once, but this is a sanity check. + if ( ! is_numeric( $convertkit_form_id ) ) { + continue; + } + + // Prefix the ConvertKit Form ID with `form_`. + $settings[ $forminator_form_id ] = 'form:' . $convertkit_form_id; + } + + // Update settings. + update_option( $convertkit_forminator_settings::SETTINGS_NAME, $settings ); + + } + + /** + * 2.5.2: Prefix any Contact Form 7 to ConvertKit Form ID mappings with `form:`, now that * the Plugin supports adding a subscriber to a Form, Tag or Sequence. * * @since 2.5.2 diff --git a/includes/integrations/forminator/class-convertkit-forminator-admin-settings.php b/includes/integrations/forminator/class-convertkit-forminator-admin-settings.php index c08742e8..e259f91f 100644 --- a/includes/integrations/forminator/class-convertkit-forminator-admin-settings.php +++ b/includes/integrations/forminator/class-convertkit-forminator-admin-settings.php @@ -96,20 +96,6 @@ public function render() { do_settings_sections( $this->settings_key ); - // Get Forms. - $forms = new ConvertKit_Resource_Forms( 'forminator' ); - $creator_network_recommendations = new ConvertKit_Resource_Creator_Network_Recommendations( 'forminator' ); - - // Bail with an error if no ConvertKit Forms exist. - if ( ! $forms->exist() ) { - $this->output_error( __( 'No Forms exist on ConvertKit.', 'convertkit' ) ); - $this->render_container_end(); - return; - } - - // Get Creator Network Recommendations script. - $creator_network_recommendations_enabled = $creator_network_recommendations->enabled(); - // Get Forminator Forms. $forminator_forms = $this->get_forminator_forms(); @@ -120,10 +106,14 @@ public function render() { return; } + // Get Creator Network Recommendations script. + $creator_network_recommendations = new ConvertKit_Resource_Creator_Network_Recommendations( 'forminator' ); + $creator_network_recommendations_enabled = $creator_network_recommendations->enabled(); + // Setup WP_List_Table. $table = new Multi_Value_Field_Table(); $table->add_column( 'title', __( 'Forminator Form', 'convertkit' ), true ); - $table->add_column( 'form', __( 'ConvertKit Form', 'convertkit' ), false ); + $table->add_column( 'form', __( 'ConvertKit', 'convertkit' ), false ); $table->add_column( 'creator_network_recommendations', __( 'Enable Creator Network Recommendations', 'convertkit' ), false ); // Iterate through Forminator Forms, adding a table row for each Forminator Form. @@ -131,14 +121,12 @@ public function render() { // Build row. $table_row = array( 'title' => $forminator_form['name'], - 'form' => $forms->get_select_field_all( + 'form' => convertkit_get_subscription_dropdown_field( '_wp_convertkit_integration_forminator_settings[' . $forminator_form['id'] . ']', - '_wp_convertkit_integration_forminator_settings_' . $forminator_form['id'] . '', - false, - (string) $this->settings->get_convertkit_form_id_by_forminator_form_id( $forminator_form['id'] ), - array( - '' => __( 'None', 'convertkit' ), - ) + (string) $this->settings->get_convertkit_subscribe_setting_by_forminator_form_id( $forminator_form['id'] ), + '_wp_convertkit_integration_forminator_settings_' . $forminator_form['id'], + 'widefat', + 'forminator' ), ); diff --git a/includes/integrations/forminator/class-convertkit-forminator-settings.php b/includes/integrations/forminator/class-convertkit-forminator-settings.php index c5997f4c..5f637cf0 100644 --- a/includes/integrations/forminator/class-convertkit-forminator-settings.php +++ b/includes/integrations/forminator/class-convertkit-forminator-settings.php @@ -87,9 +87,9 @@ public function has_settings() { * @since 2.3.0 * * @param int $forminator_form_id Forminator Form ID. - * @return bool|int + * @return bool|string|int */ - public function get_convertkit_form_id_by_forminator_form_id( $forminator_form_id ) { + public function get_convertkit_subscribe_setting_by_forminator_form_id( $forminator_form_id ) { // Bail if no settings exist. if ( ! $this->has_settings() ) { diff --git a/includes/integrations/forminator/class-convertkit-forminator.php b/includes/integrations/forminator/class-convertkit-forminator.php index 5702eb81..83b3cd12 100644 --- a/includes/integrations/forminator/class-convertkit-forminator.php +++ b/includes/integrations/forminator/class-convertkit-forminator.php @@ -80,11 +80,11 @@ public function maybe_subscribe( $entry, $form_id, $form_data_array ) { // Get ConvertKit Form ID mapped to this Forminator Form. // We deliberately use the entry's form ID, as $form_id for a Quiz will point to a lead generation form, which // has a different Form ID. - $forminator_settings = new ConvertKit_Forminator_Settings(); - $convertkit_form_id = $forminator_settings->get_convertkit_form_id_by_forminator_form_id( $entry->form_id ); + $forminator_settings = new ConvertKit_Forminator_Settings(); + $convertkit_subscribe_setting = $forminator_settings->get_convertkit_subscribe_setting_by_forminator_form_id( $entry->form_id ); - // If no ConvertKit Form is mapped to this Forminator Form, bail. - if ( ! $convertkit_form_id ) { + // If no ConvertKit subscribe setting is defined, bail. + if ( ! $convertkit_subscribe_setting ) { return; } @@ -132,21 +132,54 @@ public function maybe_subscribe( $entry, $form_id, $form_data_array ) { 'forminator' ); - // For Legacy Forms, a different endpoint is used. - $forms = new ConvertKit_Resource_Forms(); - if ( $forms->is_legacy( $convertkit_form_id ) ) { - return $api->legacy_form_subscribe( - $convertkit_form_id, - $email, - $first_name - ); + // Subscribe the email address. + $subscriber = $api->create_subscriber( $email, $first_name ); + if ( is_wp_error( $subscriber ) ) { + return; } - return $api->form_subscribe( - $convertkit_form_id, - $email, - $first_name - ); + // If the setting is 'Subscribe', no Form needs to be assigned to the subscriber. + if ( $convertkit_subscribe_setting === 'subscribe' ) { + return; + } + + // Determine the resource type and ID to assign to the subscriber. + list( $resource_type, $resource_id ) = explode( ':', $convertkit_subscribe_setting ); + + // Cast ID. + $resource_id = absint( $resource_id ); + + // Add the subscriber to the resource type (form, tag etc). + switch ( $resource_type ) { + + /** + * Form + */ + case 'form': + // For Legacy Forms, a different endpoint is used. + $forms = new ConvertKit_Resource_Forms(); + if ( $forms->is_legacy( $resource_id ) ) { + return $api->add_subscriber_to_legacy_form( $resource_id, $subscriber['subscriber']['id'] ); + } + + // Add subscriber to form. + return $api->add_subscriber_to_form( $resource_id, $subscriber['subscriber']['id'] ); + + /** + * Sequence + */ + case 'sequence': + // Add subscriber to sequence. + return $api->add_subscriber_to_sequence( $resource_id, $subscriber['subscriber']['id'] ); + + /** + * Tag + */ + case 'tag': + // Add subscriber to tag. + return $api->tag_subscriber( $resource_id, $subscriber['subscriber']['id'] ); + + } } diff --git a/tests/acceptance/integrations/other/ForminatorCest.php b/tests/acceptance/integrations/other/ForminatorCest.php index 1ea15872..57abfc9f 100644 --- a/tests/acceptance/integrations/other/ForminatorCest.php +++ b/tests/acceptance/integrations/other/ForminatorCest.php @@ -37,44 +37,562 @@ public function testSettingsForminatorWhenNoCredentials(AcceptanceTester $I) } /** - * Tests that no Forminator settings display and a 'No Forms exist on ConvertKit' - * notification displays when no Forms exist. + * Test that saving a Forminator Form to ConvertKit Form Mapping works. + * + * @since 2.3.0 + * + * @param AcceptanceTester $I Tester. + */ + public function testSettingsForminatorFormToConvertKitFormMapping(AcceptanceTester $I) + { + // Setup ConvertKit Plugin. + $I->setupConvertKitPluginNoDefaultForms($I); + $I->setupConvertKitPluginResources($I); + + // Create Forminator Form. + $forminatorFormID = $this->_createForminatorForm($I); + + // Load Forminator Plugin Settings. + $I->amOnAdminPage('options-general.php?page=_wp_convertkit_settings&tab=forminator'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check that a Form Mapping option is displayed. + $I->seeElementInDOM('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID); + + // Change Form to value specified in the .env file. + $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_THIRD_PARTY_INTEGRATIONS_FORM_NAME']); + + $I->click('Save Changes'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check the value of the Form field matches the input provided. + $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_THIRD_PARTY_INTEGRATIONS_FORM_NAME']); + + // Create Page with Forminator Shortcode. + $I->havePageInDatabase( + [ + 'post_title' => 'ConvertKit: Forminator Shortcode', + 'post_name' => 'convertkit-forminator-form-shortcode', + 'post_content' => 'Form: +[forminator_form id="' . $forminatorFormID . '"]', + ] + ); + + // Load the Page on the frontend site. + $I->amOnPage('/convertkit-forminator-form-shortcode'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Define email address for this test. + $emailAddress = $I->generateEmailAddress(); + + // Complete Name and Email. + $I->fillField('input[name=name-1]', 'ConvertKit Name'); + $I->fillField('input[name=email-1]', $emailAddress); + + // Submit Form. + $I->click('button.forminator-button-submit'); + + // Wait for response message. + $I->waitForElementVisible('.forminator-response-message'); + + // Confirm the form submitted without errors. + $I->performOn( + '.forminator-response-message', + function($I) { + $I->see('Form entry saved'); + } + ); + + // Confirm that the email address was added to ConvertKit. + $I->apiCheckSubscriberExists($I, $emailAddress); + } + + /** + * Test that saving a Forminator Form to ConvertKit Legacy Form Mapping works. + * + * @since 2.5.0 + * + * @param AcceptanceTester $I Tester. + */ + public function testSettingsForminatorFormToConvertKitLegacyFormMapping(AcceptanceTester $I) + { + // Setup ConvertKit Plugin. + $I->setupConvertKitPluginNoDefaultForms($I); + $I->setupConvertKitPluginResources($I); + + // Create Forminator Form. + $forminatorFormID = $this->_createForminatorForm($I); + + // Load Forminator Plugin Settings. + $I->amOnAdminPage('options-general.php?page=_wp_convertkit_settings&tab=forminator'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check that a Form Mapping option is displayed. + $I->seeElementInDOM('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID); + + // Change Form to value specified in the .env file. + $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_LEGACY_FORM_NAME']); + + $I->click('Save Changes'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check the value of the Form field matches the input provided. + $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_LEGACY_FORM_NAME']); + + // Create Page with Forminator Shortcode. + $I->havePageInDatabase( + [ + 'post_title' => 'ConvertKit: Forminator Shortcode: Legacy Form', + 'post_name' => 'convertkit-forminator-form-shortcode-legacy-form', + 'post_content' => 'Form: +[forminator_form id="' . $forminatorFormID . '"]', + ] + ); + + // Load the Page on the frontend site. + $I->amOnPage('/convertkit-forminator-form-shortcode-legacy-form'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Define email address for this test. + $emailAddress = $I->generateEmailAddress(); + + // Complete Name and Email. + $I->fillField('input[name=name-1]', 'ConvertKit Name'); + $I->fillField('input[name=email-1]', $emailAddress); + + // Submit Form. + $I->click('button.forminator-button-submit'); + + // Wait for response message. + $I->waitForElementVisible('.forminator-response-message'); + + // Confirm the form submitted without errors. + $I->performOn( + '.forminator-response-message', + function($I) { + $I->see('Form entry saved'); + } + ); + + // Confirm that the email address was added to ConvertKit. + $I->apiCheckSubscriberExists($I, $emailAddress); + } + + /** + * Test that saving a Forminator Form to ConvertKit Tag Mapping works. + * + * @since 2.5.2 + * + * @param AcceptanceTester $I Tester. + */ + public function testSettingsForminatorFormToConvertKitTagMapping(AcceptanceTester $I) + { + // Setup ConvertKit Plugin. + $I->setupConvertKitPluginNoDefaultForms($I); + $I->setupConvertKitPluginResources($I); + + // Create Forminator Form. + $forminatorFormID = $this->_createForminatorForm($I); + + // Load Forminator Plugin Settings. + $I->amOnAdminPage('options-general.php?page=_wp_convertkit_settings&tab=forminator'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check that a Form Mapping option is displayed. + $I->seeElementInDOM('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID); + + // Change Form to value specified in the .env file. + $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_TAG_NAME']); + + $I->click('Save Changes'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check the value of the Form field matches the input provided. + $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_TAG_NAME']); + + // Create Page with Forminator Shortcode. + $I->havePageInDatabase( + [ + 'post_title' => 'ConvertKit: Forminator Shortcode: Tag', + 'post_name' => 'convertkit-forminator-form-shortcode-tag', + 'post_content' => 'Form: +[forminator_form id="' . $forminatorFormID . '"]', + ] + ); + + // Load the Page on the frontend site. + $I->amOnPage('/convertkit-forminator-form-shortcode-tag'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Define email address for this test. + $emailAddress = $I->generateEmailAddress(); + + // Complete Name and Email. + $I->fillField('input[name=name-1]', 'ConvertKit Name'); + $I->fillField('input[name=email-1]', $emailAddress); + + // Submit Form. + $I->click('button.forminator-button-submit'); + + // Wait for response message. + $I->waitForElementVisible('.forminator-response-message'); + + // Confirm the form submitted without errors. + $I->performOn( + '.forminator-response-message', + function($I) { + $I->see('Form entry saved'); + } + ); + + // Confirm that the email address was added to ConvertKit. + $subscriberID = $I->apiCheckSubscriberExists($I, $emailAddress); + + // Check that the subscriber has been assigned to the tag. + $I->apiCheckSubscriberHasTag($I, $subscriberID, $_ENV['CONVERTKIT_API_TAG_ID']); + } + + /** + * Test that saving a Forminator Form to ConvertKit Sequence Mapping works. + * + * @since 2.5.2 + * + * @param AcceptanceTester $I Tester. + */ + public function testSettingsForminatorFormToConvertKitSequenceMapping(AcceptanceTester $I) + { + // Setup ConvertKit Plugin. + $I->setupConvertKitPluginNoDefaultForms($I); + $I->setupConvertKitPluginResources($I); + + // Create Forminator Form. + $forminatorFormID = $this->_createForminatorForm($I); + + // Load Forminator Plugin Settings. + $I->amOnAdminPage('options-general.php?page=_wp_convertkit_settings&tab=forminator'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check that a Form Mapping option is displayed. + $I->seeElementInDOM('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID); + + // Change Form to value specified in the .env file. + $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_SEQUENCE_NAME']); + + $I->click('Save Changes'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check the value of the Form field matches the input provided. + $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_SEQUENCE_NAME']); + + // Create Page with Forminator Shortcode. + $I->havePageInDatabase( + [ + 'post_title' => 'ConvertKit: Forminator Shortcode: Sequence', + 'post_name' => 'convertkit-forminator-form-shortcode-sequence', + 'post_content' => 'Form: +[forminator_form id="' . $forminatorFormID . '"]', + ] + ); + + // Load the Page on the frontend site. + $I->amOnPage('/convertkit-forminator-form-shortcode-sequence'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Define email address for this test. + $emailAddress = $I->generateEmailAddress(); + + // Complete Name and Email. + $I->fillField('input[name=name-1]', 'ConvertKit Name'); + $I->fillField('input[name=email-1]', $emailAddress); + + // Submit Form. + $I->click('button.forminator-button-submit'); + + // Wait for response message. + $I->waitForElementVisible('.forminator-response-message'); + + // Confirm the form submitted without errors. + $I->performOn( + '.forminator-response-message', + function($I) { + $I->see('Form entry saved'); + } + ); + + // Confirm that the email address was added to ConvertKit. + $subscriberID = $I->apiCheckSubscriberExists($I, $emailAddress); + + // Check that the subscriber has been assigned to the sequence. + $I->apiCheckSubscriberHasSequence($I, $subscriberID, $_ENV['CONVERTKIT_API_SEQUENCE_ID']); + } + + /** + * Test that setting a Forminator Form to the '(Do not subscribe)' option works. + * + * @since 2.5.2 + * + * @param AcceptanceTester $I Tester. + */ + public function testSettingsForminatorFormDoNotSubscribeOption(AcceptanceTester $I) + { + // Setup ConvertKit Plugin. + $I->setupConvertKitPluginNoDefaultForms($I); + $I->setupConvertKitPluginResources($I); + + // Create Forminator Form. + $forminatorFormID = $this->_createForminatorForm($I); + + // Load Forminator Plugin Settings. + $I->amOnAdminPage('options-general.php?page=_wp_convertkit_settings&tab=forminator'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check that a Form Mapping option is displayed. + $I->seeElementInDOM('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID); + + // Change Form to value specified in the .env file. + $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, '(Do not subscribe)'); + + $I->click('Save Changes'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check the value of the Form field matches the input provided. + $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, '(Do not subscribe)'); + + // Create Page with Forminator Shortcode. + $I->havePageInDatabase( + [ + 'post_title' => 'ConvertKit: Forminator Shortcode: Do not subscribe', + 'post_name' => 'convertkit-forminator-form-shortcode-do-not-subscribe', + 'post_content' => 'Form: +[forminator_form id="' . $forminatorFormID . '"]', + ] + ); + + // Load the Page on the frontend site. + $I->amOnPage('/convertkit-forminator-form-shortcode-do-not-subscribe'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Define email address for this test. + $emailAddress = $I->generateEmailAddress(); + + // Complete Name and Email. + $I->fillField('input[name=name-1]', 'ConvertKit Name'); + $I->fillField('input[name=email-1]', $emailAddress); + + // Submit Form. + $I->click('button.forminator-button-submit'); + + // Wait for response message. + $I->waitForElementVisible('.forminator-response-message'); + + // Confirm the form submitted without errors. + $I->performOn( + '.forminator-response-message', + function($I) { + $I->see('Form entry saved'); + } + ); + + // Confirm that the email address was not added to ConvertKit. + $I->apiCheckSubscriberDoesNotExist($I, $emailAddress); + } + + /** + * Test that setting a Forminator Form to the 'Subscribe' option works. + * + * @since 2.5.2 + * + * @param AcceptanceTester $I Tester. + */ + public function testSettingsForminatorFormSubscribeOption(AcceptanceTester $I) + { + // Setup ConvertKit Plugin. + $I->setupConvertKitPluginNoDefaultForms($I); + $I->setupConvertKitPluginResources($I); + + // Create Forminator Form. + $forminatorFormID = $this->_createForminatorForm($I); + + // Load Forminator Plugin Settings. + $I->amOnAdminPage('options-general.php?page=_wp_convertkit_settings&tab=forminator'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check that a Form Mapping option is displayed. + $I->seeElementInDOM('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID); + + // Change Form to value specified in the .env file. + $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, 'Subscribe'); + + $I->click('Save Changes'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check the value of the Form field matches the input provided. + $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, 'Subscribe'); + + // Create Page with Forminator Shortcode. + $I->havePageInDatabase( + [ + 'post_title' => 'ConvertKit: Forminator Shortcode: Subscribe', + 'post_name' => 'convertkit-forminator-form-shortcode-subscribe', + 'post_content' => 'Form: +[forminator_form id="' . $forminatorFormID . '"]', + ] + ); + + // Load the Page on the frontend site. + $I->amOnPage('/convertkit-forminator-form-shortcode-subscribe'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Define email address for this test. + $emailAddress = $I->generateEmailAddress(); + + // Complete Name and Email. + $I->fillField('input[name=name-1]', 'ConvertKit Name'); + $I->fillField('input[name=email-1]', $emailAddress); + + // Submit Form. + $I->click('button.forminator-button-submit'); + + // Wait for response message. + $I->waitForElementVisible('.forminator-response-message'); + + // Confirm the form submitted without errors. + $I->performOn( + '.forminator-response-message', + function($I) { + $I->see('Form entry saved'); + } + ); + + // Confirm that the email address was added to ConvertKit. + $I->apiCheckSubscriberExists($I, $emailAddress); + } + + /** + * Test that saving a Forminator Quiz to ConvertKit Form Mapping works. * - * @since 2.3.0 + * @since 2.4.3 * * @param AcceptanceTester $I Tester. */ - public function testSettingsForminatorWhenNoForms(AcceptanceTester $I) + public function testSettingsForminatorQuizToConvertKitFormMapping(AcceptanceTester $I) { - // Setup Plugin. - $I->setupConvertKitPluginCredentialsNoData($I); - $I->setupConvertKitPluginResourcesNoData($I); + // Setup ConvertKit Plugin. + $I->setupConvertKitPluginNoDefaultForms($I); + $I->setupConvertKitPluginResources($I); + + // Create Forminator Quiz. + $forminatorFormID = $this->_createForminatorQuiz($I); // Load Forminator Plugin Settings. $I->amOnAdminPage('options-general.php?page=_wp_convertkit_settings&tab=forminator'); - // Confirm notice is displayed. - $I->see('No Forms exist on ConvertKit.'); + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check that a Form Mapping option is displayed. + $I->seeElementInDOM('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID); - // Confirm no settings table is displayed. - $I->dontSeeElementInDOM('table.wp-list-table'); + // Change Form to value specified in the .env file. + $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_THIRD_PARTY_INTEGRATIONS_FORM_NAME']); + + $I->click('Save Changes'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check the value of the Form field matches the input provided. + $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_THIRD_PARTY_INTEGRATIONS_FORM_NAME']); + + // Create Page with Forminator Shortcode. + $I->havePageInDatabase( + [ + 'post_title' => 'ConvertKit: Forminator Quiz Shortcode', + 'post_name' => 'convertkit-forminator-quiz-shortcode', + 'post_content' => 'Form: +[forminator_quiz id="' . $forminatorFormID . '"]', + ] + ); + + // Load the Page on the frontend site. + $I->amOnPage('/convertkit-forminator-quiz-shortcode'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Define email address for this test. + $emailAddress = $I->generateEmailAddress(); + + // Complete quiz. + $I->checkOption('answers[question-1-0]', '0'); + $I->click('View Results'); + + // Complete Name and Email. + $I->waitForElementVisible('input[name=name-1]'); + $I->fillField('input[name=name-1]', 'ConvertKit Name'); + $I->fillField('input[name=email-1]', $emailAddress); + + // Submit Form. + $I->click('Submit'); + + // Wait for submission to complete. + $I->waitForElementVisible('.forminator-icon-check'); + + // Confirm that the email address was added to ConvertKit. + $I->apiCheckSubscriberExists($I, $emailAddress); } /** - * Test that saving a Forminator Form to ConvertKit Form Mapping works. + * Test that saving a Forminator Quiz to ConvertKit Tag Mapping works. * - * @since 2.3.0 + * @since 2.5.2 * * @param AcceptanceTester $I Tester. */ - public function testSettingsForminatorFormToConvertKitFormMapping(AcceptanceTester $I) + public function testSettingsForminatorQuizToConvertKitTagMapping(AcceptanceTester $I) { // Setup ConvertKit Plugin. $I->setupConvertKitPluginNoDefaultForms($I); $I->setupConvertKitPluginResources($I); - // Create Forminator Form. - $forminatorFormID = $this->_createForminatorForm($I); + // Create Forminator Quiz. + $forminatorFormID = $this->_createForminatorQuiz($I); // Load Forminator Plugin Settings. $I->amOnAdminPage('options-general.php?page=_wp_convertkit_settings&tab=forminator'); @@ -86,7 +604,7 @@ public function testSettingsForminatorFormToConvertKitFormMapping(AcceptanceTest $I->seeElementInDOM('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID); // Change Form to value specified in the .env file. - $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_THIRD_PARTY_INTEGRATIONS_FORM_NAME']); + $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_TAG_NAME']); $I->click('Save Changes'); @@ -94,20 +612,20 @@ public function testSettingsForminatorFormToConvertKitFormMapping(AcceptanceTest $I->checkNoWarningsAndNoticesOnScreen($I); // Check the value of the Form field matches the input provided. - $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_THIRD_PARTY_INTEGRATIONS_FORM_NAME']); + $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_TAG_NAME']); // Create Page with Forminator Shortcode. $I->havePageInDatabase( [ - 'post_title' => 'ConvertKit: Forminator Shortcode', - 'post_name' => 'convertkit-forminator-form-shortcode', + 'post_title' => 'ConvertKit: Forminator Quiz Shortcode: Tag', + 'post_name' => 'convertkit-forminator-quiz-shortcode-tag', 'post_content' => 'Form: -[forminator_form id="' . $forminatorFormID . '"]', +[forminator_quiz id="' . $forminatorFormID . '"]', ] ); // Load the Page on the frontend site. - $I->amOnPage('/convertkit-forminator-form-shortcode'); + $I->amOnPage('/convertkit-forminator-quiz-shortcode-tag'); // Check that no PHP warnings or notices were output. $I->checkNoWarningsAndNoticesOnScreen($I); @@ -115,43 +633,43 @@ public function testSettingsForminatorFormToConvertKitFormMapping(AcceptanceTest // Define email address for this test. $emailAddress = $I->generateEmailAddress(); + // Complete quiz. + $I->checkOption('answers[question-1-0]', '0'); + $I->click('View Results'); + // Complete Name and Email. + $I->waitForElementVisible('input[name=name-1]'); $I->fillField('input[name=name-1]', 'ConvertKit Name'); $I->fillField('input[name=email-1]', $emailAddress); // Submit Form. - $I->click('button.forminator-button-submit'); - - // Wait for response message. - $I->waitForElementVisible('.forminator-response-message'); + $I->click('Submit'); - // Confirm the form submitted without errors. - $I->performOn( - '.forminator-response-message', - function($I) { - $I->see('Form entry saved'); - } - ); + // Wait for submission to complete. + $I->waitForElementVisible('.forminator-icon-check'); // Confirm that the email address was added to ConvertKit. - $I->apiCheckSubscriberExists($I, $emailAddress); + $subscriberID = $I->apiCheckSubscriberExists($I, $emailAddress); + + // Check that the subscriber has been assigned to the tag. + $I->apiCheckSubscriberHasTag($I, $subscriberID, $_ENV['CONVERTKIT_API_TAG_ID']); } /** - * Test that saving a Forminator Form to ConvertKit Legacy Form Mapping works. + * Test that saving a Forminator Quiz to ConvertKit Sequence Mapping works. * - * @since 2.5.0 + * @since 2.5.2 * * @param AcceptanceTester $I Tester. */ - public function testSettingsForminatorFormToConvertKitLegacyFormMapping(AcceptanceTester $I) + public function testSettingsForminatorQuizToConvertKitSequenceMapping(AcceptanceTester $I) { // Setup ConvertKit Plugin. $I->setupConvertKitPluginNoDefaultForms($I); $I->setupConvertKitPluginResources($I); - // Create Forminator Form. - $forminatorFormID = $this->_createForminatorForm($I); + // Create Forminator Quiz. + $forminatorFormID = $this->_createForminatorQuiz($I); // Load Forminator Plugin Settings. $I->amOnAdminPage('options-general.php?page=_wp_convertkit_settings&tab=forminator'); @@ -163,7 +681,7 @@ public function testSettingsForminatorFormToConvertKitLegacyFormMapping(Acceptan $I->seeElementInDOM('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID); // Change Form to value specified in the .env file. - $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_LEGACY_FORM_NAME']); + $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_SEQUENCE_NAME']); $I->click('Save Changes'); @@ -171,20 +689,20 @@ public function testSettingsForminatorFormToConvertKitLegacyFormMapping(Acceptan $I->checkNoWarningsAndNoticesOnScreen($I); // Check the value of the Form field matches the input provided. - $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_LEGACY_FORM_NAME']); + $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_SEQUENCE_NAME']); // Create Page with Forminator Shortcode. $I->havePageInDatabase( [ - 'post_title' => 'ConvertKit: Forminator Shortcode: Legacy Form', - 'post_name' => 'convertkit-forminator-form-shortcode-legacy-form', + 'post_title' => 'ConvertKit: Forminator Quiz Shortcode: Sequence', + 'post_name' => 'convertkit-forminator-quiz-shortcode-sequence', 'post_content' => 'Form: -[forminator_form id="' . $forminatorFormID . '"]', +[forminator_quiz id="' . $forminatorFormID . '"]', ] ); // Load the Page on the frontend site. - $I->amOnPage('/convertkit-forminator-form-shortcode-legacy-form'); + $I->amOnPage('/convertkit-forminator-quiz-shortcode-sequence'); // Check that no PHP warnings or notices were output. $I->checkNoWarningsAndNoticesOnScreen($I); @@ -192,36 +710,110 @@ public function testSettingsForminatorFormToConvertKitLegacyFormMapping(Acceptan // Define email address for this test. $emailAddress = $I->generateEmailAddress(); + // Complete quiz. + $I->checkOption('answers[question-1-0]', '0'); + $I->click('View Results'); + // Complete Name and Email. + $I->waitForElementVisible('input[name=name-1]'); $I->fillField('input[name=name-1]', 'ConvertKit Name'); $I->fillField('input[name=email-1]', $emailAddress); // Submit Form. - $I->click('button.forminator-button-submit'); + $I->click('Submit'); - // Wait for response message. - $I->waitForElementVisible('.forminator-response-message'); + // Wait for submission to complete. + $I->waitForElementVisible('.forminator-icon-check'); - // Confirm the form submitted without errors. - $I->performOn( - '.forminator-response-message', - function($I) { - $I->see('Form entry saved'); - } + // Confirm that the email address was added to ConvertKit. + $subscriberID = $I->apiCheckSubscriberExists($I, $emailAddress); + + // Check that the subscriber has been assigned to the sequence. + $I->apiCheckSubscriberHasSequence($I, $subscriberID, $_ENV['CONVERTKIT_API_SEQUENCE_ID']); + } + + /** + * Test that setting a Forminator Quiz Form to the '(Do not subscribe)' option works. + * + * @since 2.5.2 + * + * @param AcceptanceTester $I Tester. + */ + public function testSettingsForminatorQuizDoNotSubscribeOption(AcceptanceTester $I) + { + // Setup ConvertKit Plugin. + $I->setupConvertKitPluginNoDefaultForms($I); + $I->setupConvertKitPluginResources($I); + + // Create Forminator Quiz. + $forminatorFormID = $this->_createForminatorQuiz($I); + + // Load Forminator Plugin Settings. + $I->amOnAdminPage('options-general.php?page=_wp_convertkit_settings&tab=forminator'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check that a Form Mapping option is displayed. + $I->seeElementInDOM('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID); + + // Change Form to value specified in the .env file. + $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, '(Do not subscribe)'); + + $I->click('Save Changes'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Check the value of the Form field matches the input provided. + $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, '(Do not subscribe)'); + + // Create Page with Forminator Shortcode. + $I->havePageInDatabase( + [ + 'post_title' => 'ConvertKit: Forminator Quiz Shortcode: Do not subscribe', + 'post_name' => 'convertkit-forminator-quiz-shortcode-do-not-subscribe', + 'post_content' => 'Form: +[forminator_quiz id="' . $forminatorFormID . '"]', + ] ); - // Confirm that the email address was added to ConvertKit. - $I->apiCheckSubscriberExists($I, $emailAddress); + // Load the Page on the frontend site. + $I->amOnPage('/convertkit-forminator-quiz-shortcode-do-not-subscribe'); + + // Check that no PHP warnings or notices were output. + $I->checkNoWarningsAndNoticesOnScreen($I); + + // Define email address for this test. + $emailAddress = $I->generateEmailAddress(); + + // Complete quiz. + $I->checkOption('answers[question-1-0]', '0'); + $I->click('View Results'); + + // Complete Name and Email. + $I->waitForElementVisible('input[name=name-1]'); + $I->fillField('input[name=name-1]', 'ConvertKit Name'); + $I->fillField('input[name=email-1]', $emailAddress); + + // Submit Form. + $I->click('Submit'); + + // Wait for submission to complete. + $I->waitForElementVisible('.forminator-icon-check'); + + // Confirm that the email address was not added to ConvertKit. + $I->apiCheckSubscriberDoesNotExist($I, $emailAddress); } /** - * Test that saving a Forminator Quiz to ConvertKit Form Mapping works. + * Test that setting a Forminator Quiz to the 'Subscribe' option works. * - * @since 2.4.3 + * @since 2.5.2 * * @param AcceptanceTester $I Tester. */ - public function testSettingsForminatorQuizToConvertKitFormMapping(AcceptanceTester $I) + public function testSettingsForminatorQuizSubscribeOption(AcceptanceTester $I) { // Setup ConvertKit Plugin. $I->setupConvertKitPluginNoDefaultForms($I); @@ -240,7 +832,7 @@ public function testSettingsForminatorQuizToConvertKitFormMapping(AcceptanceTest $I->seeElementInDOM('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID); // Change Form to value specified in the .env file. - $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_THIRD_PARTY_INTEGRATIONS_FORM_NAME']); + $I->selectOption('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, '(Do not subscribe)'); $I->click('Save Changes'); @@ -248,20 +840,20 @@ public function testSettingsForminatorQuizToConvertKitFormMapping(AcceptanceTest $I->checkNoWarningsAndNoticesOnScreen($I); // Check the value of the Form field matches the input provided. - $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, $_ENV['CONVERTKIT_API_THIRD_PARTY_INTEGRATIONS_FORM_NAME']); + $I->seeOptionIsSelected('#_wp_convertkit_integration_forminator_settings_' . $forminatorFormID, '(Do not subscribe)'); // Create Page with Forminator Shortcode. $I->havePageInDatabase( [ - 'post_title' => 'ConvertKit: Forminator Quiz Shortcode', - 'post_name' => 'convertkit-forminator-quiz-shortcode', + 'post_title' => 'ConvertKit: Forminator Quiz Shortcode: Subscribe', + 'post_name' => 'convertkit-forminator-quiz-shortcode-subscribe', 'post_content' => 'Form: [forminator_quiz id="' . $forminatorFormID . '"]', ] ); // Load the Page on the frontend site. - $I->amOnPage('/convertkit-forminator-quiz-shortcode'); + $I->amOnPage('/convertkit-forminator-quiz-shortcode-subscribe'); // Check that no PHP warnings or notices were output. $I->checkNoWarningsAndNoticesOnScreen($I); @@ -284,8 +876,8 @@ public function testSettingsForminatorQuizToConvertKitFormMapping(AcceptanceTest // Wait for submission to complete. $I->waitForElementVisible('.forminator-icon-check'); - // Confirm that the email address was added to ConvertKit. - $I->apiCheckSubscriberExists($I, $emailAddress); + // Confirm that the email address was not added to ConvertKit. + $I->apiCheckSubscriberDoesNotExist($I, $emailAddress); } /** @@ -398,6 +990,43 @@ function($I) { $I->waitForElementVisible('div[data-component="Page"]'); } + /** + * Tests that existing settings are automatically migrated when updating + * the Plugin to 2.5.2 or higher. + * + * @since 2.5.2 + * + * @param AcceptanceTester $I Tester. + */ + public function testSettingsMigratedOnUpgrade(AcceptanceTester $I) + { + // Create settings as if they were created / edited when the ConvertKit Plugin < 2.5.2 + // was active. + $I->haveOptionInDatabase( + '_wp_convertkit_integration_forminator_settings', + [ + '1' => $_ENV['CONVERTKIT_API_FORM_ID'], + 'creator_network_recommendations_1' => '1', + '2' => '', + ] + ); + + // Downgrade the Plugin version to simulate an upgrade. + $I->haveOptionInDatabase('convertkit_version', '2.4.9'); + + // Load admin screen. + $I->amOnAdminPage('index.php'); + + // Check settings structure has been updated. + $settings = $I->grabOptionFromDatabase('_wp_convertkit_integration_forminator_settings'); + $I->assertArrayHasKey('1', $settings); + $I->assertArrayHasKey('creator_network_recommendations_1', $settings); + $I->assertArrayHasKey('2', $settings); + $I->assertEquals($settings['1'], 'form:' . $_ENV['CONVERTKIT_API_FORM_ID']); + $I->assertEquals($settings['creator_network_recommendations_1'], '1'); + $I->assertEquals($settings['2'], ''); + } + /** * Creates a Forminator Form *