diff --git a/module/VuFind/src/VuFindTest/Feature/RetryClickTrait.php b/module/VuFind/src/VuFindTest/Feature/RetryClickTrait.php new file mode 100644 index 00000000000..e456c40c626 --- /dev/null +++ b/module/VuFind/src/VuFindTest/Feature/RetryClickTrait.php @@ -0,0 +1,64 @@ + + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link https://vufind.org/wiki/development:testing:unit_tests Wiki + */ + +namespace VuFindTest\Feature; + +use Behat\Mink\Element\Element; +use Behat\Mink\Session; + +/** + * Trait adding functionality to retry failed clicks. + * + * @category VuFind + * @package Tests + * @author Demian Katz + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link https://vufind.org/wiki/development:testing:unit_tests Wiki + */ +trait RetryClickTrait +{ + /** + * After a failed button click has been detected, resize the window and try again. + * + * @param Session $session Mink session + * @param Element $page Current page element + * @param string $selector Selector to click + * + * @return void + */ + protected function retryClickWithResizedWindow(Session $session, Element $page, string $selector): void + { + // For some reason, the click action does not always succeed here; resizing + // the window and retrying seems to prevent intermittent test failures. + echo "\n\nMink click failed; retrying with resized window!\n"; + $session->resizeWindow(1280, 200, 'current'); + $this->clickCss($page, $selector); + $session->resizeWindow(1280, 768, 'current'); + } +} diff --git a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/BulkTest.php b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/BulkTest.php index a38463dc09c..85489ad995c 100644 --- a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/BulkTest.php +++ b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/BulkTest.php @@ -30,7 +30,6 @@ namespace VuFindTest\Mink; use Behat\Mink\Element\Element; -use Behat\Mink\Session; /** * Mink bulk action test class. @@ -46,6 +45,7 @@ final class BulkTest extends \VuFindTest\Integration\MinkTestCase { use \VuFindTest\Feature\LiveDatabaseTrait; + use \VuFindTest\Feature\RetryClickTrait; use \VuFindTest\Feature\UserCreationTrait; /** @@ -293,25 +293,6 @@ public static function topOrBottomProvider(): array ]; } - /** - * After a failed button click has been detected, resize the window and try again. - * - * @param Session $session Mink session - * @param Element $page Current page element - * @param string $selector Selector to click - * - * @return void - */ - protected function retryClickWithResizedWindow(Session $session, Element $page, string $selector): void - { - // For some reason, the click action does not always succeed here; resizing - // the window and retrying seems to prevent intermittent test failures. - echo "\n\nMink click failed; retrying with resized window!\n"; - $session->resizeWindow(1280, 200, 'current'); - $this->clickCss($page, $selector); - $session->resizeWindow(1280, 768, 'current'); - } - /** * Test that the export control works. * diff --git a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/FallbackLoaderTest.php b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/FallbackLoaderTest.php index 37483192f85..8e78a205cb1 100644 --- a/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/FallbackLoaderTest.php +++ b/module/VuFind/tests/integration-tests/src/VuFindTest/Mink/FallbackLoaderTest.php @@ -48,6 +48,7 @@ final class FallbackLoaderTest extends \VuFindTest\Integration\MinkTestCase { use \VuFindTest\Feature\LiveDatabaseTrait; + use \VuFindTest\Feature\RetryClickTrait; use \VuFindTest\Feature\UserCreationTrait; /** @@ -128,7 +129,19 @@ protected function addComment(Element $page, string $comment): void $this->clickCss($page, '.record-tabs .usercomments a'); $this->findCss($page, '.comment-form'); $this->findCssAndSetValue($page, 'form.comment-form [name="comment"]', $comment); - $this->clickCss($page, 'form.comment-form .btn-primary'); + $buttonSelector = 'form.comment-form .btn-primary'; + $this->clickCss($page, $buttonSelector); + $commentSelector = '.comment-text'; + try { + // We don't want to wait the full default timeout here since that wastes a lot + // of time if a click failed to register; however, we shouldn't wait for too + // short of a time, or else a slow response can break the test by causing a + // double form submission. + $this->findCss($page, $commentSelector, 1500); + } catch (\Exception $e) { + $this->retryClickWithResizedWindow($this->getMinkSession(), $page, $buttonSelector); + } + $this->assertEquals($comment, $this->findCssAndGetText($page, $commentSelector)); } /**