Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 18 additions & 4 deletions src/Codeception/Lib/InnerBrowser.php
Original file line number Diff line number Diff line change
Expand Up @@ -1063,11 +1063,19 @@ 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()) {
continue;
if ($field instanceof FileFormField || $field->isDisabled()
||
!$field->hasValue()
) {
// if unchecked a checkboc 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;
}
}
$fieldName = $this->getSubmissionFormFieldName($field->getName());
if (substr($field->getName(), -2) === '[]') {
Expand All @@ -1076,7 +1084,13 @@ protected function getFormValuesFor(Form $form)
}
$values[$fieldName][] = $field->getValue();
} else {
$values[$fieldName] = $field->getValue();
if (isset($hiddenInput) && count($hiddenInput)) {
// there might be multiple hidden input with same name, but we will only grab last one's value
$values[$fieldName] = $hiddenInput->last()->attr('value');
unset($hiddenInput);
} else {
$values[$fieldName] = $field->getValue();
}
}
}
return $values;
Expand Down Expand Up @@ -1295,7 +1309,7 @@ public function sendAjaxGetRequest($uri, $params = [])
* 'task' => 'lorem ipsum',
* 'category' => 'miscellaneous',
* ]]);
* ```
* ```
*
* @param string $uri
* @param array $params
Expand Down
2 changes: 1 addition & 1 deletion tests/data/app/view/form/button.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
<button type="submit" name="btn0">Submit</button>
</form>
</body>
</html>
</html>
19 changes: 19 additions & 0 deletions tests/data/app/view/form/uncheck_hidden.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<form method="POST" action="/form/uncheck_hidden">

<input type="text" name="wireless" value="mouse">

<input type="hidden" name="coffee" value="123"> <!-- this should be discarded -->

<!-- Do you need coffee ? (label) -->
<input type="hidden" name="coffee" value="8569" disabled="disabled">
<input type="hidden" name="coffee" value="8">
<input type="hidden" name="coffee" value="0">
<input type="checkbox" name="coffee" value="1" id="coffee-id" checked>

<!-- check all other work as intended -->
<input type="checkbox" name="tea" value="1" id="tea-id" checked>
<input type="checkbox" name="vanilla" id="vanilla-id" checked>
<input type="checkbox" name="butter" id="butter-id" >

<button type="submit">Submit Preference</button>
</form>
16 changes: 16 additions & 0 deletions tests/unit/Codeception/Module/TestsForWeb.php
Original file line number Diff line number Diff line change
Expand Up @@ -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']));

}
}