diff --git a/src/Codeception/Lib/InnerBrowser.php b/src/Codeception/Lib/InnerBrowser.php index 8f2e0b2..737f085 100644 --- a/src/Codeception/Lib/InnerBrowser.php +++ b/src/Codeception/Lib/InnerBrowser.php @@ -1063,20 +1063,36 @@ protected function getFormFor(Crawler $node) */ protected function getFormValuesFor(Form $form) { + $formNodeCrawler = new Crawler($form->getFormNode()); $values = []; $fields = $form->all(); foreach ($fields as $field) { - if ($field instanceof FileFormField || $field->isDisabled() || !$field->hasValue()) { + if ($field instanceof FileFormField || $field->isDisabled()) { continue; } + + if (!$field->hasValue()) { + // if unchecked a checkbox and if there is hidden input with same name to submit unchecked value + $hiddenInput = $formNodeCrawler->filter('input[type=hidden][name="'.$field->getName().'"]:not([disabled])'); + if (!count($hiddenInput)) { + continue; + } else { + // there might be multiple hidden input with same name, but we will only grab last one's value + $fieldValue = $hiddenInput->last()->attr('value'); + } + } else { + $fieldValue = $field->getValue(); + } + + $fieldName = $this->getSubmissionFormFieldName($field->getName()); if (substr($field->getName(), -2) === '[]') { if (!isset($values[$fieldName])) { $values[$fieldName] = []; } - $values[$fieldName][] = $field->getValue(); + $values[$fieldName][] = $fieldValue; } else { - $values[$fieldName] = $field->getValue(); + $values[$fieldName] = $fieldValue; } } return $values; @@ -1295,7 +1311,7 @@ public function sendAjaxGetRequest($uri, $params = []) * 'task' => 'lorem ipsum', * 'category' => 'miscellaneous', * ]]); - * ``` + * ``` * * @param string $uri * @param array $params diff --git a/tests/data/app/view/form/button.php b/tests/data/app/view/form/button.php index f7704d6..97612df 100755 --- a/tests/data/app/view/form/button.php +++ b/tests/data/app/view/form/button.php @@ -5,4 +5,4 @@ - \ No newline at end of file + diff --git a/tests/data/app/view/form/uncheck_hidden.php b/tests/data/app/view/form/uncheck_hidden.php new file mode 100644 index 0000000..421dd02 --- /dev/null +++ b/tests/data/app/view/form/uncheck_hidden.php @@ -0,0 +1,19 @@ +
+ + + + + + + + + + + + + + + + + +
diff --git a/tests/unit/Codeception/Module/TestsForWeb.php b/tests/unit/Codeception/Module/TestsForWeb.php index 9dd4265..2db61b3 100644 --- a/tests/unit/Codeception/Module/TestsForWeb.php +++ b/tests/unit/Codeception/Module/TestsForWeb.php @@ -1780,4 +1780,20 @@ public function testHaveServerParameter() $server = $this->module->client->getRequest()->getServer(); $this->assertArrayHasKey('my', $server); } + + public function testUncheckHidden() + { + $this->module->amOnPage('/form/uncheck_hidden'); + $this->module->uncheckOption('#coffee-id'); + $this->module->click("Submit Preference"); + $form = data::get('form'); + $this->assertEquals('0', $form['coffee']); + + // test all other inputs are submitted as intended + $this->assertEquals('mouse', $form['wireless']); + $this->assertEquals('1', $form['tea']); + $this->assertEquals('on', $form['vanilla']); // 'on' is set internally + $this->assertFalse(isset($form['butter'])); + + } }