X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/a6633642232efd164d4708967ab59e498fbff896..refs/pull/3000/head:/tests/TestResponse.php diff --git a/tests/TestResponse.php b/tests/TestResponse.php index 9c6b78782..79f173c9b 100644 --- a/tests/TestResponse.php +++ b/tests/TestResponse.php @@ -1,16 +1,17 @@ -crawlerInstance)) { $this->crawlerInstance = new Crawler($this->getContent()); } + return $this->crawlerInstance; } + /** + * Get the HTML of the first element at the given selector. + */ + public function getElementHtml(string $selector): string + { + return $this->crawler()->filter($selector)->first()->outerHtml(); + } + /** * Assert the response contains the specified element. + * * @return $this */ public function assertElementExists(string $selector) @@ -33,16 +44,18 @@ class TestResponse extends BaseTestResponse { $elements = $this->crawler()->filter($selector); PHPUnit::assertTrue( $elements->count() > 0, - 'Unable to find element matching the selector: '.PHP_EOL.PHP_EOL. - "[{$selector}]".PHP_EOL.PHP_EOL. - 'within'.PHP_EOL.PHP_EOL. + 'Unable to find element matching the selector: ' . PHP_EOL . PHP_EOL . + "[{$selector}]" . PHP_EOL . PHP_EOL . + 'within' . PHP_EOL . PHP_EOL . "[{$this->getContent()}]." ); + return $this; } /** * Assert the response does not contain the specified element. + * * @return $this */ public function assertElementNotExists(string $selector) @@ -50,23 +63,32 @@ class TestResponse extends BaseTestResponse { $elements = $this->crawler()->filter($selector); PHPUnit::assertTrue( $elements->count() === 0, - 'Found elements matching the selector: '.PHP_EOL.PHP_EOL. - "[{$selector}]".PHP_EOL.PHP_EOL. - 'within'.PHP_EOL.PHP_EOL. + 'Found elements matching the selector: ' . PHP_EOL . PHP_EOL . + "[{$selector}]" . PHP_EOL . PHP_EOL . + 'within' . PHP_EOL . PHP_EOL . "[{$this->getContent()}]." ); + return $this; } /** * Assert the response includes a specific element containing the given 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())) { @@ -77,11 +99,12 @@ class TestResponse extends BaseTestResponse { PHPUnit::assertTrue( $matched, - 'Unable to find element of selector: '.PHP_EOL.PHP_EOL. - "[{$selector}]".PHP_EOL.PHP_EOL. - 'containing text'.PHP_EOL.PHP_EOL. - "[{$text}]".PHP_EOL.PHP_EOL. - 'within'.PHP_EOL.PHP_EOL. + '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 . + 'within' . PHP_EOL . PHP_EOL . "[{$this->getContent()}]." ); @@ -90,13 +113,21 @@ class TestResponse extends BaseTestResponse { /** * Assert the response does not include a specific element containing the given 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())) { @@ -107,11 +138,12 @@ class TestResponse extends BaseTestResponse { PHPUnit::assertTrue( !$matched, - 'Found element of selector: '.PHP_EOL.PHP_EOL. - "[{$selector}]".PHP_EOL.PHP_EOL. - 'containing text'.PHP_EOL.PHP_EOL. - "[{$text}]".PHP_EOL.PHP_EOL. - 'within'.PHP_EOL.PHP_EOL. + '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 . + 'within' . PHP_EOL . PHP_EOL . "[{$this->getContent()}]." ); @@ -120,6 +152,7 @@ class TestResponse extends BaseTestResponse { /** * Assert there's a notification within the view containing the given text. + * * @return $this */ public function assertNotificationContains(string $text) @@ -129,14 +162,15 @@ class TestResponse extends BaseTestResponse { /** * Get the escaped text pattern for the constraint. + * * @return string */ protected function getEscapedPattern(string $text) { $rawPattern = preg_quote($text, '/'); $escapedPattern = preg_quote(e($text), '/'); + return $rawPattern == $escapedPattern ? $rawPattern : "({$rawPattern}|{$escapedPattern})"; } - }