Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions integrations/ninja-forms/class-field.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,30 @@ public function admin_form_element($id, $value)
return "<input type='hidden' name='fields[$id]' value='0' ><input type='checkbox' name='fields[$id]' value='1' id='' $checked>";
}

/**
* Validate the field value.
*
* Overrides parent to handle checkbox-specific required validation,
* since checkboxes submit '0' when unchecked which the parent considers valid.
*
* @since 4.9
*
* @param array $field The field data.
* @param array $data The form data.
* @return array Array of validation errors, empty if valid.
*/
public function validate($field, $data)
{
$errors = parent::validate($field, $data);

if (isset($field['required']) && 1 == intval($field['required']) && empty($field['value'])) {
$errors['slug'] = 'required-error';
$errors['message'] = esc_html__('This field is required.', 'mailchimp-for-wp');
}

return $errors;
}

/**
* Custom Columns
* Creates what is displayed in the columns on the submissions page.
Expand Down
100 changes: 100 additions & 0 deletions tests/NinjaFormsValidationTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
<?php

// phpcs:disable PSR1.Classes.ClassDeclaration.MultipleClasses

// Mock WP functions
if (! function_exists('add_filter')) {
function add_filter()
{
}
}

if (! function_exists('add_action')) {
function add_action()
{
}
}

if (! function_exists('__')) {
function __($text, $domain = 'default')
{
return $text;
}
}

if (! function_exists('esc_html__')) {
function esc_html__($text, $domain = 'default')
{
return $text;
}
}

// Mock Parent Class
if (! class_exists('NF_Abstracts_Input')) {
abstract class NF_Abstracts_Input
{
protected $_settings = []; // Needed for child constructor access

public function __construct()
{
// Mock constructor
}

public function validate($field, $data)
{
return [];
}
}
}

require_once __DIR__ . '/../integrations/ninja-forms/class-field.php';

class NinjaFormsValidationTest extends \PHPUnit\Framework\TestCase
{
public function testRequiredValidationFailsOnEmpty()
{
$field = new MC4WP_Ninja_Forms_Field();

$field_data = [
'required' => 1,
'value' => 0,
];
$form_data = [];

$errors = $field->validate($field_data, $form_data);

$this->assertIsArray($errors);
$this->assertArrayHasKey('slug', $errors, 'Error slug should be present');
$this->assertEquals('required-error', $errors['slug']);
}

public function testRequiredValidationPassesOnChecked()
{
$field = new MC4WP_Ninja_Forms_Field();

$field_data = [
'required' => 1,
'value' => 1,
];
$form_data = [];

$errors = $field->validate($field_data, $form_data);

$this->assertEmpty($errors, 'Validation should pass for required checked field');
}

public function testOptionalValidationPassesOnUnchecked()
{
$field = new MC4WP_Ninja_Forms_Field();

$field_data = [
'required' => 0,
'value' => 0,
];
$form_data = [];

$errors = $field->validate($field_data, $form_data);

$this->assertEmpty($errors, 'Validation should pass for optional unchecked field');
}
}