X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/131fcae4c761ed2fa5ecc0e42d3e2f5c38f28dd8..refs/pull/2700/head:/tests/TestResponse.php diff --git a/tests/TestResponse.php b/tests/TestResponse.php index a68a5783f..bf7ee0f69 100644 --- a/tests/TestResponse.php +++ b/tests/TestResponse.php @@ -15,9 +15,8 @@ class TestResponse extends BaseTestResponse { /** * Get the DOM Crawler for the response content. - * @return Crawler */ - protected function crawler() + protected function crawler(): Crawler { if (!is_object($this->crawlerInstance)) { $this->crawlerInstance = new Crawler($this->getContent()); @@ -27,7 +26,6 @@ class TestResponse extends BaseTestResponse { /** * Assert the response contains the specified element. - * @param string $selector * @return $this */ public function assertElementExists(string $selector) @@ -45,7 +43,6 @@ class TestResponse extends BaseTestResponse { /** * Assert the response does not contain the specified element. - * @param string $selector * @return $this */ public function assertElementNotExists(string $selector) @@ -63,15 +60,20 @@ class TestResponse extends BaseTestResponse { /** * Assert the response includes a specific element containing the given text. - * @param string $selector - * @param string $text + * If an nth match is provided, only that will be checked otherwise all matching + * elements will be checked for the given text. * @return $this */ - public function assertElementContains(string $selector, string $text) + public function assertElementContains(string $selector, string $text, ?int $nthMatch = null) { $elements = $this->crawler()->filter($selector); $matched = false; $pattern = $this->getEscapedPattern($text); + + if (!is_null($nthMatch)) { + $elements = $elements->eq($nthMatch - 1); + } + foreach ($elements as $element) { $element = new Crawler($element); if (preg_match("/$pattern/i", $element->html())) { @@ -83,6 +85,7 @@ class TestResponse extends BaseTestResponse { PHPUnit::assertTrue( $matched, 'Unable to find element of selector: '.PHP_EOL.PHP_EOL. + ($nthMatch ? ("at position {$nthMatch}".PHP_EOL.PHP_EOL) : '') . "[{$selector}]".PHP_EOL.PHP_EOL. 'containing text'.PHP_EOL.PHP_EOL. "[{$text}]".PHP_EOL.PHP_EOL. @@ -95,15 +98,20 @@ class TestResponse extends BaseTestResponse { /** * Assert the response does not include a specific element containing the given text. - * @param string $selector - * @param string $text + * If an nth match is provided, only that will be checked otherwise all matching + * elements will be checked for the given text. * @return $this */ - public function assertElementNotContains(string $selector, string $text) + public function assertElementNotContains(string $selector, string $text, ?int $nthMatch = null) { $elements = $this->crawler()->filter($selector); $matched = false; $pattern = $this->getEscapedPattern($text); + + if (!is_null($nthMatch)) { + $elements = $elements->eq($nthMatch - 1); + } + foreach ($elements as $element) { $element = new Crawler($element); if (preg_match("/$pattern/i", $element->html())) { @@ -115,6 +123,7 @@ class TestResponse extends BaseTestResponse { PHPUnit::assertTrue( !$matched, 'Found element of selector: '.PHP_EOL.PHP_EOL. + ($nthMatch ? ("at position {$nthMatch}".PHP_EOL.PHP_EOL) : '') . "[{$selector}]".PHP_EOL.PHP_EOL. 'containing text'.PHP_EOL.PHP_EOL. "[{$text}]".PHP_EOL.PHP_EOL. @@ -125,12 +134,20 @@ class TestResponse extends BaseTestResponse { return $this; } + /** + * Assert there's a notification within the view containing the given text. + * @return $this + */ + public function assertNotificationContains(string $text) + { + return $this->assertElementContains('[notification]', $text); + } + /** * Get the escaped text pattern for the constraint. - * @param string $text * @return string */ - protected function getEscapedPattern($text) + protected function getEscapedPattern(string $text) { $rawPattern = preg_quote($text, '/'); $escapedPattern = preg_quote(e($text), '/');