/**
* 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());
/**
* Assert the response contains the specified element.
- * @param string $selector
* @return $this
*/
public function assertElementExists(string $selector)
/**
* Assert the response does not contain the specified element.
- * @param string $selector
* @return $this
*/
public function assertElementNotExists(string $selector)
/**
* 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())) {
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.
/**
* 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())) {
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.
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), '/');