diff options
author | Dries Buytaert <dries@buytaert.net> | 2010-04-11 19:00:27 +0000 |
---|---|---|
committer | Dries Buytaert <dries@buytaert.net> | 2010-04-11 19:00:27 +0000 |
commit | 33f0b0830baa8d584c8cce180fa2d8a0b94e39fd (patch) | |
tree | 00d6c31612eb275ac148abf678ff2a474e4fa44f /modules/simpletest/tests/form.test | |
parent | 98a3f2266d516a39c2731499af2840b0a2d500ef (diff) | |
download | brdo-33f0b0830baa8d584c8cce180fa2d8a0b94e39fd.tar.gz brdo-33f0b0830baa8d584c8cce180fa2d8a0b94e39fd.tar.bz2 |
- Patch #426056 by effulgentsia, Berdir, sun, boombatower, tstoeckler: fixed server-side enforcement of #disabled is inconsistent.
Diffstat (limited to 'modules/simpletest/tests/form.test')
-rw-r--r-- | modules/simpletest/tests/form.test | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/modules/simpletest/tests/form.test b/modules/simpletest/tests/form.test index 87374dd00..7ecfde9ac 100644 --- a/modules/simpletest/tests/form.test +++ b/modules/simpletest/tests/form.test @@ -156,23 +156,54 @@ class FormsTestCase extends DrupalWebTestCase { * @see _form_test_disabled_elements() */ function testDisabledElements() { - // Submit the form, and fetch the default values. - $this->drupalPost('form-test/disabled-elements', array(), t('Submit')); - $returned_values = drupal_json_decode($this->content); - - // Get the default value from the form. + // Get the raw form in its original state. $form_state = array(); $form = _form_test_disabled_elements(array(), $form_state); + // Build a submission that tries to hijack the form by submitting input for + // elements that are disabled. + $edit = array(); foreach (element_children($form) as $key) { - if (isset($form[$key]['#default_value'])) { - $expected_value = $form[$key]['#default_value']; + if (isset($form[$key]['#test_hijack_value'])) { + if (is_array($form[$key]['#test_hijack_value'])) { + foreach ($form[$key]['#test_hijack_value'] as $subkey => $value) { + $edit[$key . '[' . $subkey . ']'] = $value; + } + } + else { + $edit[$key] = $form[$key]['#test_hijack_value']; + } + } + } - if ($key == 'checkboxes_multiple') { - // Checkboxes values are not filtered out. - $returned_values[$key] = array_filter($returned_values[$key]); + // Submit the form with no input, as the browser does for disabled elements, + // and fetch the $form_state['values'] that is passed to the submit handler. + $this->drupalPost('form-test/disabled-elements', array(), t('Submit')); + $returned_values['normal'] = drupal_json_decode($this->content); + + // Do the same with input, as could happen if JavaScript un-disables an + // element. drupalPost() emulates a browser by not submitting input for + // disabled elements, so we need to un-disable those elements first. + $this->drupalGet('form-test/disabled-elements'); + foreach ($this->xpath('//*[@disabled]') as $element) { + unset($element['disabled']); + } + $this->drupalPost(NULL, $edit, t('Submit')); + $returned_values['hijacked'] = drupal_json_decode($this->content); + + // Ensure that the returned values match the form's default values in both + // cases. + foreach ($returned_values as $type => $values) { + foreach (element_children($form) as $key) { + if (isset($form[$key]['#default_value'])) { + $expected_value = $form[$key]['#default_value']; + + if ($key == 'checkboxes_multiple') { + // Checkboxes values are not filtered out. + $values[$key] = array_filter($values[$key]); + } + $this->assertIdentical($expected_value, $values[$key], t('Default value for %type: expected %expected, returned %returned.', array('%type' => $key, '%expected' => var_export($expected_value, TRUE), '%returned' => var_export($values[$key], TRUE)))); } - $this->assertIdentical($expected_value, $returned_values[$key], t('Default value for %type: expected %expected, returned %returned.', array('%type' => $key, '%expected' => var_export($expected_value, TRUE), '%returned' => var_export($returned_values[$key], TRUE)))); } } } |