From cfdcf04c87e0d73fee62af34d5177e1628e81ca7 Mon Sep 17 00:00:00 2001 From: Istvan Vas Date: Fri, 21 Feb 2025 15:13:47 +0000 Subject: [PATCH 01/13] adCAPTCHA integrated to Gravity form, icon changed, submit working. --- assets/adcaptcha_icon.png | Bin 0 -> 3556 bytes assets/gravity-forms_logo.svg | 1 + src/Instantiate.php | 5 + src/Plugin/GravityForms/Field.php | 147 ++++++++++++++++++++++++++++++ src/Plugin/GravityForms/Forms.php | 39 ++++++++ src/Settings/Plugins.php | 6 ++ 6 files changed, 198 insertions(+) create mode 100644 assets/adcaptcha_icon.png create mode 100644 assets/gravity-forms_logo.svg create mode 100644 src/Plugin/GravityForms/Field.php create mode 100644 src/Plugin/GravityForms/Forms.php diff --git a/assets/adcaptcha_icon.png b/assets/adcaptcha_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..337652fef7583d16e006879a685f2107c04408d4 GIT binary patch literal 3556 zcmVBE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z36V)eK~#7F?VWq*)npvTHB-yNKEc zG7D6)Fw!!#Ff5Y#!^~28BPO9459HjGKT*G@U6|hn{RC}=wm=&KT8H`FkkfHsL3;mB0ou_SZJ@k3 z#+wP5?!&UR&}YypXhl^!F;!$tU?S?Hfm&I6(f*at6lf?EG$Ot#Y!N7fd1{T%z0hmW zIH;Q~a4NT5yE2+5Xr?{b$ge|JLtV7N(B944q2AyZUrfLN;PgbO}sfTy$7eTyJZ#`rl>xeV2pc87G z2VG^mW|_w};e5*HRq5H#Sew<$JT~d(TQ;}tGtd>bnj!PpB3q1dxqY99tPJmvd5W=- zZMLE#3gq|6N5AGEWj}<;ufXz9c$qka@~wgrvRU0J5=hGs`@2iIq3~qv#q3 zlNpE1V~ncw36DSz?~T(-nI{gd@~7pQS0B@E$~>l|+(^eEtoNICRpv1zq2I1W#iE4) z0vs@QRN%WmEA#j$G*gEFJu*6Moy-$PMayalTv@w--({XKDq2=cU@#W!cg;uUsl}x4 zVFY-;Yk2JnnWvVBzSko#qIQMMQ%gkO>k;5MXYV1=N*bA`9x5%bCBX5`d}Xg6GLMf! zGX?~P1k=boK^mHmA|Ufb5z_j)1bE8shxR-^3e6Z0;M>Lcruj<9JRS*6O$iM263RRt z2~AB2>}MXn>qQ{~CItL}@!prf{4 z%(KTdr_zZ42vknjJ@f1q5)p_&;Bcmud14S#Ql9{Sx_tBeiFuuI`D`>3L7Kxcjg_dGHWi6~46>}Q_OO>!xX z2!KFkEOT(rvr1S*AP#|`dA>o$-{NFeTDJ)V&BI|CpSq1hy^lj6XddQ!H%?}yb(=t~ zd6v12L%okfpw>L^A+tsm#v$l%+FJAc3KkzZ%tKv|L7>(=%*ubX~N=GX4;iS?k>6+s<8udPkKt1y?-^{4YTJJW2M&?-qG)vvaquw_n(8xT@H@#72t#g||lzHX>&-ZR4 zQt#^#h%(P!WSm+rvzEI}Aj&+XGXv5HL$`er+Iti8Y)4M*eM0fMz0kxwBs2x$a1DhB z_ykPNL*vju3K8%Ln3{(f9)~vjIW^-vfjH*b0b2JsPfP%O0&&d4OtYa6{M?#xnm}Ch zaB%zth&N6ZjuVJ$9^zU7O>>-^x(@;&aF;+*^YGw#Jfvs5-1Sc4Jr9vB zhIHlGVe|06);1G-$q&!I1~gMhHLvz!@gO$4?c&weHuV$udTX11INEl-(Ko(DbqvJE zb-EbksGlfL81-9K%r(5rp3O^o%oA+$m-sR+xIpvP3H)rm27?OHFb}Jl3-R`a zA{zqRvZFzse*o`mj79U-D+U8-6+@)Rs{lYH_YXtZru3W>0dDx*<5DoM@zbLE_ zc+*O$F$%S19yWp3elCP|@{1yM0$-uTTpx?FX&%yg2O0+PSV)mRftS-S(!505=3z_t zhShVSLR_0*gGv;$^6X0%=3)Ong3f|8jDs}N3!ZWD@F17S$~^4cYUniRLw-@DM&Pm3 zN{U%fmgZs8wm@e?ukec^6$0~7N-o!YvNjKC{Q+GDO@uTS8W5Tc4rRHo$ubgU&%-=y zC_DTxG#t`_G$1q?3y?qa>pppz$799Ohyx+rQ1yr;pWcY9yOL**pEGasu*I98^PxMS zJ&+<9f%V9CSF)_hauvZmY&n0%ra&h{??Z}Y1g0TdX0Jgmig`R#Je?l`-3;yU7HS%c z07rFZGAyQO<{>4XfjtTJgJwhAD=Ewg@Q;qSgsfkXEuwimOq(%t4Rkt``|ty=Q7tmv zh;|NzcwNm}6xlppr+NAP42XB=KlT=C8cBd74asd?WXgmITERSC*A`*s6zEbYxBEF> zV_IZN;|zwZyxF9c%){-);~(DI;5{XzGHw-yCmgP>Sy%2 z0L9KADJ`e`47?mpB*vFYe%<1&p|x>-whSbAdT9Srg_lyN_4{KCD04dCa6*U z74z^o!L`_n4ll3D>pMC0tg2Ua+5^+>0Ud(*&H=T@e3^nbrC+Uz{W<~S9{c#J$c4vC eU7^Z2tbYL`Ec^C%cU8y$0000 \ No newline at end of file diff --git a/src/Instantiate.php b/src/Instantiate.php index 99b584c..cb4ffca 100644 --- a/src/Instantiate.php +++ b/src/Instantiate.php @@ -17,6 +17,7 @@ use AdCaptcha\Plugin\WPForms\Forms as WPForms; use AdCaptcha\Plugin\Elementor\Forms as Elementor; use AdCaptcha\Plugin\FluentForms\Forms as FluentForms; +use AdCaptcha\Plugin\GravityForms\Forms as GravityForms; class Instantiate { @@ -83,6 +84,10 @@ public function setup() { 'instance' => FluentForms::class, 'plugin' => [ 'fluentform/fluentform.php' ], ], + 'GravityForms_Forms' => [ + 'instance' => GravityForms::class, + 'plugin' => [ 'gravityforms/gravityforms.php' ], + ], ]; $selected_plugins = get_option('adcaptcha_selected_plugins') ? get_option('adcaptcha_selected_plugins') : array(); diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php new file mode 100644 index 0000000..5ce8a82 --- /dev/null +++ b/src/Plugin/GravityForms/Field.php @@ -0,0 +1,147 @@ +verify = new Verify(); + $this->setup(); + } + + private function setup(): void { + error_log('✅ Initializing AdCaptcha Field.'); + + if (!class_exists('GF_Fields')) { + error_log('❌ Gravity Forms not loaded. AdCaptcha registration skipped.'); + return; + } + + if (GF_Fields::get('adcaptcha')) { + error_log('⚠️ AdCaptcha field is already registered. Skipping.'); + return; + } + + try { + if (!GF_Fields::get('adcaptcha')) { + GF_Fields::register($this); + error_log('✅ AdCaptcha field registered.'); + } else { + error_log('⚠️ AdCaptcha field already registered.'); + } + } catch (Exception $e) { + error_log('❌ Error registering AdCaptcha field: ' . $e->getMessage()); + } + + $this->setup_hooks(); + } + + private function setup_hooks(): void { + add_action('wp_enqueue_scripts', [AdCaptcha::class, 'enqueue_scripts'], 9); + add_action( 'wp_enqueue_scripts', [ Verify::class, 'get_success_token' ] ); + add_filter('gform_field_groups_form_editor', [$this, 'add_to_field_groups']); + add_filter('gform_field_content', function ($content, $field) { + if ($field->type === 'adcaptcha') { + return str_replace($field->get_field_label(false, ''), '', $content); + } + return $content; + }, 10, 2); + add_filter('gform_validation', [$this, 'verify_captcha']); + } + + public function get_field_input($form, $value = '', $entry = null) { + $form_id = $form['id']; + $field_id = (int) $this->id; + error_log("ℹ️ Rendering get_field_input() for field ID: {$field_id} in form ID: {$form_id}"); + if ($this->is_form_editor()) { + return "
AdCaptcha will be rendered here.
"; + } + + $captcha_html = AdCaptcha::ob_captcha_trigger(); + $input = "
" . + $captcha_html . + "" . + "
"; + + return $input; + } + + public function get_form_editor_field_title() { + return esc_html__('adCAPTCHA', 'adcaptcha'); + } + + public function get_form_editor_field_settings() { + return [ 'description_setting', 'error_message_setting']; + } + + public function get_form_editor_field_description() { + return esc_attr__( + 'Adds an adCAPTCHA verification field to enhance security and prevent spam submissions on your forms.', + 'adcaptcha-for-forms' + ); + } + + public function get_form_editor_field_icon() { + return plugin_dir_url( __FILE__ ) . '../../../assets/adcaptcha_icon.png'; + } + + public function add_to_field_groups($field_groups): array { + foreach ($field_groups['advanced_fields']['fields'] as $field) { + if ($field['data-type'] === 'adcaptcha') { + return $field_groups; + } + } + + error_log($this->get_form_editor_field_icon()); + $field_groups['advanced_fields']['fields'][] = [ + 'data-type' => $this->type, + 'value' => $this->get_form_editor_field_title(), + 'description' => $this->get_form_editor_field_description(), + 'label' => $this->get_form_editor_field_title(), + 'icon' => $this->get_form_editor_field_icon() + ]; + + return $field_groups; + } + + public function verify_captcha($validation_result) { + error_log('✅ Verifying AdCaptcha field running.'); + $form = $validation_result['form']; + $is_valid = true; + error_log('ℹ️ Verifying AdCaptcha field.' . print_r($form['fields'], true)); + foreach ($form['fields'] as &$field) { + if ($field->type === 'adcaptcha') { + $successToken = sanitize_text_field(wp_unslash($_POST['adcaptcha_successToken'])); + error_log('ℹ️ Verifying AdCaptcha field success token.' . print_r($successToken, true)); + if (!$successToken) { + error_log("❌ AdCaptcha token is missing."); + $field->failed_validation = true; + $field->validation_message = __('Captcha token is missing.', 'adcaptcha'); + $is_valid = false; + } elseif (!$this->verify->verify_token($successToken)) { + error_log("❌ AdCaptcha verification failed."); + $field->failed_validation = true; + $field->validation_message = __('Incomplete captcha, Please try again.', 'adcaptcha'); + $is_valid = false; + } + } + } + + $validation_result['is_valid'] = $is_valid; + $validation_result['form'] = $form; + return $validation_result; + } +} \ No newline at end of file diff --git a/src/Plugin/GravityForms/Forms.php b/src/Plugin/GravityForms/Forms.php new file mode 100644 index 0000000..72671e7 --- /dev/null +++ b/src/Plugin/GravityForms/Forms.php @@ -0,0 +1,39 @@ +register_adcaptcha_field(); + }, 10, 0); + } + + + public function register_adcaptcha_field() { + // error_log( '✅ AdCaptcha field registration is running.' ); + + // if ( class_exists( 'GF_Fields' )) { + // GF_Fields::register( new Field() ); + // } else { + // error_log('❌ Gravity Forms is not loaded yet. AdCaptcha field registration skipped.'); + // } + // } + if (!GF_Fields::get('adcaptcha')) { + new Field(); + } + } +} + diff --git a/src/Settings/Plugins.php b/src/Settings/Plugins.php index ec41a74..8d777f9 100644 --- a/src/Settings/Plugins.php +++ b/src/Settings/Plugins.php @@ -53,6 +53,12 @@ public function render_plugins_settings() { 'options' => array('Forms'), 'message' => '' ), + array( + 'label' => 'GravityForms', + 'logo' => 'gravity-forms_logo.svg', + 'options' => array('Forms'), + 'message' => '' + ), ); $saved_setting = false; From f3b1b0ed9c15c4757e7f00badcac9281dd8ae95a Mon Sep 17 00:00:00 2001 From: Istvan Vas Date: Fri, 21 Feb 2025 22:11:31 +0000 Subject: [PATCH 02/13] Fixed label, icon size, error message --- src/Plugin/GravityForms/Field.php | 56 +++++++++++++++++++++---------- src/Plugin/GravityForms/Forms.php | 11 ------ 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index 5ce8a82..9fc5c5c 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -4,6 +4,7 @@ use GF_Field; use GF_Fields; +use GFAPI; use AdCaptcha\Widget\AdCaptcha; use AdCaptcha\Widget\Verify; use Exception; @@ -23,22 +24,18 @@ public function __construct($data = []) { } private function setup(): void { - error_log('✅ Initializing AdCaptcha Field.'); if (!class_exists('GF_Fields')) { - error_log('❌ Gravity Forms not loaded. AdCaptcha registration skipped.'); return; } if (GF_Fields::get('adcaptcha')) { - error_log('⚠️ AdCaptcha field is already registered. Skipping.'); return; } try { if (!GF_Fields::get('adcaptcha')) { GF_Fields::register($this); - error_log('✅ AdCaptcha field registered.'); } else { error_log('⚠️ AdCaptcha field already registered.'); } @@ -60,16 +57,18 @@ private function setup_hooks(): void { return $content; }, 10, 2); add_filter('gform_validation', [$this, 'verify_captcha']); + add_action('admin_head', [$this, 'custom_admin_field_icon_style']); + add_action('admin_init', function() { + $this->update_field_label(6, 12); + }); } public function get_field_input($form, $value = '', $entry = null) { $form_id = $form['id']; $field_id = (int) $this->id; - error_log("ℹ️ Rendering get_field_input() for field ID: {$field_id} in form ID: {$form_id}"); if ($this->is_form_editor()) { return "
AdCaptcha will be rendered here.
"; } - $captcha_html = AdCaptcha::ob_captcha_trigger(); $input = "
" . $captcha_html . @@ -79,6 +78,27 @@ public function get_field_input($form, $value = '', $entry = null) { return $input; } + public function update_field_label($form_id, $field_id) { + $form = GFAPI::get_form($form_id); + if (!$form) { + return; + } + foreach ($form['fields'] as &$field) { + if ($field->id == $field_id && $field->type === 'adcaptcha') { + $field->label = __('adCAPTCHA', 'adcaptcha'); + $field['label'] = __('adCAPTCHA', 'adcaptcha'); + $result = GFAPI::update_form($form); + if (is_wp_error($result)) { + error_log("❌ Failed to update form label: " . $result->get_error_message()); + } else { + error_log("✅ Successfully updated adCAPTCHA field label."); + } + return; + } + } + error_log("⚠️ adCAPTCHA field not found in form ID {$form_id}."); + } + public function get_form_editor_field_title() { return esc_html__('adCAPTCHA', 'adcaptcha'); } @@ -87,6 +107,14 @@ public function get_form_editor_field_settings() { return [ 'description_setting', 'error_message_setting']; } + function custom_admin_field_icon_style() { + echo ''; + } + public function get_form_editor_field_description() { return esc_attr__( 'Adds an adCAPTCHA verification field to enhance security and prevent spam submissions on your forms.', @@ -104,37 +132,29 @@ public function add_to_field_groups($field_groups): array { return $field_groups; } } - - error_log($this->get_form_editor_field_icon()); $field_groups['advanced_fields']['fields'][] = [ 'data-type' => $this->type, 'value' => $this->get_form_editor_field_title(), - 'description' => $this->get_form_editor_field_description(), 'label' => $this->get_form_editor_field_title(), - 'icon' => $this->get_form_editor_field_icon() ]; return $field_groups; } public function verify_captcha($validation_result) { - error_log('✅ Verifying AdCaptcha field running.'); $form = $validation_result['form']; $is_valid = true; - error_log('ℹ️ Verifying AdCaptcha field.' . print_r($form['fields'], true)); foreach ($form['fields'] as &$field) { if ($field->type === 'adcaptcha') { $successToken = sanitize_text_field(wp_unslash($_POST['adcaptcha_successToken'])); - error_log('ℹ️ Verifying AdCaptcha field success token.' . print_r($successToken, true)); - if (!$successToken) { - error_log("❌ AdCaptcha token is missing."); + + if (empty($successToken) || trim($successToken) === '') { $field->failed_validation = true; - $field->validation_message = __('Captcha token is missing.', 'adcaptcha'); + $field->validation_message = __('Incomplete CAPTCHA, Please try again.', 'adcaptcha'); $is_valid = false; } elseif (!$this->verify->verify_token($successToken)) { - error_log("❌ AdCaptcha verification failed."); $field->failed_validation = true; - $field->validation_message = __('Incomplete captcha, Please try again.', 'adcaptcha'); + $field->validation_message = __('Invalid token.', 'adcaptcha'); $is_valid = false; } } diff --git a/src/Plugin/GravityForms/Forms.php b/src/Plugin/GravityForms/Forms.php index 72671e7..88eaecd 100644 --- a/src/Plugin/GravityForms/Forms.php +++ b/src/Plugin/GravityForms/Forms.php @@ -13,24 +13,13 @@ public function __construct() { } public function setup() { - error_log('✅ Gravity Forms setup is running.'); - add_action('gform_loaded', function () { - error_log('✅ gform_loaded fired, registering field now.'); $this->register_adcaptcha_field(); }, 10, 0); } public function register_adcaptcha_field() { - // error_log( '✅ AdCaptcha field registration is running.' ); - - // if ( class_exists( 'GF_Fields' )) { - // GF_Fields::register( new Field() ); - // } else { - // error_log('❌ Gravity Forms is not loaded yet. AdCaptcha field registration skipped.'); - // } - // } if (!GF_Fields::get('adcaptcha')) { new Field(); } From 6f882064387d41cafb67f10cbec63f849ef28ee1 Mon Sep 17 00:00:00 2001 From: Istvan Vas Date: Mon, 24 Feb 2025 13:27:36 +0000 Subject: [PATCH 03/13] Updated error message label to adcaptcha from Untitled. Updated verify --- src/Plugin/GravityForms/Field.php | 44 +++++++++++++++---------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index 9fc5c5c..f8cf398 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -58,9 +58,7 @@ private function setup_hooks(): void { }, 10, 2); add_filter('gform_validation', [$this, 'verify_captcha']); add_action('admin_head', [$this, 'custom_admin_field_icon_style']); - add_action('admin_init', function() { - $this->update_field_label(6, 12); - }); + add_action('admin_init', [$this, 'update_adcaptcha_label']); } public function get_field_input($form, $value = '', $entry = null) { @@ -78,25 +76,26 @@ public function get_field_input($form, $value = '', $entry = null) { return $input; } - public function update_field_label($form_id, $field_id) { - $form = GFAPI::get_form($form_id); - if (!$form) { + public function update_adcaptcha_label() { + $forms = GFAPI::get_forms(); + if (!$forms || !is_array($forms)) { return; } - foreach ($form['fields'] as &$field) { - if ($field->id == $field_id && $field->type === 'adcaptcha') { - $field->label = __('adCAPTCHA', 'adcaptcha'); - $field['label'] = __('adCAPTCHA', 'adcaptcha'); - $result = GFAPI::update_form($form); - if (is_wp_error($result)) { - error_log("❌ Failed to update form label: " . $result->get_error_message()); - } else { - error_log("✅ Successfully updated adCAPTCHA field label."); + foreach ($forms as $form) { + foreach ($form['fields'] as &$field) { + if ($field->type === 'adcaptcha') { + $field->label = __('adCAPTCHA', 'adcaptcha'); + $field['label'] = __('adCAPTCHA', 'adcaptcha'); + $result = GFAPI::update_form($form); + if (is_wp_error($result)) { + error_log("❌ Failed to update adCAPTCHA label in Form ID {$form['id']}: " . $result->get_error_message()); + } else { + error_log("✅ Successfully updated adCAPTCHA label in Form ID {$form['id']}."); + } + return; } - return; } } - error_log("⚠️ adCAPTCHA field not found in form ID {$form_id}."); } public function get_form_editor_field_title() { @@ -104,7 +103,7 @@ public function get_form_editor_field_title() { } public function get_form_editor_field_settings() { - return [ 'description_setting', 'error_message_setting']; + return [ 'description_setting', 'error_message_setting', 'label setting']; } function custom_admin_field_icon_style() { @@ -143,11 +142,11 @@ public function add_to_field_groups($field_groups): array { public function verify_captcha($validation_result) { $form = $validation_result['form']; - $is_valid = true; + $is_valid = $validation_result['is_valid']; foreach ($form['fields'] as &$field) { if ($field->type === 'adcaptcha') { - $successToken = sanitize_text_field(wp_unslash($_POST['adcaptcha_successToken'])); - + $successToken = sanitize_text_field(wp_unslash($_POST['adcaptcha_successToken'] ?? '')); + if (empty($successToken) || trim($successToken) === '') { $field->failed_validation = true; $field->validation_message = __('Incomplete CAPTCHA, Please try again.', 'adcaptcha'); @@ -159,8 +158,7 @@ public function verify_captcha($validation_result) { } } } - - $validation_result['is_valid'] = $is_valid; + $validation_result['is_valid'] = $is_valid; $validation_result['form'] = $form; return $validation_result; } From f818a23b5c16e2cf9100b8b3119638704682a1e9 Mon Sep 17 00:00:00 2001 From: Istvan Vas Date: Mon, 24 Feb 2025 14:18:52 +0000 Subject: [PATCH 04/13] Remove label settings. --- src/Plugin/GravityForms/Field.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index f8cf398..96d21ea 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -103,7 +103,7 @@ public function get_form_editor_field_title() { } public function get_form_editor_field_settings() { - return [ 'description_setting', 'error_message_setting', 'label setting']; + return [ 'description_setting', 'error_message_setting']; } function custom_admin_field_icon_style() { From a8103a47ea66ef637ee4fbf0cbb67a2251cdd2e8 Mon Sep 17 00:00:00 2001 From: Istvan Vas Date: Tue, 25 Feb 2025 10:42:25 +0000 Subject: [PATCH 05/13] Stop duplicated adcaptcha on the form field is done. --- src/Plugin/GravityForms/Field.php | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index 96d21ea..c6c11a5 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -59,6 +59,7 @@ private function setup_hooks(): void { add_filter('gform_validation', [$this, 'verify_captcha']); add_action('admin_head', [$this, 'custom_admin_field_icon_style']); add_action('admin_init', [$this, 'update_adcaptcha_label']); + add_action('admin_footer', [$this, 'enqueue_admin_script']); } public function get_field_input($form, $value = '', $entry = null) { @@ -140,6 +141,28 @@ public function add_to_field_groups($field_groups): array { return $field_groups; } + public function enqueue_admin_script() { + ?> + + Date: Tue, 25 Feb 2025 12:10:10 +0000 Subject: [PATCH 06/13] Updated and removed duplicated hidden field to store success token --- src/Plugin/GravityForms/Field.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index c6c11a5..415d452 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -70,9 +70,16 @@ public function get_field_input($form, $value = '', $entry = null) { } $captcha_html = AdCaptcha::ob_captcha_trigger(); $input = "
" . - $captcha_html . - "" . - "
"; + $captcha_html . + "
"; + $input .= ""; return $input; } @@ -104,7 +111,7 @@ public function get_form_editor_field_title() { } public function get_form_editor_field_settings() { - return [ 'description_setting', 'error_message_setting']; + return [ 'description_setting', 'error_message_setting', 'label_placement_setting', 'css_class_setting',]; } function custom_admin_field_icon_style() { From 7b22242e120bfcd57a418f576fae97577fbd6d3c Mon Sep 17 00:00:00 2001 From: Istvan Vas Date: Wed, 26 Feb 2025 11:02:14 +0000 Subject: [PATCH 07/13] Gravity form integration done with fixed bugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixing Gravity Forms re-render issue where the adCAPTCHA widget was being reloaded. The preview page was initially blank, so a div was inserted to indicate “adCAPTCHA will be rendered here”, ensuring visibility during form previews. Check, if there is any security issue regarding how I worked around to keep the adCAPTCHA state success. --- src/Plugin/GravityForms/Field.php | 53 ++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index 415d452..0d7c0d6 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -60,13 +60,46 @@ private function setup_hooks(): void { add_action('admin_head', [$this, 'custom_admin_field_icon_style']); add_action('admin_init', [$this, 'update_adcaptcha_label']); add_action('admin_footer', [$this, 'enqueue_admin_script']); + add_filter('gform_pre_render', function($form) { + if (!empty($_POST['adcaptcha_successToken'])) { + echo ""; + } + return $form; + }); + add_action('gform_preview_body_open', [$this, 'enqueue_preview_scripts']); + } + + public function enqueue_preview_scripts($form_id) { + echo ""; } public function get_field_input($form, $value = '', $entry = null) { $form_id = $form['id']; $field_id = (int) $this->id; if ($this->is_form_editor()) { - return "
AdCaptcha will be rendered here.
"; + return "
adCAPTCHA will be rendered here.
"; } $captcha_html = AdCaptcha::ob_captcha_trigger(); $input = "
" . @@ -175,18 +208,22 @@ public function verify_captcha($validation_result) { $is_valid = $validation_result['is_valid']; foreach ($form['fields'] as &$field) { if ($field->type === 'adcaptcha') { + error_log(print_r($field, true)); $successToken = sanitize_text_field(wp_unslash($_POST['adcaptcha_successToken'] ?? '')); - if (empty($successToken) || trim($successToken) === '') { $field->failed_validation = true; $field->validation_message = __('Incomplete CAPTCHA, Please try again.', 'adcaptcha'); $is_valid = false; - } elseif (!$this->verify->verify_token($successToken)) { - $field->failed_validation = true; - $field->validation_message = __('Invalid token.', 'adcaptcha'); - $is_valid = false; - } - } + } + if($is_valid) { + $response = $this->verify->verify_token($successToken); + if (!$response) { + $field->failed_validation = true; + $field->validation_message = __('Invalid token.', 'adcaptcha'); + $is_valid = false; + } + } + } } $validation_result['is_valid'] = $is_valid; $validation_result['form'] = $form; From 7d2e03c386de4b1abe0918603cce849ec2f47f64 Mon Sep 17 00:00:00 2001 From: Istvan Vas Date: Wed, 26 Feb 2025 11:08:07 +0000 Subject: [PATCH 08/13] removed error_log --- src/Plugin/GravityForms/Field.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index 0d7c0d6..48b4ddc 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -208,7 +208,6 @@ public function verify_captcha($validation_result) { $is_valid = $validation_result['is_valid']; foreach ($form['fields'] as &$field) { if ($field->type === 'adcaptcha') { - error_log(print_r($field, true)); $successToken = sanitize_text_field(wp_unslash($_POST['adcaptcha_successToken'] ?? '')); if (empty($successToken) || trim($successToken) === '') { $field->failed_validation = true; From 76db999eef2f45afd2e34fbfb818a1549af01ef5 Mon Sep 17 00:00:00 2001 From: Istvan Vas Date: Tue, 4 Mar 2025 11:39:52 +0000 Subject: [PATCH 09/13] Fixed comment from PR. For readability, place functions in order. --- src/Plugin/GravityForms/Field.php | 252 ++++++++++++++++-------------- 1 file changed, 131 insertions(+), 121 deletions(-) diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index 48b4ddc..09acbf8 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -36,11 +36,9 @@ private function setup(): void { try { if (!GF_Fields::get('adcaptcha')) { GF_Fields::register($this); - } else { - error_log('⚠️ AdCaptcha field already registered.'); - } + } } catch (Exception $e) { - error_log('❌ Error registering AdCaptcha field: ' . $e->getMessage()); + throw $e; } $this->setup_hooks(); @@ -50,37 +48,142 @@ private function setup_hooks(): void { add_action('wp_enqueue_scripts', [AdCaptcha::class, 'enqueue_scripts'], 9); add_action( 'wp_enqueue_scripts', [ Verify::class, 'get_success_token' ] ); add_filter('gform_field_groups_form_editor', [$this, 'add_to_field_groups']); - add_filter('gform_field_content', function ($content, $field) { - if ($field->type === 'adcaptcha') { - return str_replace($field->get_field_label(false, ''), '', $content); - } - return $content; - }, 10, 2); + add_filter('gform_field_content', [$this, 'modify_gform_field_content'], 10, 2); add_filter('gform_validation', [$this, 'verify_captcha']); add_action('admin_head', [$this, 'custom_admin_field_icon_style']); add_action('admin_init', [$this, 'update_adcaptcha_label']); add_action('admin_footer', [$this, 'enqueue_admin_script']); - add_filter('gform_pre_render', function($form) { - if (!empty($_POST['adcaptcha_successToken'])) { - echo ""; - } - return $form; - }); + add_filter('gform_pre_render', [$this, 'handle_adcaptcha_token']); add_action('gform_preview_body_open', [$this, 'enqueue_preview_scripts']); } + public function add_to_field_groups($field_groups): array { + foreach ($field_groups['advanced_fields']['fields'] as $field) { + if ($field['data-type'] === 'adcaptcha') { + return $field_groups; + } + } + $field_groups['advanced_fields']['fields'][] = [ + 'data-type' => $this->type, + 'value' => $this->get_form_editor_field_title(), + 'label' => $this->get_form_editor_field_title(), + ]; + + return $field_groups; + } + + public function modify_gform_field_content($content, $field) { + if ($field->type === 'adcaptcha') { + return str_replace($field->get_field_label(false, ''), '', $content); + } + return $content; + } + + public function verify_captcha($validation_result) { + $form = $validation_result['form']; + $is_valid = $validation_result['is_valid']; + foreach ($form['fields'] as &$field) { + if ($field->type === 'adcaptcha') { + $successToken = sanitize_text_field(wp_unslash($_POST['adcaptcha_successToken'] ?? '')); + if (empty($successToken) || trim($successToken) === '') { + $field->failed_validation = true; + $field->validation_message = __('Incomplete CAPTCHA, Please try again.', 'adcaptcha'); + $is_valid = false; + } + if($is_valid) { + $response = $this->verify->verify_token($successToken); + if (!$response) { + $field->failed_validation = true; + $field->validation_message = __('Invalid token.', 'adcaptcha'); + $is_valid = false; + } + } + } + } + $validation_result['is_valid'] = $is_valid; + $validation_result['form'] = $form; + return $validation_result; + } + + public function custom_admin_field_icon_style() { + echo ''; + } + + public function update_adcaptcha_label() { + $forms = GFAPI::get_forms(); + if (!$forms || !is_array($forms)) { + return; + } + $errors = []; + foreach ($forms as $form) { + $updated = false; + foreach ($form['fields'] as &$field) { + if ($field->type === 'adcaptcha' && $field->label !== __('adCAPTCHA', 'adcaptcha')) { + $field->label = __('adCAPTCHA', 'adcaptcha'); + $field['label'] = __('adCAPTCHA', 'adcaptcha'); + $updated = true; + } + } + if ($updated) { + $result = GFAPI::update_form($form); + + if (is_wp_error($result)) { + $errors[] = "Failed to update adCAPTCHA label in Form ID {$form['id']}: " . $result->get_error_message(); + } + } + } + if (!empty($errors)) { + throw new Exception(implode("\n", $errors)); + } + } + + public function enqueue_admin_script() { + ?> + + + document.addEventListener('DOMContentLoaded', function() { + let adCaptchaField = document.querySelector('.adcaptcha_successToken'); + if (adCaptchaField) { + setTimeout(function() { + if (window.adcap) { + window.adcap.setVerificationState('success'); + adCaptchaField.value = '{$successToken}'; + } + }, 500); + } + }); + "; + } + return $form; + } + public function enqueue_preview_scripts($form_id) { echo " - type === 'adcaptcha') { - $successToken = sanitize_text_field(wp_unslash($_POST['adcaptcha_successToken'] ?? '')); - if (empty($successToken) || trim($successToken) === '') { - $field->failed_validation = true; - $field->validation_message = __('Incomplete CAPTCHA, Please try again.', 'adcaptcha'); - $is_valid = false; - } - if($is_valid) { - $response = $this->verify->verify_token($successToken); - if (!$response) { - $field->failed_validation = true; - $field->validation_message = __('Invalid token.', 'adcaptcha'); - $is_valid = false; - } - } - } - } - $validation_result['is_valid'] = $is_valid; - $validation_result['form'] = $form; - return $validation_result; - } } From dc9a89e931a86084c930d2b051b77ed8b2c7ceaa Mon Sep 17 00:00:00 2001 From: Istvan Vas Date: Thu, 6 Mar 2025 22:51:03 +0000 Subject: [PATCH 10/13] Gravity form test --- src/Plugin/GravityForms/Field.php | 13 +- src/Plugin/GravityForms/Forms.php | 1 - .../Plugin/GravityForms/GravityFormsTest.php | 475 ++++++++++++++++++ tests/bootstrap.php | 1 + 4 files changed, 485 insertions(+), 5 deletions(-) create mode 100644 tests/Plugin/GravityForms/GravityFormsTest.php diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index 09acbf8..348ac69 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -9,16 +9,18 @@ use AdCaptcha\Widget\Verify; use Exception; -if (!class_exists('GF_Field')) { +// update the condition for testing environment +if (!class_exists('GF_Field') && !defined('PHPUNIT_RUNNING')) { return; } class Field extends GF_Field { - public $type = 'adcaptcha'; + public $type; private $verify; public function __construct($data = []) { parent::__construct($data); + $this->type = 'adcaptcha'; $this->verify = new Verify(); $this->setup(); } @@ -64,7 +66,7 @@ public function add_to_field_groups($field_groups): array { } } $field_groups['advanced_fields']['fields'][] = [ - 'data-type' => $this->type, + 'data-type' => (string) $this->type, 'value' => $this->get_form_editor_field_title(), 'label' => $this->get_form_editor_field_title(), ]; @@ -199,7 +201,10 @@ public function enqueue_preview_scripts($form_id) { } public function get_field_input($form, $value = '', $entry = null) { - $form_id = $form['id']; + $form_id = $form['id'] ?? null; + if ($form_id === null) { + return ''; + } $field_id = (int) $this->id; if ($this->is_form_editor()) { return "
adCAPTCHA will be rendered here.
"; diff --git a/src/Plugin/GravityForms/Forms.php b/src/Plugin/GravityForms/Forms.php index 88eaecd..dc1ad95 100644 --- a/src/Plugin/GravityForms/Forms.php +++ b/src/Plugin/GravityForms/Forms.php @@ -25,4 +25,3 @@ public function register_adcaptcha_field() { } } } - diff --git a/tests/Plugin/GravityForms/GravityFormsTest.php b/tests/Plugin/GravityForms/GravityFormsTest.php new file mode 100644 index 0000000..cfc8561 --- /dev/null +++ b/tests/Plugin/GravityForms/GravityFormsTest.php @@ -0,0 +1,475 @@ +type = $type; + $this->id = 123; + $this->isFormEditor = $isFormEditor; + } + + public function get_field_label($input1 = false, $input2 = '') { + return 'AdCaptcha Label'; + } + + public function is_form_editor() { + return $this->isFormEditor; + } +} + +class MockGFAPI { + public static function get_forms() { + return []; + } +} + +class MockGFAPIWithFields { + public static function get_forms() { + return [ + [ // ✅ Use an array instead of an object + 'id' => 1, + 'title' => 'Test Form', + 'fields' => [ + (object) ['id' => 1, 'type' => 'text', 'label' => 'Text Field'], + (object) ['id' => 2, 'type' => 'adcaptcha', 'label' => 'Incorrect Label'], + ] + ], + [ // ✅ Use an array instead of an object + 'id' => 2, + 'title' => 'Another Form', + 'fields' => [ + (object) ['id' => 3, 'type' => 'email', 'label' => 'Email Field'], + (object) ['id' => 4, 'type' => 'adcaptcha', 'label' => 'adCAPTCHA'], + ] + ] + ]; + } + + public static function update_form($form) { + return true; + } +} + + use PHPUnit\Framework\TestCase; + use AdCaptcha\Plugin\GravityForms\Forms; + use AdCaptcha\Plugin\GravityForms\Field; + use AdCaptcha\Widget\AdCaptcha; + use AdCaptcha\Widget\Verify; + use Brain\Monkey; + use Brain\Monkey\Functions; + use Mockery; + use ReflectionClass; + + class GravityFormsTest extends TestCase { + private $forms; + private $verifyMock; + private $field; + + public function setUp(): void { + parent::setUp(); + Monkey\setUp(); + + global $mocked_actions, $mocked_filters; + $mocked_actions = []; + $mocked_filters = []; + + if (!class_exists('GF_Fields', false)) { + class_alias(MockGF_Fields::class, 'GF_Fields'); + } + if(!class_exists('GF_Field', false)) { + class_alias(MockGF_Field::class, 'GF_Field'); + } + + Functions\when('esc_html__')->alias(function ($text, $domain) { + return "[{$domain}] {$text}"; + }); + Functions\when('esc_attr__')->alias(function ($text, $domain) { + return "[{$domain}] {$text}"; + }); + Functions\when('esc_js')->alias(function ($text) { + return $text; + }); + Functions\when('esc_attr')->alias(function ($text) { + return $text; + }); + Functions\when('get_option')->alias(function ($option_name) { + $mock_values = [ + 'adcaptcha_placement_id' => 'mocked-placement-id', + ]; + return $mock_values[$option_name] ?? null; + }); + Functions\when('sanitize_text_field')->alias(function($input) { + $sanitized = strip_tags($input); + $sanitized = preg_replace('/[\r\n\t]/', ' ', $sanitized); + $sanitized = trim($sanitized); + return $sanitized; + }); + Functions\when('__')->alias(function ($text, $domain = null) { + return $text; + }); + Functions\when('plugin_dir_url')->alias(function ($path) { + return ''; + }); + + $this->forms = new Forms(); + $this->field = new Field(); + + $this->verifyMock = $this->createMock(Verify::class); + $reflection = new \ReflectionClass($this->field); + $property = $reflection->getProperty('verify'); + $property->setAccessible(true); + $property->setValue($this->field, $this->verifyMock); + } + + public function tearDown(): void { + global $mocked_filters; + $mocked_filters = []; + Mockery::close(); + Monkey\tearDown(); + parent::tearDown(); + } + + public function testSetup() { + $this->assertTrue(method_exists($this->forms, 'setup'), 'Method setup does not exist'); + global $mocked_actions; + $this->forms->setup(); + $registeredAction = array_filter($mocked_actions, function ($action) { + return $action['hook'] === 'gform_loaded'; + }); + $this->assertNotEmpty($registeredAction, 'The gform_loaded action was not registered.'); + $registeredAction = array_values($registeredAction)[0]; + $this->assertEquals(10, $registeredAction['priority'], 'Expected priority 10 for gform_loaded.'); + $this->assertEquals(0, $registeredAction['accepted_args'], 'Expected 0 accepted args for gform_loaded.'); + $this->assertInstanceOf(\Closure::class, $registeredAction['callback'], 'Expected a Closure as the callback.'); + } + + public function testRegisterAdcaptchaField() { + $this->assertTrue(method_exists($this->forms, 'register_adcaptcha_field'), 'Method register_adcaptcha_field does not exist'); + $result = $this->forms->register_adcaptcha_field(); + $this->assertNull($result, 'Expected null return value from register_adcaptcha_field'); + } + + public function testSetupHooks() { + $this->assertTrue(method_exists($this->field, 'setup_hooks'), 'Method setup_hooks does not exist'); + + global $mocked_actions, $mocked_filters; + $this->assertContains( + ['hook' => 'wp_enqueue_scripts', 'callback' => [AdCaptcha::class, 'enqueue_scripts'], 'priority' => 9, 'accepted_args' => 1], + $mocked_actions + ); + $this->assertContains( + ['hook' => 'wp_enqueue_scripts', 'callback' => [Verify::class, 'get_success_token'], 'priority' => 10, 'accepted_args' => 1], + $mocked_actions + ); + $this->assertContains( + ['hook' => 'admin_head', 'callback' => [$this->field, 'custom_admin_field_icon_style'], 'priority' => 10, 'accepted_args' => 1], + $mocked_actions + ); + $this->assertContains( + ['hook' => 'admin_init', 'callback' => [$this->field, 'update_adcaptcha_label'], 'priority' => 10, 'accepted_args' => 1], + $mocked_actions + ); + $this->assertContains( + ['hook' => 'admin_footer', 'callback' => [$this->field, 'enqueue_admin_script'], 'priority' => 10, 'accepted_args' => 1], + $mocked_actions + ); + $this->assertContains( + ['hook' => 'gform_preview_body_open', 'callback' => [$this->field, 'enqueue_preview_scripts'], 'priority' => 10, 'accepted_args' => 1], + $mocked_actions + ); + $this->assertContains( + ['hook' => 'gform_field_groups_form_editor', 'callback' => [$this->field, 'add_to_field_groups'], 'priority' => 10, 'accepted_args' => 1], + $mocked_filters + ); + $this->assertContains( + ['hook' => 'gform_field_content', 'callback' => [$this->field, 'modify_gform_field_content'], 'priority' => 10, 'accepted_args' => 2], + $mocked_filters + ); + $this->assertContains( + ['hook' => 'gform_validation', 'callback' => [$this->field, 'verify_captcha'], 'priority' => 10, 'accepted_args' => 1], + $mocked_filters + ); + $this->assertContains( + ['hook' => 'gform_pre_render', 'callback' => [$this->field, 'handle_adcaptcha_token'], 'priority' => 10, 'accepted_args' => 1], + $mocked_filters + ); + } + + public function testAddToFieldGroups() { + $this->assertTrue(method_exists($this->field, 'add_to_field_groups'), 'Method add_to_field_groups does not exist'); + $field_groups = [ + 'advanced_fields' => [ + 'fields' => [ + ['data-type' => 'text'], + ['data-type' => 'email'], + ] + ] + ]; + $field_groups_adcaptcha = [ + 'advanced_fields' => [ + 'fields' => [ + ['data-type' => 'adcaptcha'], + ] + ] + ]; + $result = $this->field->add_to_field_groups($field_groups); + $this->assertContains( + ['data-type' => 'adcaptcha', 'value' => $this->field->get_form_editor_field_title(), 'label' => $this->field->get_form_editor_field_title()], + $result['advanced_fields']['fields'] + ); + $fieldWithAdcaptcha = $this->field->add_to_field_groups($field_groups_adcaptcha); + $this->assertEquals($field_groups_adcaptcha, $fieldWithAdcaptcha, 'Expected the field groups to remain unchanged if adcaptcha field is already present'); + } + + public function testModifyGformFieldContent() { + $this->assertTrue(method_exists($this->field, 'modify_gform_field_content'), 'Method modify_gform_field_content does not exist'); + $field = new MockGF_Field('adcaptcha'); + + $content = ''; + $expectedModifiedContent = ''; + + $modifiedContent = $this->field->modify_gform_field_content($content, $field); + $this->assertEquals($expectedModifiedContent, $modifiedContent, 'Expected label to be removed for adcaptcha fields'); + } + + public function testVerifyCaptchaFailsWhenTokenIsEmpty() { + Functions\when('wp_unslash')->justReturn(''); + $validation_result = [ + 'form' => ['fields' => [(object) ['type' => 'adcaptcha']]], + 'is_valid' => true + ]; + $result = $this->field->verify_captcha($validation_result); + $this->assertFalse($result['is_valid']); + $this->assertTrue($result['form']['fields'][0]->failed_validation); + $this->assertEquals('Incomplete CAPTCHA, Please try again.', $result['form']['fields'][0]->validation_message); + } + + public function testVerifyCaptchaFailsWhenTokenVerificationFails() { + Functions\when('wp_unslash')->justReturn('invalid_token'); + $this->verifyMock->method('verify_token')->willReturn(false); + $validation_result = [ + 'form' => ['fields' => [(object) ['type' => 'adcaptcha']]], + 'is_valid' => true + ]; + $result = $this->field->verify_captcha($validation_result); + $this->assertFalse($result['is_valid']); + $this->assertTrue($result['form']['fields'][0]->failed_validation); + $this->assertEquals('Invalid token.', $result['form']['fields'][0]->validation_message); + } + + public function testVerifyCaptchaSucceedsWhenTokenIsValid() { + Functions\when('wp_unslash')->justReturn('valid_token'); + $this->verifyMock->method('verify_token')->willReturn(true); + $validation_result = [ + 'form' => [ + 'fields' => [ + (object) [ + 'type' => 'adcaptcha', + 'failed_validation' => false, + 'validation_message' => '' + ] + ] + ], + 'is_valid' => true + ]; + $result = $this->field->verify_captcha($validation_result); + $this->assertTrue($result['is_valid']); + $this->assertFalse($result['form']['fields'][0]->failed_validation); + $this->assertEmpty($result['form']['fields'][0]->validation_message); + } + + public function testCustomAdminFieldIconStyle() { + $this->assertTrue(method_exists($this->field, 'custom_admin_field_icon_style'), 'Method custom_admin_field_icon_style does not exist'); + ob_start(); + $this->field->custom_admin_field_icon_style(); + $capturedOutput = ob_get_clean(); + $this->assertStringContainsString("#sidebar_field_info #sidebar_field_icon img { + width: 16px !important; + }", $capturedOutput, 'Expected the style to be output'); + } + + // public function testUpdateAdcaptchaLabelFormEmpty() { + // if(!class_exists('GFAPI', false)) { + // class_alias(MockGFAPI::class, 'GFAPI'); + // } + // $this->assertTrue(method_exists($this->field, 'update_adcaptcha_label'), 'Method update_adcaptcha_label does not exist'); + // $result = $this->field->update_adcaptcha_label(); + // $this->assertNull($result, 'Expected null return value from update_adcaptcha_label'); + // } + + public function testUpdateAdcaptchaLabelFormWithFields() { + if(!class_exists('GFAPI', false)) { + class_alias(MockGFAPIWithFields::class, 'GFAPI'); + } + $result = $this->field->update_adcaptcha_label(); + // var_dump($result); + // $forms = [ + // (object) [ + // 'fields' => [ + // (object) ['type' => 'text'], + // (object) ['type' => 'adcaptcha', 'label' => 'AdCaptcha Label'], + // ] + // ] + // ]; + // Functions\when('GFAPI::get_forms')->justReturn($forms); + // $this->assertTrue(method_exists($this->field, 'update_adcaptcha_label'), 'Method update_adcaptcha_label does not exist'); + // $result = $this->field->update_adcaptcha_label(); + // $this->assertNull($result, 'Expected null return value from update_adcaptcha_label'); + } + + public function testEnqueueAdminScript() { + $this->assertTrue(method_exists($this->field, 'enqueue_admin_script'), 'Method enqueue_admin_script does not exist'); + ob_start(); + $this->field->enqueue_admin_script(); + $capturedOutput = ob_get_clean(); + $this->assertStringContainsString("if (typeof window.CanFieldBeAdded !== 'function') { + return; + }", $capturedOutput, 'Expected the script to be output'); + $this->assertStringContainsString("let originalFunction = window.CanFieldBeAdded;", $capturedOutput, 'Expected the script to be output'); + $this->assertStringContainsString('window.CanFieldBeAdded = function(type) { + if (type === "adcaptcha") { + if (GetFieldsByType(["adcaptcha"]).length > 0) { + gform.instances.dialogAlert("Field Error", "Only one adCAPTCHA field can be added."); + return false; + } + } + return originalFunction(type); + };', $capturedOutput, 'Expected the script to be output'); + } + + public function testHandleAdcaptchaToken() { + $this->assertTrue(method_exists($this->field, 'handle_adcaptcha_token'), 'Method handle_adcaptcha_token does not exist'); + + $_POST = []; + $form = ['id' => 1]; + ob_start(); + $result = $this->field->handle_adcaptcha_token($form); + $capturedOutput = ob_get_clean(); + $this->assertEquals($form, $result, 'Expected the form to be returned unchanged'); + $this->assertEmpty($capturedOutput, 'Expected no script output when success token is missing'); + + $_POST['adcaptcha_successToken'] = 'mocked-success-token'; + ob_start(); + $this->field->handle_adcaptcha_token($form); + $capturedOutput = ob_get_clean(); + $this->assertStringContainsString("document.addEventListener('DOMContentLoaded', function()", $capturedOutput, 'Expected the script to be output'); + $this->assertStringContainsString("let adCaptchaField = document.querySelector('.adcaptcha_successToken');", $capturedOutput, 'Expected the script to be output'); + $this->assertStringContainsString("if (adCaptchaField) { + setTimeout(function() { + if (window.adcap) { + window.adcap.setVerificationState('success'); + adCaptchaField.value = 'mocked-success-token'; + } + }, 500); + }", $capturedOutput, 'Expected the script to be output'); + } + + public function testEnqueuePreviewScripts() { + $this->assertTrue(method_exists($this->field, 'enqueue_preview_scripts'), 'Method enqueue_preview_scripts does not exist'); + $formID = 1; + ob_start(); + $this->field->enqueue_preview_scripts($formID); + $capturedOutput = ob_get_clean(); + $this->assertStringContainsString("document.addEventListener('DOMContentLoaded', function()", $capturedOutput, 'The enqueue_preview_scripts method was not called correctly.'); + $this->assertStringContainsString("let captchaContainer = document.querySelector('.ginput_container_adcaptcha');", $capturedOutput, 'The enqueue_preview_scripts method was not called correctly.'); + $this->assertStringContainsString("if (captchaContainer) { + let messageDiv = document.createElement('div'); + messageDiv.className = 'ginput_container adcaptcha-message'; + messageDiv.innerText = 'adCAPTCHA will be rendered here.'; + captchaContainer.prepend(messageDiv); + }", $capturedOutput, 'The enqueue_preview_scripts method was not called correctly.'); + } + + public function testGetFieldInput() { + $this->assertTrue(method_exists($this->field, 'get_field_input'), 'Method get_field_input does not exist'); + $form = ['id' => null]; + $result = $this->field->get_field_input($form, '', null); + $this->assertEmpty($result, 'Expected an empty string when form ID is missing'); + $form = ['id' => 1]; + $result = $this->field->get_field_input($form, '', null); + $this->assertEquals("
adCAPTCHA will be rendered here.
", $result, 'Expected the adCAPTCHA message to be rendered'); + + $form_id = 1; + $field_id = 123; + $this->field->isFormEditor = false; + $result = $this->field->get_field_input($form, '', null); + $this->assertStringContainsString("document.addEventListener('DOMContentLoaded', function() { + var hiddenToken = document.querySelector('.adcaptcha_successToken'); + if (hiddenToken) { + hiddenToken.id = 'input_{$form_id}_{$field_id}'; + } + });", $result, 'Expected CAPTCHA HTML to be rendered when is_form_editor is false'); + } + + public function testGetFormEditorFieldTitle() { + $this->assertTrue( + method_exists($this->field, 'get_form_editor_field_title'), + 'Method get_form_editor_field_title does not exist' + ); + $expectedText = 'adCAPTCHA'; + $expectedDomain = 'adcaptcha'; + $result = $this->field->get_form_editor_field_title(); + $this->assertEquals( + "[{$expectedDomain}] {$expectedText}", + $result, + 'Expected the title to match the expected text with correct text domain' + ); + } + + public function testGetFormEditorFieldSettings() { + $this->assertTrue(method_exists($this->field, 'get_form_editor_field_settings'), 'Method get_form_editor_field_settings does not exist'); + $data = [ 'description_setting', 'error_message_setting', 'label_placement_setting', 'css_class_setting',]; + $result = $this->field->get_form_editor_field_settings(); + $this->assertIsArray($result, 'Expected an array to be returned'); + $this->assertEquals($data, $result, 'Expected the array keys to match the expected data'); + } + + public function testGetFormEditorFieldDescription() { + $this->assertTrue( + method_exists($this->field, 'get_form_editor_field_description'), + 'Method get_form_editor_field_description does not exist' + ); + $expectedText = 'Adds an adCAPTCHA verification field to enhance security and prevent spam submissions on your forms.'; + $expectedDomain = 'adcaptcha-for-forms'; + $result = $this->field->get_form_editor_field_description(); + $this->assertEquals( + "[{$expectedDomain}] {$expectedText}", + $result, + 'Expected the description to match the expected text with correct text domain' + ); + } + + public function testGetFromEditorFieldIcon() { + $this->assertTrue(method_exists($this->field, 'get_form_editor_field_icon'), 'Method get_form_editor_field_icon does not exist'); + $icon_url = $this->field->get_form_editor_field_icon(); + $this->assertStringContainsString( + '../../../assets/adcaptcha_icon.png', + $icon_url, + 'Expected the icon URL to be correctly formed' + ); + } + } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 8935796..3bb7f7e 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,4 +1,5 @@ Date: Fri, 7 Mar 2025 15:58:49 +0000 Subject: [PATCH 11/13] Test is done. Modify the WPErrorMock.php and the Gravity form update_adcaptcha_label error handeling. Removed the throw Exception(implode("\n", $errors)); As this will stop the test and the code. --- src/Plugin/GravityForms/Field.php | 17 +- .../Plugin/GravityForms/GravityFormsTest.php | 166 +++++++++++------- tests/mocks/WPErrorMock.php | 6 +- tests/test_helpers.php | 2 +- 4 files changed, 119 insertions(+), 72 deletions(-) diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index 348ac69..99797e6 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -126,20 +126,21 @@ public function update_adcaptcha_label() { foreach ($form['fields'] as &$field) { if ($field->type === 'adcaptcha' && $field->label !== __('adCAPTCHA', 'adcaptcha')) { $field->label = __('adCAPTCHA', 'adcaptcha'); - $field['label'] = __('adCAPTCHA', 'adcaptcha'); + // $field['label'] = __('adCAPTCHA', 'adcaptcha'); $updated = true; } } - if ($updated) { - $result = GFAPI::update_form($form); - - if (is_wp_error($result)) { - $errors[] = "Failed to update adCAPTCHA label in Form ID {$form['id']}: " . $result->get_error_message(); - } + if (!$updated) { + continue; } + $result = GFAPI::update_form($form); + if (function_exists('is_wp_error') && is_wp_error($result)) { + $errorMessage = "Failed to update adCAPTCHA label in Form ID {$form['id']}: " . $result->get_error_message(); + $errors[] = $errorMessage; + } } if (!empty($errors)) { - throw new Exception(implode("\n", $errors)); + return $errors; } } diff --git a/tests/Plugin/GravityForms/GravityFormsTest.php b/tests/Plugin/GravityForms/GravityFormsTest.php index cfc8561..b3fb9d4 100644 --- a/tests/Plugin/GravityForms/GravityFormsTest.php +++ b/tests/Plugin/GravityForms/GravityFormsTest.php @@ -4,8 +4,7 @@ * * @package AdCaptcha */ - - namespace AdCaptcha\Tests\Plugin\GravityForms; +namespace AdCaptcha\Tests\Plugin\GravityForms; class MockGF_Fields { public static bool $wasCalled = false; @@ -41,38 +40,40 @@ public function is_form_editor() { } } -class MockGFAPI { - public static function get_forms() { - return []; - } -} - -class MockGFAPIWithFields { - public static function get_forms() { - return [ - [ // ✅ Use an array instead of an object - 'id' => 1, - 'title' => 'Test Form', - 'fields' => [ - (object) ['id' => 1, 'type' => 'text', 'label' => 'Text Field'], - (object) ['id' => 2, 'type' => 'adcaptcha', 'label' => 'Incorrect Label'], - ] - ], - [ // ✅ Use an array instead of an object - 'id' => 2, - 'title' => 'Another Form', - 'fields' => [ - (object) ['id' => 3, 'type' => 'email', 'label' => 'Email Field'], - (object) ['id' => 4, 'type' => 'adcaptcha', 'label' => 'adCAPTCHA'], - ] - ] - ]; - } - - public static function update_form($form) { - return true; - } -} +// class MockGFAPIWithFields { +// public static function get_forms() { +// return [ +// [ +// 'id' => 6, +// 'title' => 'TestGravity5.0', +// 'fields' => [ +// (object) [ +// 'id' => 1, +// 'type' => 'name', +// 'label' => 'Name', +// ], +// (object) [ +// 'id' => 18, +// 'type' => 'checkbox', +// 'label' => 'Untitled', +// ], +// (object) [ +// 'id' => 45, +// 'type' => 'adcaptcha', +// 'label' => 'dummyLabel', +// ], +// ] +// ] +// ]; +// } + +// public static function update_form($form) { +// if ($form[0]['id'] === 6) { +// return new WP_Error('update_failed', 'Simulated update failure'); +// } +// return true; +// } +// } use PHPUnit\Framework\TestCase; use AdCaptcha\Plugin\GravityForms\Forms; @@ -83,11 +84,14 @@ public static function update_form($form) { use Brain\Monkey\Functions; use Mockery; use ReflectionClass; + use Tests\Mocks\WPErrorMock; + use Exception; class GravityFormsTest extends TestCase { private $forms; private $verifyMock; private $field; + private $mockGFAPI; public function setUp(): void { parent::setUp(); @@ -103,6 +107,9 @@ class_alias(MockGF_Fields::class, 'GF_Fields'); if(!class_exists('GF_Field', false)) { class_alias(MockGF_Field::class, 'GF_Field'); } + if(!class_exists('WP_Error', false)) { + class_alias(WPErrorMock::class, 'WP_Error'); + } Functions\when('esc_html__')->alias(function ($text, $domain) { return "[{$domain}] {$text}"; @@ -135,8 +142,10 @@ class_alias(MockGF_Field::class, 'GF_Field'); return ''; }); + $this->mockGFAPI = Mockery::mock('alias:GFAPI'); + $this->forms = new Forms(); - $this->field = new Field(); + $this->field = new Field($this->mockGFAPI); $this->verifyMock = $this->createMock(Verify::class); $reflection = new \ReflectionClass($this->field); @@ -153,6 +162,7 @@ public function tearDown(): void { parent::tearDown(); } + // Tests if the 'setup' method exists and properly registers the 'gform_loaded' action with the expected parameters. public function testSetup() { $this->assertTrue(method_exists($this->forms, 'setup'), 'Method setup does not exist'); global $mocked_actions; @@ -167,12 +177,14 @@ public function testSetup() { $this->assertInstanceOf(\Closure::class, $registeredAction['callback'], 'Expected a Closure as the callback.'); } + // Tests if the 'register_adcaptcha_field' method exists and returns null as expected. public function testRegisterAdcaptchaField() { $this->assertTrue(method_exists($this->forms, 'register_adcaptcha_field'), 'Method register_adcaptcha_field does not exist'); $result = $this->forms->register_adcaptcha_field(); $this->assertNull($result, 'Expected null return value from register_adcaptcha_field'); } + // Tests if the 'setup_hooks' method exists and correctly registers expected actions and filters. public function testSetupHooks() { $this->assertTrue(method_exists($this->field, 'setup_hooks'), 'Method setup_hooks does not exist'); @@ -219,6 +231,7 @@ public function testSetupHooks() { ); } + // Tests if 'add_to_field_groups' correctly adds the adCAPTCHA field to advanced fields and avoids duplication. public function testAddToFieldGroups() { $this->assertTrue(method_exists($this->field, 'add_to_field_groups'), 'Method add_to_field_groups does not exist'); $field_groups = [ @@ -245,6 +258,7 @@ public function testAddToFieldGroups() { $this->assertEquals($field_groups_adcaptcha, $fieldWithAdcaptcha, 'Expected the field groups to remain unchanged if adcaptcha field is already present'); } + // Tests if 'modify_gform_field_content' removes the label from adCAPTCHA fields while keeping other content unchanged. public function testModifyGformFieldContent() { $this->assertTrue(method_exists($this->field, 'modify_gform_field_content'), 'Method modify_gform_field_content does not exist'); $field = new MockGF_Field('adcaptcha'); @@ -256,6 +270,7 @@ public function testModifyGformFieldContent() { $this->assertEquals($expectedModifiedContent, $modifiedContent, 'Expected label to be removed for adcaptcha fields'); } + // Tests if 'verify_captcha' fails validation when the CAPTCHA token is empty. public function testVerifyCaptchaFailsWhenTokenIsEmpty() { Functions\when('wp_unslash')->justReturn(''); $validation_result = [ @@ -268,6 +283,7 @@ public function testVerifyCaptchaFailsWhenTokenIsEmpty() { $this->assertEquals('Incomplete CAPTCHA, Please try again.', $result['form']['fields'][0]->validation_message); } + // Tests if 'verify_captcha' fails validation when token verification fails. public function testVerifyCaptchaFailsWhenTokenVerificationFails() { Functions\when('wp_unslash')->justReturn('invalid_token'); $this->verifyMock->method('verify_token')->willReturn(false); @@ -281,6 +297,7 @@ public function testVerifyCaptchaFailsWhenTokenVerificationFails() { $this->assertEquals('Invalid token.', $result['form']['fields'][0]->validation_message); } + // Tests if 'verify_captcha' passes validation when a valid token is provided. public function testVerifyCaptchaSucceedsWhenTokenIsValid() { Functions\when('wp_unslash')->justReturn('valid_token'); $this->verifyMock->method('verify_token')->willReturn(true); @@ -302,6 +319,7 @@ public function testVerifyCaptchaSucceedsWhenTokenIsValid() { $this->assertEmpty($result['form']['fields'][0]->validation_message); } + // Tests if 'custom_admin_field_icon_style' outputs the expected CSS styles. public function testCustomAdminFieldIconStyle() { $this->assertTrue(method_exists($this->field, 'custom_admin_field_icon_style'), 'Method custom_admin_field_icon_style does not exist'); ob_start(); @@ -312,35 +330,56 @@ public function testCustomAdminFieldIconStyle() { }", $capturedOutput, 'Expected the style to be output'); } - // public function testUpdateAdcaptchaLabelFormEmpty() { - // if(!class_exists('GFAPI', false)) { - // class_alias(MockGFAPI::class, 'GFAPI'); - // } - // $this->assertTrue(method_exists($this->field, 'update_adcaptcha_label'), 'Method update_adcaptcha_label does not exist'); - // $result = $this->field->update_adcaptcha_label(); - // $this->assertNull($result, 'Expected null return value from update_adcaptcha_label'); - // } + // Tests that 'update_adcaptcha_label' returns null when there are no forms to update. + public function testUpdateAdcaptchaLabelFormEmpty() { + $this->assertTrue(method_exists($this->field, 'update_adcaptcha_label'), 'Method update_adcaptcha_label does not exist'); + $this->mockGFAPI->shouldReceive('get_forms') + ->once() + ->andReturn([]); + $result = $this->field->update_adcaptcha_label(); + $this->assertNull($result, 'Expected null return value from update_adcaptcha_label'); + } + // Tests updating the adCAPTCHA label in a form and handles a simulated update failure. public function testUpdateAdcaptchaLabelFormWithFields() { - if(!class_exists('GFAPI', false)) { - class_alias(MockGFAPIWithFields::class, 'GFAPI'); - } - $result = $this->field->update_adcaptcha_label(); - // var_dump($result); - // $forms = [ - // (object) [ - // 'fields' => [ - // (object) ['type' => 'text'], - // (object) ['type' => 'adcaptcha', 'label' => 'AdCaptcha Label'], - // ] - // ] - // ]; - // Functions\when('GFAPI::get_forms')->justReturn($forms); - // $this->assertTrue(method_exists($this->field, 'update_adcaptcha_label'), 'Method update_adcaptcha_label does not exist'); - // $result = $this->field->update_adcaptcha_label(); - // $this->assertNull($result, 'Expected null return value from update_adcaptcha_label'); + $mockedForms = [ + [ + 'id' => 6, + 'title' => 'TestGravity5.0', + 'fields' => [ + (object) [ + 'id' => 1, + 'type' => 'name', + 'label' => 'Name', + ], + (object) [ + 'id' => 18, + 'type' => 'checkbox', + 'label' => 'Untitled', + ], + (object) [ + 'id' => 45, + 'type' => 'adcaptcha', + 'label' => 'dummyLabel', + ], + ], + ], + ]; + $wpMock = new WPErrorMock(); + $this->mockGFAPI->shouldReceive('get_forms') + ->once() + ->andReturn($mockedForms); + + $this->mockGFAPI->shouldReceive('update_form') + ->with(Mockery::on(function ($form) { + return $form['id'] === 6; + })) + ->andReturn(new \WP_Error('update_failed', 'Simulated update failure')); + $result = $this->field->update_adcaptcha_label(); + $this->assertEquals('Failed to update adCAPTCHA label in Form ID 6: Simulated update failure', $result[0], 'Expected error message when update fails'); } + // Tests that 'enqueue_admin_script' outputs the expected JavaScript for limiting adCAPTCHA field additions. public function testEnqueueAdminScript() { $this->assertTrue(method_exists($this->field, 'enqueue_admin_script'), 'Method enqueue_admin_script does not exist'); ob_start(); @@ -361,6 +400,7 @@ public function testEnqueueAdminScript() { };', $capturedOutput, 'Expected the script to be output'); } + // Tests that 'handle_adcaptcha_token' correctly returns the form and outputs a script when a success token is present. public function testHandleAdcaptchaToken() { $this->assertTrue(method_exists($this->field, 'handle_adcaptcha_token'), 'Method handle_adcaptcha_token does not exist'); @@ -388,6 +428,7 @@ public function testHandleAdcaptchaToken() { }", $capturedOutput, 'Expected the script to be output'); } + // Tests that 'enqueue_preview_scripts' outputs the expected JavaScript for rendering adCAPTCHA in preview mode. public function testEnqueuePreviewScripts() { $this->assertTrue(method_exists($this->field, 'enqueue_preview_scripts'), 'Method enqueue_preview_scripts does not exist'); $formID = 1; @@ -404,6 +445,7 @@ public function testEnqueuePreviewScripts() { }", $capturedOutput, 'The enqueue_preview_scripts method was not called correctly.'); } + // Tests that 'get_field_input' returns the correct HTML output based on form ID and editor mode. public function testGetFieldInput() { $this->assertTrue(method_exists($this->field, 'get_field_input'), 'Method get_field_input does not exist'); $form = ['id' => null]; @@ -425,6 +467,7 @@ public function testGetFieldInput() { });", $result, 'Expected CAPTCHA HTML to be rendered when is_form_editor is false'); } + // Tests that 'get_form_editor_field_title' returns the expected title with the correct text domain. public function testGetFormEditorFieldTitle() { $this->assertTrue( method_exists($this->field, 'get_form_editor_field_title'), @@ -440,6 +483,7 @@ public function testGetFormEditorFieldTitle() { ); } + // Tests that 'get_form_editor_field_settings' returns an array with the expected field settings. public function testGetFormEditorFieldSettings() { $this->assertTrue(method_exists($this->field, 'get_form_editor_field_settings'), 'Method get_form_editor_field_settings does not exist'); $data = [ 'description_setting', 'error_message_setting', 'label_placement_setting', 'css_class_setting',]; @@ -448,6 +492,7 @@ public function testGetFormEditorFieldSettings() { $this->assertEquals($data, $result, 'Expected the array keys to match the expected data'); } + // Tests that 'get_form_editor_field_description' returns the expected description with the correct text domain. public function testGetFormEditorFieldDescription() { $this->assertTrue( method_exists($this->field, 'get_form_editor_field_description'), @@ -463,6 +508,7 @@ public function testGetFormEditorFieldDescription() { ); } + // Tests that 'get_form_editor_field_icon' returns the correct icon URL. public function testGetFromEditorFieldIcon() { $this->assertTrue(method_exists($this->field, 'get_form_editor_field_icon'), 'Method get_form_editor_field_icon does not exist'); $icon_url = $this->field->get_form_editor_field_icon(); diff --git a/tests/mocks/WPErrorMock.php b/tests/mocks/WPErrorMock.php index e549fd5..ca22560 100644 --- a/tests/mocks/WPErrorMock.php +++ b/tests/mocks/WPErrorMock.php @@ -29,11 +29,11 @@ public function get_error_messages() { public function get_error_message($code = '') { if (empty($code)) { - return array_shift($this->errors); + $code = array_key_first($this->errors); } - return isset($this->errors[$code]) ? $this->errors[$code][0] : null; + + return isset($this->errors[$code]) ? $this->errors[$code][0] : ''; } - public function get_error_data($code = '') { return isset($this->error_data[$code]) ? $this->error_data[$code] : null; } diff --git a/tests/test_helpers.php b/tests/test_helpers.php index 49c2b75..1c4a93f 100644 --- a/tests/test_helpers.php +++ b/tests/test_helpers.php @@ -47,4 +47,4 @@ function check_hook_registration($mocked_hooks, $hook_name, $priority = 10, $acc } } return false; -} \ No newline at end of file +} From 5293b1ce2e2b6f67086f1bcf96153f0b1a276884 Mon Sep 17 00:00:00 2001 From: Istvan Vas Date: Fri, 7 Mar 2025 17:05:25 +0000 Subject: [PATCH 12/13] Updated GravityForm removing error handle. ALso updated test --- src/Plugin/GravityForms/Field.php | 14 +--- .../Plugin/GravityForms/GravityFormsTest.php | 80 ------------------- 2 files changed, 2 insertions(+), 92 deletions(-) diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index 99797e6..f607cf4 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -120,27 +120,17 @@ public function update_adcaptcha_label() { if (!$forms || !is_array($forms)) { return; } - $errors = []; foreach ($forms as $form) { $updated = false; foreach ($form['fields'] as &$field) { if ($field->type === 'adcaptcha' && $field->label !== __('adCAPTCHA', 'adcaptcha')) { $field->label = __('adCAPTCHA', 'adcaptcha'); - // $field['label'] = __('adCAPTCHA', 'adcaptcha'); $updated = true; } } - if (!$updated) { - continue; + if ($updated) { + GFAPI::update_form($form); } - $result = GFAPI::update_form($form); - if (function_exists('is_wp_error') && is_wp_error($result)) { - $errorMessage = "Failed to update adCAPTCHA label in Form ID {$form['id']}: " . $result->get_error_message(); - $errors[] = $errorMessage; - } - } - if (!empty($errors)) { - return $errors; } } diff --git a/tests/Plugin/GravityForms/GravityFormsTest.php b/tests/Plugin/GravityForms/GravityFormsTest.php index b3fb9d4..9d9c873 100644 --- a/tests/Plugin/GravityForms/GravityFormsTest.php +++ b/tests/Plugin/GravityForms/GravityFormsTest.php @@ -40,41 +40,6 @@ public function is_form_editor() { } } -// class MockGFAPIWithFields { -// public static function get_forms() { -// return [ -// [ -// 'id' => 6, -// 'title' => 'TestGravity5.0', -// 'fields' => [ -// (object) [ -// 'id' => 1, -// 'type' => 'name', -// 'label' => 'Name', -// ], -// (object) [ -// 'id' => 18, -// 'type' => 'checkbox', -// 'label' => 'Untitled', -// ], -// (object) [ -// 'id' => 45, -// 'type' => 'adcaptcha', -// 'label' => 'dummyLabel', -// ], -// ] -// ] -// ]; -// } - -// public static function update_form($form) { -// if ($form[0]['id'] === 6) { -// return new WP_Error('update_failed', 'Simulated update failure'); -// } -// return true; -// } -// } - use PHPUnit\Framework\TestCase; use AdCaptcha\Plugin\GravityForms\Forms; use AdCaptcha\Plugin\GravityForms\Field; @@ -84,8 +49,6 @@ public function is_form_editor() { use Brain\Monkey\Functions; use Mockery; use ReflectionClass; - use Tests\Mocks\WPErrorMock; - use Exception; class GravityFormsTest extends TestCase { private $forms; @@ -107,9 +70,6 @@ class_alias(MockGF_Fields::class, 'GF_Fields'); if(!class_exists('GF_Field', false)) { class_alias(MockGF_Field::class, 'GF_Field'); } - if(!class_exists('WP_Error', false)) { - class_alias(WPErrorMock::class, 'WP_Error'); - } Functions\when('esc_html__')->alias(function ($text, $domain) { return "[{$domain}] {$text}"; @@ -143,7 +103,6 @@ class_alias(WPErrorMock::class, 'WP_Error'); }); $this->mockGFAPI = Mockery::mock('alias:GFAPI'); - $this->forms = new Forms(); $this->field = new Field($this->mockGFAPI); @@ -340,45 +299,6 @@ public function testUpdateAdcaptchaLabelFormEmpty() { $this->assertNull($result, 'Expected null return value from update_adcaptcha_label'); } - // Tests updating the adCAPTCHA label in a form and handles a simulated update failure. - public function testUpdateAdcaptchaLabelFormWithFields() { - $mockedForms = [ - [ - 'id' => 6, - 'title' => 'TestGravity5.0', - 'fields' => [ - (object) [ - 'id' => 1, - 'type' => 'name', - 'label' => 'Name', - ], - (object) [ - 'id' => 18, - 'type' => 'checkbox', - 'label' => 'Untitled', - ], - (object) [ - 'id' => 45, - 'type' => 'adcaptcha', - 'label' => 'dummyLabel', - ], - ], - ], - ]; - $wpMock = new WPErrorMock(); - $this->mockGFAPI->shouldReceive('get_forms') - ->once() - ->andReturn($mockedForms); - - $this->mockGFAPI->shouldReceive('update_form') - ->with(Mockery::on(function ($form) { - return $form['id'] === 6; - })) - ->andReturn(new \WP_Error('update_failed', 'Simulated update failure')); - $result = $this->field->update_adcaptcha_label(); - $this->assertEquals('Failed to update adCAPTCHA label in Form ID 6: Simulated update failure', $result[0], 'Expected error message when update fails'); - } - // Tests that 'enqueue_admin_script' outputs the expected JavaScript for limiting adCAPTCHA field additions. public function testEnqueueAdminScript() { $this->assertTrue(method_exists($this->field, 'enqueue_admin_script'), 'Method enqueue_admin_script does not exist'); From 2004e3134dcc5417bb745209bbe071cc619ce58a Mon Sep 17 00:00:00 2001 From: Istvan Vas Date: Mon, 10 Mar 2025 10:43:09 +0000 Subject: [PATCH 13/13] Update Field.php --- src/Plugin/GravityForms/Field.php | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/Plugin/GravityForms/Field.php b/src/Plugin/GravityForms/Field.php index 09acbf8..53c6d72 100644 --- a/src/Plugin/GravityForms/Field.php +++ b/src/Plugin/GravityForms/Field.php @@ -118,27 +118,18 @@ public function update_adcaptcha_label() { if (!$forms || !is_array($forms)) { return; } - $errors = []; foreach ($forms as $form) { $updated = false; foreach ($form['fields'] as &$field) { if ($field->type === 'adcaptcha' && $field->label !== __('adCAPTCHA', 'adcaptcha')) { $field->label = __('adCAPTCHA', 'adcaptcha'); - $field['label'] = __('adCAPTCHA', 'adcaptcha'); $updated = true; } } if ($updated) { - $result = GFAPI::update_form($form); - - if (is_wp_error($result)) { - $errors[] = "Failed to update adCAPTCHA label in Form ID {$form['id']}: " . $result->get_error_message(); - } + GFAPI::update_form($form); } } - if (!empty($errors)) { - throw new Exception(implode("\n", $errors)); - } } public function enqueue_admin_script() {