mirror of
				https://github.com/BookStackApp/BookStack.git
				synced 2025-11-03 02:13:16 +03:00 
			
		
		
		
	Created modified TestResponse so we can use DOM operations in new Testcases as we move away from the BrowserKit tests.
		
			
				
	
	
		
			142 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php namespace Tests;
 | 
						|
 | 
						|
use \Illuminate\Foundation\Testing\TestResponse as BaseTestResponse;
 | 
						|
use Symfony\Component\DomCrawler\Crawler;
 | 
						|
use PHPUnit\Framework\Assert as PHPUnit;
 | 
						|
 | 
						|
/**
 | 
						|
 * Class TestResponse
 | 
						|
 * Custom extension of the default Laravel TestResponse class.
 | 
						|
 * @package Tests
 | 
						|
 */
 | 
						|
class TestResponse extends BaseTestResponse {
 | 
						|
 | 
						|
    protected $crawlerInstance;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the DOM Crawler for the response content.
 | 
						|
     * @return Crawler
 | 
						|
     */
 | 
						|
    protected function crawler()
 | 
						|
    {
 | 
						|
        if (!is_object($this->crawlerInstance)) {
 | 
						|
            $this->crawlerInstance = new Crawler($this->getContent());
 | 
						|
        }
 | 
						|
        return $this->crawlerInstance;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Assert the response contains the specified element.
 | 
						|
     * @param string $selector
 | 
						|
     * @return $this
 | 
						|
     */
 | 
						|
    public function assertElementExists(string $selector)
 | 
						|
    {
 | 
						|
        $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.
 | 
						|
            "[{$this->getContent()}]."
 | 
						|
        );
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Assert the response does not contain the specified element.
 | 
						|
     * @param string $selector
 | 
						|
     * @return $this
 | 
						|
     */
 | 
						|
    public function assertElementNotExists(string $selector)
 | 
						|
    {
 | 
						|
        $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.
 | 
						|
            "[{$this->getContent()}]."
 | 
						|
        );
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Assert the response includes a specific element containing the given text.
 | 
						|
     * @param string $selector
 | 
						|
     * @param string $text
 | 
						|
     * @return $this
 | 
						|
     */
 | 
						|
    public function assertElementContains(string $selector, string $text)
 | 
						|
    {
 | 
						|
        $elements = $this->crawler()->filter($selector);
 | 
						|
        $matched = false;
 | 
						|
        $pattern = $this->getEscapedPattern($text);
 | 
						|
        foreach ($elements as $element) {
 | 
						|
            $element = new Crawler($element);
 | 
						|
            if (preg_match("/$pattern/i", $element->html())) {
 | 
						|
                $matched = true;
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        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.
 | 
						|
            "[{$this->getContent()}]."
 | 
						|
        );
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Assert the response does not include a specific element containing the given text.
 | 
						|
     * @param string $selector
 | 
						|
     * @param string $text
 | 
						|
     * @return $this
 | 
						|
     */
 | 
						|
    public function assertElementNotContains(string $selector, string $text)
 | 
						|
    {
 | 
						|
        $elements = $this->crawler()->filter($selector);
 | 
						|
        $matched = false;
 | 
						|
        $pattern = $this->getEscapedPattern($text);
 | 
						|
        foreach ($elements as $element) {
 | 
						|
            $element = new Crawler($element);
 | 
						|
            if (preg_match("/$pattern/i", $element->html())) {
 | 
						|
                $matched = true;
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        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.
 | 
						|
            "[{$this->getContent()}]."
 | 
						|
        );
 | 
						|
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the escaped text pattern for the constraint.
 | 
						|
     * @param  string  $text
 | 
						|
     * @return string
 | 
						|
     */
 | 
						|
    protected function getEscapedPattern($text)
 | 
						|
    {
 | 
						|
        $rawPattern = preg_quote($text, '/');
 | 
						|
        $escapedPattern = preg_quote(e($text), '/');
 | 
						|
        return $rawPattern == $escapedPattern
 | 
						|
            ? $rawPattern : "({$rawPattern}|{$escapedPattern})";
 | 
						|
    }
 | 
						|
 | 
						|
}
 |