123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- <?php
- /*
- * This file is part of the Mink package.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Behat\Mink\Exception;
- use Behat\Mink\Driver\DriverInterface;
- use Behat\Mink\Session;
- /**
- * Exception thrown for failed expectations.
- *
- * Some specialized child classes are available to customize the error rendering.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
- class ExpectationException extends Exception
- {
- private $session;
- private $driver;
- /**
- * Initializes exception.
- *
- * @param string $message optional message
- * @param DriverInterface|Session $driver driver instance (or session for BC)
- * @param \Exception|null $exception expectation exception
- */
- public function __construct($message, $driver, \Exception $exception = null)
- {
- if ($driver instanceof Session) {
- @trigger_error('Passing a Session object to the ExpectationException constructor is deprecated as of Mink 1.7. Pass the driver instead.', E_USER_DEPRECATED);
- $this->session = $driver;
- $this->driver = $driver->getDriver();
- } elseif (!$driver instanceof DriverInterface) {
- // Trigger an exception as we cannot typehint a disjunction
- throw new \InvalidArgumentException('The ExpectationException constructor expects a DriverInterface or a Session.');
- } else {
- $this->driver = $driver;
- }
- if (!$message && null !== $exception) {
- $message = $exception->getMessage();
- }
- parent::__construct($message, 0, $exception);
- }
- /**
- * Returns exception message with additional context info.
- *
- * @return string
- */
- public function __toString()
- {
- try {
- $pageText = $this->pipeString($this->trimString($this->getContext())."\n");
- $string = sprintf("%s\n\n%s%s", $this->getMessage(), $this->getResponseInfo(), $pageText);
- } catch (\Exception $e) {
- return $this->getMessage();
- }
- return $string;
- }
- /**
- * Gets the context rendered for this exception.
- *
- * @return string
- */
- protected function getContext()
- {
- return $this->trimBody($this->driver->getContent());
- }
- /**
- * Returns driver.
- *
- * @return DriverInterface
- */
- protected function getDriver()
- {
- return $this->driver;
- }
- /**
- * Returns exception session.
- *
- * @return Session
- *
- * @deprecated since 1.7, to be removed in 2.0. Use getDriver and the driver API instead.
- */
- protected function getSession()
- {
- if (null === $this->session) {
- throw new \LogicException(sprintf('The deprecated method %s cannot be used when passing a driver in the constructor', __METHOD__));
- }
- @trigger_error(sprintf('The method %s is deprecated as of Mink 1.7 and will be removed in 2.0. Use getDriver and the driver API instead.'));
- return $this->session;
- }
- /**
- * Prepends every line in a string with pipe (|).
- *
- * @param string $string
- *
- * @return string
- */
- protected function pipeString($string)
- {
- return '| '.strtr($string, array("\n" => "\n| "));
- }
- /**
- * Removes response header/footer, letting only <body /> content.
- *
- * @param string $string response content
- *
- * @return string
- */
- protected function trimBody($string)
- {
- $string = preg_replace(array('/^.*<body>/s', '/<\/body>.*$/s'), array('<body>', '</body>'), $string);
- return $string;
- }
- /**
- * Trims string to specified number of chars.
- *
- * @param string $string response content
- * @param int $count trim count
- *
- * @return string
- */
- protected function trimString($string, $count = 1000)
- {
- $string = trim($string);
- if ($count < mb_strlen($string)) {
- return mb_substr($string, 0, $count - 3).'...';
- }
- return $string;
- }
- /**
- * Returns response information string.
- *
- * @return string
- */
- protected function getResponseInfo()
- {
- $driver = basename(str_replace('\\', '/', get_class($this->driver)));
- $info = '+--[ ';
- try {
- $info .= 'HTTP/1.1 '.$this->driver->getStatusCode().' | ';
- } catch (UnsupportedDriverActionException $e) {
- // Ignore the status code when not supported
- }
- $info .= $this->driver->getCurrentUrl().' | '.$driver." ]\n|\n";
- return $info;
- }
- }
|