summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/simpletest/tests/form.test55
-rw-r--r--modules/simpletest/tests/form_test.module90
2 files changed, 145 insertions, 0 deletions
diff --git a/modules/simpletest/tests/form.test b/modules/simpletest/tests/form.test
index ed556c540..857b32128 100644
--- a/modules/simpletest/tests/form.test
+++ b/modules/simpletest/tests/form.test
@@ -153,6 +153,61 @@ class FormsTestCase extends DrupalWebTestCase {
}
/**
+ * Test form validation handlers.
+ */
+class FormValidationTestCase extends DrupalWebTestCase {
+ public static function getInfo() {
+ return array(
+ 'name' => 'Form validation handlers',
+ 'description' => 'Tests form processing and alteration via form validation handlers.',
+ 'group' => 'Form API',
+ );
+ }
+
+ function setUp() {
+ parent::setUp('form_test');
+ }
+
+ /**
+ * Tests form alterations by #element_validate, #validate, and form_set_value().
+ */
+ function testValidate() {
+ $this->drupalGet('form-test/validate');
+ // Verify that #element_validate handlers can alter the form and submitted
+ // form values.
+ $edit = array(
+ 'name' => 'element_validate',
+ );
+ $this->drupalPost(NULL, $edit, 'Save');
+ $this->assertFieldByName('name', '#value changed by #element_validate', t('Form element #value was altered.'));
+ $this->assertText('Name value: value changed by form_set_value() in #element_validate', t('Form element value in $form_state was altered.'));
+
+ // Verify that #validate handlers can alter the form and submitted
+ // form values.
+ $edit = array(
+ 'name' => 'validate',
+ );
+ $this->drupalPost(NULL, $edit, 'Save');
+ $this->assertFieldByName('name', '#value changed by #validate', t('Form element #value was altered.'));
+ $this->assertText('Name value: value changed by form_set_value() in #validate', t('Form element value in $form_state was altered.'));
+
+ // Verify that #element_validate handlers can make form elements
+ // inaccessible, but values persist.
+ $edit = array(
+ 'name' => 'element_validate_access',
+ );
+ $this->drupalPost(NULL, $edit, 'Save');
+ $this->assertNoFieldByName('name', t('Form element was hidden.'));
+ $this->assertText('Name value: element_validate_access', t('Value for inaccessible form element exists.'));
+
+ // Verify that value for inaccessible form element persists.
+ $this->drupalPost(NULL, array(), 'Save');
+ $this->assertNoFieldByName('name', t('Form element was hidden.'));
+ $this->assertText('Name value: element_validate_access', t('Value for inaccessible form element exists.'));
+ }
+}
+
+/**
* Test the tableselect form element for expected behavior.
*/
class FormsElementsTableSelectFunctionalTest extends DrupalWebTestCase {
diff --git a/modules/simpletest/tests/form_test.module b/modules/simpletest/tests/form_test.module
index 5c809580f..15a141f15 100644
--- a/modules/simpletest/tests/form_test.module
+++ b/modules/simpletest/tests/form_test.module
@@ -10,6 +10,14 @@
* Implement hook_menu().
*/
function form_test_menu() {
+ $items['form-test/validate'] = array(
+ 'title' => 'Form validation handlers test',
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('form_test_validate_form'),
+ 'access arguments' => array('access content'),
+ 'type' => MENU_CALLBACK,
+ );
+
$items['form_test/tableselect/multiple-true'] = array(
'title' => 'Tableselect checkboxes test',
'page callback' => 'drupal_get_form',
@@ -82,6 +90,88 @@ function form_test_menu() {
}
/**
+ * Form builder for testing drupal_validate_form().
+ *
+ * Serves for testing form processing and alterations by form validation
+ * handlers, especially for the case of a validation error:
+ * - form_set_value() should be able to alter submitted values in
+ * $form_state['values'] without affecting the form element.
+ * - #element_validate handlers should be able to alter the $element in the form
+ * structure and the alterations should be contained in the rebuilt form.
+ * - #validate handlers should be able to alter the $form and the alterations
+ * should be contained in the rebuilt form.
+ */
+function form_test_validate_form($form, &$form_state) {
+ $form['name'] = array(
+ '#type' => 'textfield',
+ '#title' => 'Name',
+ '#default_value' => '',
+ '#element_validate' => array('form_test_element_validate_name'),
+ );
+ $form['submit'] = array(
+ '#type' => 'submit',
+ '#value' => 'Save',
+ );
+ return $form;
+}
+
+/**
+ * Form element validation handler for 'name' in form_test_validate_form().
+ */
+function form_test_element_validate_name(&$element, &$form_state) {
+ $triggered = FALSE;
+ if ($form_state['values']['name'] == 'element_validate') {
+ // Alter the form element.
+ $element['#value'] = '#value changed by #element_validate';
+ // Alter the submitted value in $form_state.
+ form_set_value($element, 'value changed by form_set_value() in #element_validate', $form_state);
+
+ $triggered = TRUE;
+ }
+ if ($form_state['values']['name'] == 'element_validate_access') {
+ // To simplify this test, enable form caching and use form storage to
+ // remember our alteration.
+ $form_state['cache'] = TRUE;
+ $form_state['storage']['form_test_name'] = $form_state['values']['name'];
+ // Alter the form element.
+ $element['#access'] = FALSE;
+
+ $triggered = TRUE;
+ }
+ elseif (!empty($form_state['storage']['form_test_name'])) {
+ // To simplify this test, just take over the element's value into $form_state.
+ form_set_value($element, $form_state['storage']['form_test_name'], $form_state);
+
+ $triggered = TRUE;
+ }
+
+ if ($triggered) {
+ // Output the element's value from $form_state.
+ drupal_set_message(t('@label value: @value', array('@label' => $element['#title'], '@value' => $form_state['values']['name'])));
+
+ // Trigger a form validation error to see our changes.
+ form_set_error('');
+ }
+}
+
+/**
+ * Form validation handler for form_test_validate_form().
+ */
+function form_test_validate_form_validate(&$form, &$form_state) {
+ if ($form_state['values']['name'] == 'validate') {
+ // Alter the form element.
+ $form['name']['#value'] = '#value changed by #validate';
+ // Alter the submitted value in $form_state.
+ form_set_value($form['name'], 'value changed by form_set_value() in #validate', $form_state);
+ // Output the element's value from $form_state.
+ drupal_set_message(t('@label value: @value', array('@label' => $form['name']['#title'], '@value' => $form_state['values']['name'])));
+
+ // Trigger a form validation error to see our changes.
+ form_set_error('');
+ }
+}
+
+/**
* Create a header and options array. Helper function for callbacks.
*/
function _form_test_tableselect_get_data() {