From b4deec03985b0f7270eb0f31bdb47d73588889d1 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Tue, 31 Aug 2021 07:03:46 -0400 Subject: [PATCH 1/3] [bug] fix form submission regression (closes #55) --- src/Browser/Mink/BrowserKitDriver.php | 28 ++++++++++++++++++++- tests/BrowserTests.php | 35 +++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/Browser/Mink/BrowserKitDriver.php b/src/Browser/Mink/BrowserKitDriver.php index 6c31286..87c5d8f 100644 --- a/src/Browser/Mink/BrowserKitDriver.php +++ b/src/Browser/Mink/BrowserKitDriver.php @@ -21,6 +21,7 @@ use Symfony\Component\DomCrawler\Field\ChoiceFormField; use Symfony\Component\DomCrawler\Field\FileFormField; use Symfony\Component\DomCrawler\Field\FormField; +use Symfony\Component\DomCrawler\Field\InputFormField; use Symfony\Component\DomCrawler\Field\TextareaFormField; use Symfony\Component\DomCrawler\Form; use Symfony\Component\HttpKernel\HttpKernelBrowser; @@ -648,7 +649,7 @@ private function submit(Form $form) $formId = $this->getFormNodeId($form->getFormNode()); if (isset($this->forms[$formId])) { - $form = $this->forms[$formId]; + $form = $this->addButtons($form, $this->forms[$formId]); } // remove empty file fields from request @@ -800,4 +801,29 @@ private function getCrawler() return $crawler; } + + /** + * Adds button fields from submitted form to cached version. + */ + private function addButtons(Form $submitted, Form $cached): Form + { + foreach ($submitted->all() as $field) { + if (!$field instanceof InputFormField) { + continue; + } + + $nodeReflection = (new \ReflectionObject($field))->getProperty('node'); + $nodeReflection->setAccessible(true); + + $node = $nodeReflection->getValue($field); + + if (!\in_array($node->getAttribute('type'), ['submit', 'button', 'image'])) { + continue; + } + + $cached->set($field); + } + + return $cached; + } } diff --git a/tests/BrowserTests.php b/tests/BrowserTests.php index 318bc41..b9b0e93 100644 --- a/tests/BrowserTests.php +++ b/tests/BrowserTests.php @@ -461,6 +461,41 @@ public function can_submit_form_with_different_submit_buttons(): void ; } + /** + * @see https://github.com/zenstruck/browser/issues/55 + * + * @test + */ + public function can_submit_filled_form_with_different_submit_buttons(): void + { + // Submit and Submit B, have the same field name but different values + // Submit C has a different field name (and value) + + $this->browser() + ->visit('/page1') + ->fillField('input_1', 'Kevin') + ->click('Submit') + ->assertOn('/submit-form') + ->assertContains('"input_1":"Kevin"') + ->assertContains('"submit_1":"a"') + ->assertNotContains('submit_2') + ->visit('/page1') + ->fillField('input_1', 'Kevin') + ->click('Submit B') + ->assertOn('/submit-form') + ->assertContains('"input_1":"Kevin"') + ->assertContains('"submit_1":"b"') + ->assertNotContains('submit_2') + ->visit('/page1') + ->fillField('input_1', 'Kevin') + ->click('Submit C') + ->assertOn('/submit-form') + ->assertContains('"input_1":"Kevin"') + ->assertContains('"submit_2":"c"') + ->assertNotContains('submit_1') + ; + } + /** * @test */ From d747a5d97feb20112ffb94dd164cd2675985beba Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Tue, 31 Aug 2021 07:57:30 -0400 Subject: [PATCH 2/3] [minor] disable dev ci --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1791f61..4fd3774 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,9 +19,9 @@ jobs: - php: 7.4 stability: lowest symfony: '*' - - php: 8.0 - stability: highest - symfony: '5.4.*@dev' +# - php: 8.0 +# stability: highest +# symfony: '5.4.*@dev' steps: - name: Checkout code uses: actions/checkout@v2.3.3 From bff29aafe38e74fc6c1c5b67433f45b20c69484a Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Tue, 31 Aug 2021 10:43:25 -0400 Subject: [PATCH 3/3] [bug] fix clicking button with no "type" --- src/Browser/Mink/BrowserKitDriver.php | 6 ++---- tests/BrowserTests.php | 12 ++++++++++++ tests/Fixture/files/page1.html | 1 + 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Browser/Mink/BrowserKitDriver.php b/src/Browser/Mink/BrowserKitDriver.php index 87c5d8f..1a8acdd 100644 --- a/src/Browser/Mink/BrowserKitDriver.php +++ b/src/Browser/Mink/BrowserKitDriver.php @@ -817,11 +817,9 @@ private function addButtons(Form $submitted, Form $cached): Form $node = $nodeReflection->getValue($field); - if (!\in_array($node->getAttribute('type'), ['submit', 'button', 'image'])) { - continue; + if ('button' === $node->nodeName || \in_array($node->getAttribute('type'), ['submit', 'button', 'image'])) { + $cached->set($field); } - - $cached->set($field); } return $cached; diff --git a/tests/BrowserTests.php b/tests/BrowserTests.php index b9b0e93..5934e4f 100644 --- a/tests/BrowserTests.php +++ b/tests/BrowserTests.php @@ -458,6 +458,11 @@ public function can_submit_form_with_different_submit_buttons(): void ->assertOn('/submit-form') ->assertContains('"submit_2":"c"') ->assertNotContains('submit_1') + ->visit('/page1') + ->click('Submit D') + ->assertOn('/submit-form') + ->assertContains('"submit_2":"d"') + ->assertNotContains('submit_1') ; } @@ -493,6 +498,13 @@ public function can_submit_filled_form_with_different_submit_buttons(): void ->assertContains('"input_1":"Kevin"') ->assertContains('"submit_2":"c"') ->assertNotContains('submit_1') + ->visit('/page1') + ->fillField('input_1', 'Kevin') + ->click('Submit D') + ->assertOn('/submit-form') + ->assertContains('"input_1":"Kevin"') + ->assertContains('"submit_2":"d"') + ->assertNotContains('submit_1') ; } diff --git a/tests/Fixture/files/page1.html b/tests/Fixture/files/page1.html index 99d0077..5aae113 100644 --- a/tests/Fixture/files/page1.html +++ b/tests/Fixture/files/page1.html @@ -58,6 +58,7 @@

h1 title

+