You are here

public function FormTest::testNumber in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/system/tests/src/Functional/Form/FormTest.php \Drupal\Tests\system\Functional\Form\FormTest::testNumber()

Tests validation of #type 'number' and 'range' elements.

File

core/modules/system/tests/src/Functional/Form/FormTest.php, line 610

Class

FormTest
Tests various form element validation mechanisms.

Namespace

Drupal\Tests\system\Functional\Form

Code

public function testNumber() {
  $form = \Drupal::formBuilder()
    ->getForm('\\Drupal\\form_test\\Form\\FormTestNumberForm');

  // Array with all the error messages to be checked.
  $error_messages = [
    'no_number' => '%name must be a number.',
    'too_low' => '%name must be higher than or equal to %min.',
    'too_high' => '%name must be lower than or equal to %max.',
    'step_mismatch' => '%name is not a valid number.',
  ];

  // The expected errors.
  $expected = [
    'integer_no_number' => 'no_number',
    'integer_no_step' => 0,
    'integer_no_step_step_error' => 'step_mismatch',
    'integer_step' => 0,
    'integer_step_error' => 'step_mismatch',
    'integer_step_min' => 0,
    'integer_step_min_error' => 'too_low',
    'integer_step_max' => 0,
    'integer_step_max_error' => 'too_high',
    'integer_step_min_border' => 0,
    'integer_step_max_border' => 0,
    'integer_step_based_on_min' => 0,
    'integer_step_based_on_min_error' => 'step_mismatch',
    'float_small_step' => 0,
    'float_step_no_error' => 0,
    'float_step_error' => 'step_mismatch',
    'float_step_hard_no_error' => 0,
    'float_step_hard_error' => 'step_mismatch',
    'float_step_any_no_error' => 0,
  ];

  // First test the number element type, then range.
  foreach ([
    'form-test/number',
    'form-test/number/range',
  ] as $path) {

    // Post form and show errors.
    $this
      ->drupalGet($path);
    $this
      ->submitForm([], 'Submit');
    foreach ($expected as $element => $error) {

      // Create placeholder array.
      $placeholders = [
        '%name' => $form[$element]['#title'],
        '%min' => isset($form[$element]['#min']) ? $form[$element]['#min'] : '0',
        '%max' => isset($form[$element]['#max']) ? $form[$element]['#max'] : '0',
      ];
      foreach ($error_messages as $id => $message) {

        // Check if the error exists on the page, if the current message ID is
        // expected. Otherwise ensure that the error message is not present.
        if ($id === $error) {
          $this
            ->assertSession()
            ->responseContains(new FormattableMarkup($message, $placeholders));
        }
        else {
          $this
            ->assertSession()
            ->responseNotContains(new FormattableMarkup($message, $placeholders));
        }
      }
    }
  }
}