You are here

function FormsTestCase::testRequiredFields in SimpleTest 7

Check several empty values for required forms elements.

If the form field is found in form_get_errors() then the test pass.

File

tests/form.test, line 23
Unit tests for the Drupal Form API.

Class

FormsTestCase
@file Unit tests for the Drupal Form API.

Code

function testRequiredFields() {

  // Originates from http://drupal.org/node/117748
  // Sets of empty strings and arrays
  $empty_strings = array(
    '""' => "",
    '"\\n"' => "\n",
    '" "' => " ",
    '"\\t"' => "\t",
    '" \\n\\t "' => " \n\t ",
    '"\\n\\n\\n\\n\\n"' => "\n\n\n\n\n",
  );
  $empty_arrays = array(
    'array()' => array(),
  );
  $elements['textfield']['element'] = array(
    '#title' => $this
      ->randomName(),
    '#type' => 'textfield',
  );
  $elements['textfield']['empty_values'] = $empty_strings;
  $elements['password']['element'] = array(
    '#title' => $this
      ->randomName(),
    '#type' => 'password',
  );
  $elements['password']['empty_values'] = $empty_strings;
  $elements['password_confirm']['element'] = array(
    '#title' => $this
      ->randomName(),
    '#type' => 'password_confirm',
  );
  $elements['password_confirm']['empty_values'] = $empty_strings;
  $elements['textarea']['element'] = array(
    '#title' => $this
      ->randomName(),
    '#type' => 'textarea',
  );
  $elements['textarea']['empty_values'] = $empty_strings;
  $elements['radios']['element'] = array(
    '#title' => $this
      ->randomName(),
    '#type' => 'radios',
    '#options' => array(
      $this
        ->randomName(),
      $this
        ->randomName(),
      $this
        ->randomName(),
    ),
  );
  $elements['radios']['empty_values'] = $empty_arrays;
  $elements['checkboxes']['element'] = array(
    '#title' => $this
      ->randomName(),
    '#type' => 'checkboxes',
    '#options' => array(
      $this
        ->randomName(),
      $this
        ->randomName(),
      $this
        ->randomName(),
    ),
  );
  $elements['checkboxes']['empty_values'] = $empty_arrays;
  $elements['select']['element'] = array(
    '#title' => $this
      ->randomName(),
    '#type' => 'select',
    '#options' => array(
      $this
        ->randomName(),
      $this
        ->randomName(),
      $this
        ->randomName(),
    ),
  );
  $elements['select']['empty_values'] = $empty_strings;
  $elements['file']['element'] = array(
    '#title' => $this
      ->randomName(),
    '#type' => 'file',
  );
  $elements['file']['empty_values'] = $empty_strings;

  // Go through all the elements and all the empty values for them
  foreach ($elements as $type => $data) {
    foreach ($data['empty_values'] as $key => $empty) {
      foreach (array(
        TRUE,
        FALSE,
      ) as $required) {
        $form_id = $this
          ->randomName();
        $form = $form_state = array();
        form_clear_error();
        $form['op'] = array(
          '#type' => 'submit',
          '#value' => t('Submit'),
        );
        $element = $data['element']['#title'];
        $form[$element] = $data['element'];
        $form[$element]['#required'] = $required;
        $form_state['values'][$element] = $empty;
        $form_state['input'] = $form_state['values'];
        $form_state['input']['form_id'] = $form_id;
        $form_state['method'] = 'post';
        drupal_prepare_form($form_id, $form, $form_state);
        drupal_process_form($form_id, $form, $form_state);
        $errors = form_get_errors();
        if ($required) {

          // Make sure we have a form error for this element.
          $this
            ->assertTrue(isset($errors[$element]), "Check empty({$key}) '{$type}' field '{$element}'");
        }
        elseif ($type == 'select') {

          // Select elements are going to have validation errors with empty
          // input, since those are illegal choices. Just make sure the
          // error is not "field is required".
          $this
            ->assertTrue(empty($errors[$element]) || strpos('field is required', $errors[$element]) === FALSE, "Optional '{$type}' field '{$element}' is not treated as a required element");
        }
        else {

          // Make sure there is *no* form error for this element.
          $this
            ->assertTrue(empty($errors[$element]), "Optional '{$type}' field '{$element}' has no errors with empty input");
        }
      }
    }
  }

  // Clear the expected form error messages so they don't appear as exceptions.
  drupal_get_messages();
}