File indexing completed on 2024-12-29 05:28:07
0001 <?php 0002 /** 0003 * Zend Framework 0004 * 0005 * LICENSE 0006 * 0007 * This source file is subject to the new BSD license that is bundled 0008 * with this package in the file LICENSE.txt. 0009 * It is also available through the world-wide-web at this URL: 0010 * http://framework.zend.com/license/new-bsd 0011 * If you did not receive a copy of the license and are unable to 0012 * obtain it through the world-wide-web, please send an email 0013 * to license@zend.com so we can send you a copy immediately. 0014 * 0015 * @category Zend 0016 * @package Zend_Test 0017 * @subpackage PHPUnit 0018 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0019 * @license http://framework.zend.com/license/new-bsd New BSD License 0020 * @version $Id$ 0021 */ 0022 0023 /** 0024 * Redirection constraints 0025 * 0026 * @uses PHPUnit_Framework_Constraint 0027 * @category Zend 0028 * @package Zend_Test 0029 * @subpackage PHPUnit 0030 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) 0031 * @license http://framework.zend.com/license/new-bsd New BSD License 0032 */ 0033 class Zend_Test_PHPUnit_Constraint_Redirect34 extends PHPUnit_Framework_Constraint 0034 { 0035 /**#@+ 0036 * Assertion type constants 0037 */ 0038 const ASSERT_REDIRECT = 'assertRedirect'; 0039 const ASSERT_REDIRECT_TO = 'assertRedirectTo'; 0040 const ASSERT_REDIRECT_REGEX = 'assertRedirectRegex'; 0041 /**#@-*/ 0042 0043 /** 0044 * Current assertion type 0045 * @var string 0046 */ 0047 protected $_assertType = null; 0048 0049 /** 0050 * Available assertion types 0051 * @var array 0052 */ 0053 protected $_assertTypes = array( 0054 self::ASSERT_REDIRECT, 0055 self::ASSERT_REDIRECT_TO, 0056 self::ASSERT_REDIRECT_REGEX, 0057 ); 0058 0059 /** 0060 * Pattern to match against 0061 * @var string 0062 */ 0063 protected $_match = null; 0064 0065 /** 0066 * What is actual redirect 0067 */ 0068 protected $_actual = null; 0069 0070 /** 0071 * Whether or not assertion is negated 0072 * @var bool 0073 */ 0074 protected $_negate = false; 0075 0076 /** 0077 * Constructor; setup constraint state 0078 * 0079 * @return void 0080 */ 0081 public function __construct() 0082 { 0083 } 0084 0085 /** 0086 * Indicate negative match 0087 * 0088 * @param bool $flag 0089 * @return void 0090 */ 0091 public function setNegate($flag = true) 0092 { 0093 $this->_negate = $flag; 0094 } 0095 0096 /** 0097 * Evaluate an object to see if it fits the constraints 0098 * 0099 * @param string $other String to examine 0100 * @param null|string Assertion type 0101 * @return bool 0102 */ 0103 public function evaluate($other, $assertType = null) 0104 { 0105 if (!$other instanceof Zend_Controller_Response_Abstract) { 0106 // require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; 0107 throw new Zend_Test_PHPUnit_Constraint_Exception('Redirect constraint assertions require a response object'); 0108 } 0109 0110 if (strstr($assertType, 'Not')) { 0111 $this->setNegate(true); 0112 $assertType = str_replace('Not', '', $assertType); 0113 } 0114 0115 if (!in_array($assertType, $this->_assertTypes)) { 0116 // require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; 0117 throw new Zend_Test_PHPUnit_Constraint_Exception(sprintf('Invalid assertion type "%s" provided to %s constraint', $assertType, __CLASS__)); 0118 } 0119 0120 $this->_assertType = $assertType; 0121 0122 $response = $other; 0123 $argv = func_get_args(); 0124 $argc = func_num_args(); 0125 0126 switch ($assertType) { 0127 case self::ASSERT_REDIRECT_TO: 0128 if (3 > $argc) { 0129 // require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; 0130 throw new Zend_Test_PHPUnit_Constraint_Exception('No redirect URL provided against which to match'); 0131 } 0132 $this->_match = $match = $argv[2]; 0133 return ($this->_negate) 0134 ? $this->_notMatch($response, $match) 0135 : $this->_match($response, $match); 0136 case self::ASSERT_REDIRECT_REGEX: 0137 if (3 > $argc) { 0138 // require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; 0139 throw new Zend_Test_PHPUnit_Constraint_Exception('No pattern provided against which to match redirect'); 0140 } 0141 $this->_match = $match = $argv[2]; 0142 return ($this->_negate) 0143 ? $this->_notRegex($response, $match) 0144 : $this->_regex($response, $match); 0145 case self::ASSERT_REDIRECT: 0146 default: 0147 $headers = $response->sendHeaders(); 0148 if (isset($headers['location'])) { 0149 $redirect = $headers['location']; 0150 $redirect = str_replace('Location: ', '', $redirect); 0151 $this->_actual = $redirect; 0152 } 0153 return ($this->_negate) ? !$response->isRedirect() : $response->isRedirect(); 0154 } 0155 } 0156 0157 /** 0158 * Report Failure 0159 * 0160 * @see PHPUnit_Framework_Constraint for implementation details 0161 * @param mixed $other 0162 * @param string $description Additional message to display 0163 * @param bool $not 0164 * @return void 0165 * @throws PHPUnit_Framework_ExpectationFailedException 0166 */ 0167 public function fail($other, $description, $not = false) 0168 { 0169 // require_once 'Zend/Test/PHPUnit/Constraint/Exception.php'; 0170 switch ($this->_assertType) { 0171 case self::ASSERT_REDIRECT_TO: 0172 $failure = 'Failed asserting response redirects to "%s"'; 0173 if ($this->_negate) { 0174 $failure = 'Failed asserting response DOES NOT redirect to "%s"'; 0175 } 0176 $failure = sprintf($failure, $this->_match); 0177 if (!$this->_negate && $this->_actual) { 0178 $failure .= sprintf(PHP_EOL . 'It redirects to "%s".', $this->_actual); 0179 } 0180 break; 0181 case self::ASSERT_REDIRECT_REGEX: 0182 $failure = 'Failed asserting response redirects to URL MATCHING "%s"'; 0183 if ($this->_negate) { 0184 $failure = 'Failed asserting response DOES NOT redirect to URL MATCHING "%s"'; 0185 } 0186 $failure = sprintf($failure, $this->_match); 0187 if ($this->_actual) { 0188 $failure .= sprintf(PHP_EOL . 'It redirects to "%s".', $this->_actual); 0189 } 0190 break; 0191 case self::ASSERT_REDIRECT: 0192 default: 0193 $failure = 'Failed asserting response is a redirect'; 0194 if ($this->_negate) { 0195 $failure = 'Failed asserting response is NOT a redirect'; 0196 if ($this->_actual) { 0197 $failure .= sprintf(PHP_EOL . 'It redirects to "%s"', $this->_actual); 0198 } 0199 } 0200 break; 0201 } 0202 0203 if (!empty($description)) { 0204 $failure = $description . "\n" . $failure; 0205 } 0206 0207 throw new Zend_Test_PHPUnit_Constraint_Exception($failure); 0208 } 0209 0210 /** 0211 * Complete implementation 0212 * 0213 * @return string 0214 */ 0215 public function toString() 0216 { 0217 return ''; 0218 } 0219 0220 /** 0221 * Check to see if content is matched in selected nodes 0222 * 0223 * @param Zend_Controller_Response_HttpTestCase $response 0224 * @param string $match Content to match 0225 * @return bool 0226 */ 0227 protected function _match($response, $match) 0228 { 0229 if (!$response->isRedirect()) { 0230 return false; 0231 } 0232 0233 $headers = $response->sendHeaders(); 0234 $redirect = $headers['location']; 0235 $redirect = str_replace('Location: ', '', $redirect); 0236 $this->_actual = $redirect; 0237 0238 return ($redirect == $match); 0239 } 0240 0241 /** 0242 * Check to see if content is NOT matched in selected nodes 0243 * 0244 * @param Zend_Controller_Response_HttpTestCase $response 0245 * @param string $match 0246 * @return bool 0247 */ 0248 protected function _notMatch($response, $match) 0249 { 0250 if (!$response->isRedirect()) { 0251 return true; 0252 } 0253 0254 $headers = $response->sendHeaders(); 0255 $redirect = $headers['location']; 0256 $redirect = str_replace('Location: ', '', $redirect); 0257 $this->_actual = $redirect; 0258 0259 return ($redirect != $match); 0260 } 0261 0262 /** 0263 * Check to see if content is matched by regex in selected nodes 0264 * 0265 * @param Zend_Controller_Response_HttpTestCase $response 0266 * @param string $pattern 0267 * @return bool 0268 */ 0269 protected function _regex($response, $pattern) 0270 { 0271 if (!$response->isRedirect()) { 0272 return false; 0273 } 0274 0275 $headers = $response->sendHeaders(); 0276 $redirect = $headers['location']; 0277 $redirect = str_replace('Location: ', '', $redirect); 0278 $this->_actual = $redirect; 0279 0280 return preg_match($pattern, $redirect); 0281 } 0282 0283 /** 0284 * Check to see if content is NOT matched by regex in selected nodes 0285 * 0286 * @param Zend_Controller_Response_HttpTestCase $response 0287 * @param string $pattern 0288 * @return bool 0289 */ 0290 protected function _notRegex($response, $pattern) 0291 { 0292 if (!$response->isRedirect()) { 0293 return true; 0294 } 0295 0296 $headers = $response->sendHeaders(); 0297 $redirect = $headers['location']; 0298 $redirect = str_replace('Location: ', '', $redirect); 0299 $this->_actual = $redirect; 0300 0301 return !preg_match($pattern, $redirect); 0302 } 0303 }