1217 Zeilen
39 KiB
PHP
1217 Zeilen
39 KiB
PHP
<?php
|
|
/**
|
|
* Zend Framework
|
|
*
|
|
* LICENSE
|
|
*
|
|
* This source file is subject to the new BSD license that is bundled
|
|
* with this package in the file LICENSE.txt.
|
|
* It is also available through the world-wide-web at this URL:
|
|
* http://framework.zend.com/license/new-bsd
|
|
* If you did not receive a copy of the license and are unable to
|
|
* obtain it through the world-wide-web, please send an email
|
|
* to license@zend.com so we can send you a copy immediately.
|
|
*
|
|
* @category Zend
|
|
* @package Zend_Test
|
|
* @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
* @version $Id$
|
|
*/
|
|
|
|
/** @see PHPUnit_Runner_Version */
|
|
require_once 'PHPUnit/Runner/Version.php';
|
|
|
|
/**
|
|
* Depending on version, include the proper PHPUnit support
|
|
* @see PHPUnit_Autoload
|
|
*/
|
|
require_once (version_compare(PHPUnit_Runner_Version::id(), '3.5.0', '>=')) ? 'PHPUnit/Autoload.php' : 'PHPUnit/Framework.php';
|
|
|
|
/** @see Zend_Controller_Front */
|
|
require_once 'Zend/Controller/Front.php';
|
|
|
|
/** @see Zend_Controller_Action_HelperBroker */
|
|
require_once 'Zend/Controller/Action/HelperBroker.php';
|
|
|
|
/** @see Zend_Layout */
|
|
require_once 'Zend/Layout.php';
|
|
|
|
/** @see Zend_Session */
|
|
require_once 'Zend/Session.php';
|
|
|
|
/** @see Zend_Registry */
|
|
require_once 'Zend/Registry.php';
|
|
|
|
/**
|
|
* Functional testing scaffold for MVC applications
|
|
*
|
|
* @uses PHPUnit_Framework_TestCase
|
|
* @category Zend
|
|
* @package Zend_Test
|
|
* @subpackage PHPUnit
|
|
* @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
|
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
|
*/
|
|
abstract class Zend_Test_PHPUnit_ControllerTestCase extends PHPUnit_Framework_TestCase
|
|
{
|
|
/**
|
|
* @var mixed Bootstrap file path or callback
|
|
*/
|
|
public $bootstrap;
|
|
|
|
/**
|
|
* @var Zend_Controller_Front
|
|
*/
|
|
protected $_frontController;
|
|
|
|
/**
|
|
* @var Zend_Dom_Query
|
|
*/
|
|
protected $_query;
|
|
|
|
/**
|
|
* @var Zend_Controller_Request_Abstract
|
|
*/
|
|
protected $_request;
|
|
|
|
/**
|
|
* @var Zend_Controller_Response_Abstract
|
|
*/
|
|
protected $_response;
|
|
|
|
/**
|
|
* XPath namespaces
|
|
* @var array
|
|
*/
|
|
protected $_xpathNamespaces = array();
|
|
|
|
/**
|
|
* Overloading: prevent overloading to special properties
|
|
*
|
|
* @param string $name
|
|
* @param mixed $value
|
|
* @return void
|
|
*/
|
|
public function __set($name, $value)
|
|
{
|
|
if (in_array($name, array('request', 'response', 'frontController'))) {
|
|
require_once 'Zend/Exception.php';
|
|
throw new Zend_Exception(sprintf('Setting %s object manually is not allowed', $name));
|
|
}
|
|
$this->$name = $value;
|
|
}
|
|
|
|
/**
|
|
* Overloading for common properties
|
|
*
|
|
* Provides overloading for request, response, and frontController objects.
|
|
*
|
|
* @param mixed $name
|
|
* @return void
|
|
*/
|
|
public function __get($name)
|
|
{
|
|
switch ($name) {
|
|
case 'request':
|
|
return $this->getRequest();
|
|
case 'response':
|
|
return $this->getResponse();
|
|
case 'frontController':
|
|
return $this->getFrontController();
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Set up MVC app
|
|
*
|
|
* Calls {@link bootstrap()} by default
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function setUp()
|
|
{
|
|
$this->bootstrap();
|
|
}
|
|
|
|
/**
|
|
* Bootstrap the front controller
|
|
*
|
|
* Resets the front controller, and then bootstraps it.
|
|
*
|
|
* If {@link $bootstrap} is a callback, executes it; if it is a file, it include's
|
|
* it. When done, sets the test case request and response objects into the
|
|
* front controller.
|
|
*
|
|
* @return void
|
|
*/
|
|
final public function bootstrap()
|
|
{
|
|
$this->reset();
|
|
if (null !== $this->bootstrap) {
|
|
if ($this->bootstrap instanceof Zend_Application) {
|
|
$this->bootstrap->bootstrap();
|
|
$this->_frontController = $this->bootstrap->getBootstrap()->getResource('frontcontroller');
|
|
} elseif (is_callable($this->bootstrap)) {
|
|
call_user_func($this->bootstrap);
|
|
} elseif (is_string($this->bootstrap)) {
|
|
require_once 'Zend/Loader.php';
|
|
if (Zend_Loader::isReadable($this->bootstrap)) {
|
|
include $this->bootstrap;
|
|
}
|
|
}
|
|
}
|
|
$this->frontController
|
|
->setRequest($this->getRequest())
|
|
->setResponse($this->getResponse());
|
|
}
|
|
|
|
/**
|
|
* Dispatch the MVC
|
|
*
|
|
* If a URL is provided, sets it as the request URI in the request object.
|
|
* Then sets test case request and response objects in front controller,
|
|
* disables throwing exceptions, and disables returning the response.
|
|
* Finally, dispatches the front controller.
|
|
*
|
|
* @param string|null $url
|
|
* @return void
|
|
*/
|
|
public function dispatch($url = null)
|
|
{
|
|
// redirector should not exit
|
|
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
|
|
$redirector->setExit(false);
|
|
|
|
// json helper should not exit
|
|
$json = Zend_Controller_Action_HelperBroker::getStaticHelper('json');
|
|
$json->suppressExit = true;
|
|
|
|
$request = $this->getRequest();
|
|
if (null !== $url) {
|
|
$request->setRequestUri($url);
|
|
}
|
|
$request->setPathInfo(null);
|
|
|
|
$controller = $this->getFrontController();
|
|
$this->frontController
|
|
->setRequest($request)
|
|
->setResponse($this->getResponse())
|
|
->throwExceptions(false)
|
|
->returnResponse(false);
|
|
|
|
if ($this->bootstrap instanceof Zend_Application) {
|
|
$this->bootstrap->run();
|
|
} else {
|
|
$this->frontController->dispatch();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Reset MVC state
|
|
*
|
|
* Creates new request/response objects, resets the front controller
|
|
* instance, and resets the action helper broker.
|
|
*
|
|
* @todo Need to update Zend_Layout to add a resetInstance() method
|
|
* @return void
|
|
*/
|
|
public function reset()
|
|
{
|
|
$_SESSION = array();
|
|
$_GET = array();
|
|
$_POST = array();
|
|
$_COOKIE = array();
|
|
$this->resetRequest();
|
|
$this->resetResponse();
|
|
Zend_Layout::resetMvcInstance();
|
|
Zend_Controller_Action_HelperBroker::resetHelpers();
|
|
$this->frontController->resetInstance();
|
|
Zend_Session::$_unitTestEnabled = true;
|
|
}
|
|
|
|
/**
|
|
* Rest all view placeholders
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function _resetPlaceholders()
|
|
{
|
|
$registry = Zend_Registry::getInstance();
|
|
$remove = array();
|
|
foreach ($registry as $key => $value) {
|
|
if (strstr($key, '_View_')) {
|
|
$remove[] = $key;
|
|
}
|
|
}
|
|
|
|
foreach ($remove as $key) {
|
|
unset($registry[$key]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Reset the request object
|
|
*
|
|
* Useful for test cases that need to test multiple trips to the server.
|
|
*
|
|
* @return Zend_Test_PHPUnit_ControllerTestCase
|
|
*/
|
|
public function resetRequest()
|
|
{
|
|
if ($this->_request instanceof Zend_Controller_Request_HttpTestCase) {
|
|
$this->_request->clearQuery()
|
|
->clearPost();
|
|
}
|
|
$this->_request = null;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Reset the response object
|
|
*
|
|
* Useful for test cases that need to test multiple trips to the server.
|
|
*
|
|
* @return Zend_Test_PHPUnit_ControllerTestCase
|
|
*/
|
|
public function resetResponse()
|
|
{
|
|
$this->_response = null;
|
|
$this->_resetPlaceholders();
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Assert against DOM selection
|
|
*
|
|
* @param string $path CSS selector path
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertQuery($path, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against DOM selection
|
|
*
|
|
* @param string $path CSS selector path
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotQuery($path, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against DOM selection; node should contain content
|
|
*
|
|
* @param string $path CSS selector path
|
|
* @param string $match content that should be contained in matched nodes
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertQueryContentContains($path, $match, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $match)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against DOM selection; node should NOT contain content
|
|
*
|
|
* @param string $path CSS selector path
|
|
* @param string $match content that should NOT be contained in matched nodes
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotQueryContentContains($path, $match, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $match)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against DOM selection; node should match content
|
|
*
|
|
* @param string $path CSS selector path
|
|
* @param string $pattern Pattern that should be contained in matched nodes
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertQueryContentRegex($path, $pattern, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against DOM selection; node should NOT match content
|
|
*
|
|
* @param string $path CSS selector path
|
|
* @param string $pattern pattern that should NOT be contained in matched nodes
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotQueryContentRegex($path, $pattern, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against DOM selection; should contain exact number of nodes
|
|
*
|
|
* @param string $path CSS selector path
|
|
* @param string $count Number of nodes that should match
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertQueryCount($path, $count, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $count)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against DOM selection; should NOT contain exact number of nodes
|
|
*
|
|
* @param string $path CSS selector path
|
|
* @param string $count Number of nodes that should NOT match
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotQueryCount($path, $count, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $count)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against DOM selection; should contain at least this number of nodes
|
|
*
|
|
* @param string $path CSS selector path
|
|
* @param string $count Minimum number of nodes that should match
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertQueryCountMin($path, $count, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $count)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against DOM selection; should contain no more than this number of nodes
|
|
*
|
|
* @param string $path CSS selector path
|
|
* @param string $count Maximum number of nodes that should match
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertQueryCountMax($path, $count, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $count)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Register XPath namespaces
|
|
*
|
|
* @param array $xpathNamespaces
|
|
* @return void
|
|
*/
|
|
public function registerXpathNamespaces($xpathNamespaces)
|
|
{
|
|
$this->_xpathNamespaces = $xpathNamespaces;
|
|
}
|
|
|
|
/**
|
|
* Assert against XPath selection
|
|
*
|
|
* @param string $path XPath path
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertXpath($path, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$constraint->registerXpathNamespaces($this->_xpathNamespaces);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against XPath selection
|
|
*
|
|
* @param string $path XPath path
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotXpath($path, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$constraint->registerXpathNamespaces($this->_xpathNamespaces);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against XPath selection; node should contain content
|
|
*
|
|
* @param string $path XPath path
|
|
* @param string $match content that should be contained in matched nodes
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertXpathContentContains($path, $match, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$constraint->registerXpathNamespaces($this->_xpathNamespaces);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $match)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against XPath selection; node should NOT contain content
|
|
*
|
|
* @param string $path XPath path
|
|
* @param string $match content that should NOT be contained in matched nodes
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotXpathContentContains($path, $match, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$constraint->registerXpathNamespaces($this->_xpathNamespaces);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $match)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against XPath selection; node should match content
|
|
*
|
|
* @param string $path XPath path
|
|
* @param string $pattern Pattern that should be contained in matched nodes
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertXpathContentRegex($path, $pattern, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$constraint->registerXpathNamespaces($this->_xpathNamespaces);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against XPath selection; node should NOT match content
|
|
*
|
|
* @param string $path XPath path
|
|
* @param string $pattern pattern that should NOT be contained in matched nodes
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotXpathContentRegex($path, $pattern, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$constraint->registerXpathNamespaces($this->_xpathNamespaces);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $pattern)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against XPath selection; should contain exact number of nodes
|
|
*
|
|
* @param string $path XPath path
|
|
* @param string $count Number of nodes that should match
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertXpathCount($path, $count, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$constraint->registerXpathNamespaces($this->_xpathNamespaces);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $count)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against XPath selection; should NOT contain exact number of nodes
|
|
*
|
|
* @param string $path XPath path
|
|
* @param string $count Number of nodes that should NOT match
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotXpathCount($path, $count, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$constraint->registerXpathNamespaces($this->_xpathNamespaces);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $count)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against XPath selection; should contain at least this number of nodes
|
|
*
|
|
* @param string $path XPath path
|
|
* @param string $count Minimum number of nodes that should match
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertXpathCountMin($path, $count, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$constraint->registerXpathNamespaces($this->_xpathNamespaces);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $count)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert against XPath selection; should contain no more than this number of nodes
|
|
*
|
|
* @param string $path XPath path
|
|
* @param string $count Maximum number of nodes that should match
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertXpathCountMax($path, $count, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/DomQuery.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_DomQuery($path);
|
|
$constraint->registerXpathNamespaces($this->_xpathNamespaces);
|
|
$content = $this->response->outputBody();
|
|
if (!$constraint->evaluate($content, __FUNCTION__, $count)) {
|
|
$constraint->fail($path, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that response is a redirect
|
|
*
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertRedirect($message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_Redirect();
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that response is NOT a redirect
|
|
*
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotRedirect($message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_Redirect();
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that response redirects to given URL
|
|
*
|
|
* @param string $url
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertRedirectTo($url, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_Redirect();
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $url)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that response does not redirect to given URL
|
|
*
|
|
* @param string $url
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotRedirectTo($url, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_Redirect();
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $url)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that redirect location matches pattern
|
|
*
|
|
* @param string $pattern
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertRedirectRegex($pattern, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_Redirect();
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $pattern)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that redirect location does not match pattern
|
|
*
|
|
* @param string $pattern
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotRedirectRegex($pattern, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/Redirect.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_Redirect();
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $pattern)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert response code
|
|
*
|
|
* @param int $code
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertResponseCode($code, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader();
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $code)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert response code
|
|
*
|
|
* @param int $code
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotResponseCode($code, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader();
|
|
$constraint->setNegate(true);
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $code)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert response header exists
|
|
*
|
|
* @param string $header
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertHeader($header, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader();
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $header)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert response header does not exist
|
|
*
|
|
* @param string $header
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotHeader($header, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader();
|
|
$constraint->setNegate(true);
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $header)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert response header exists and contains the given string
|
|
*
|
|
* @param string $header
|
|
* @param string $match
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertHeaderContains($header, $match, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader();
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $header, $match)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert response header does not exist and/or does not contain the given string
|
|
*
|
|
* @param string $header
|
|
* @param string $match
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotHeaderContains($header, $match, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader();
|
|
$constraint->setNegate(true);
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $header, $match)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert response header exists and matches the given pattern
|
|
*
|
|
* @param string $header
|
|
* @param string $pattern
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertHeaderRegex($header, $pattern, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader();
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $header, $pattern)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert response header does not exist and/or does not match the given regex
|
|
*
|
|
* @param string $header
|
|
* @param string $pattern
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotHeaderRegex($header, $pattern, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
require_once 'Zend/Test/PHPUnit/Constraint/ResponseHeader.php';
|
|
$constraint = new Zend_Test_PHPUnit_Constraint_ResponseHeader();
|
|
$constraint->setNegate(true);
|
|
$response = $this->response;
|
|
if (!$constraint->evaluate($response, __FUNCTION__, $header, $pattern)) {
|
|
$constraint->fail($response, $message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that the last handled request used the given module
|
|
*
|
|
* @param string $module
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertModule($module, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
if ($module != $this->request->getModuleName()) {
|
|
$msg = sprintf('Failed asserting last module used <"%s"> was "%s"',
|
|
$this->request->getModuleName(),
|
|
$module
|
|
);
|
|
if (!empty($message)) {
|
|
$msg = $message . "\n" . $msg;
|
|
}
|
|
$this->fail($msg);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that the last handled request did NOT use the given module
|
|
*
|
|
* @param string $module
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotModule($module, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
if ($module == $this->request->getModuleName()) {
|
|
$msg = sprintf('Failed asserting last module used was NOT "%s"', $module);
|
|
if (!empty($message)) {
|
|
$msg = $message . "\n" . $msg;
|
|
}
|
|
$this->fail($msg);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that the last handled request used the given controller
|
|
*
|
|
* @param string $controller
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertController($controller, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
if ($controller != $this->request->getControllerName()) {
|
|
$msg = sprintf('Failed asserting last controller used <"%s"> was "%s"',
|
|
$this->request->getControllerName(),
|
|
$controller
|
|
);
|
|
if (!empty($message)) {
|
|
$msg = $message . "\n" . $msg;
|
|
}
|
|
$this->fail($msg);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that the last handled request did NOT use the given controller
|
|
*
|
|
* @param string $controller
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotController($controller, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
if ($controller == $this->request->getControllerName()) {
|
|
$msg = sprintf('Failed asserting last controller used <"%s"> was NOT "%s"',
|
|
$this->request->getControllerName(),
|
|
$controller
|
|
);
|
|
if (!empty($message)) {
|
|
$msg = $message . "\n" . $msg;
|
|
}
|
|
$this->fail($msg);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that the last handled request used the given action
|
|
*
|
|
* @param string $action
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertAction($action, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
if ($action != $this->request->getActionName()) {
|
|
$msg = sprintf('Failed asserting last action used <"%s"> was "%s"', $this->request->getActionName(), $action);
|
|
if (!empty($message)) {
|
|
$msg = $message . "\n" . $msg;
|
|
}
|
|
$this->fail($msg);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that the last handled request did NOT use the given action
|
|
*
|
|
* @param string $action
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotAction($action, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
if ($action == $this->request->getActionName()) {
|
|
$msg = sprintf('Failed asserting last action used <"%s"> was NOT "%s"', $this->request->getActionName(), $action);
|
|
if (!empty($message)) {
|
|
$msg = $message . "\n" . $msg;
|
|
}
|
|
$this->fail($msg);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that the specified route was used
|
|
*
|
|
* @param string $route
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertRoute($route, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
$router = $this->frontController->getRouter();
|
|
if ($route != $router->getCurrentRouteName()) {
|
|
$msg = sprintf('Failed asserting matched route was "%s", actual route is %s',
|
|
$route,
|
|
$router->getCurrentRouteName()
|
|
);
|
|
if (!empty($message)) {
|
|
$msg = $message . "\n" . $msg;
|
|
}
|
|
$this->fail($msg);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert that the route matched is NOT as specified
|
|
*
|
|
* @param string $route
|
|
* @param string $message
|
|
* @return void
|
|
*/
|
|
public function assertNotRoute($route, $message = '')
|
|
{
|
|
$this->_incrementAssertionCount();
|
|
$router = $this->frontController->getRouter();
|
|
if ($route == $router->getCurrentRouteName()) {
|
|
$msg = sprintf('Failed asserting route matched was NOT "%s"', $route);
|
|
if (!empty($message)) {
|
|
$msg = $message . "\n" . $msg;
|
|
}
|
|
$this->fail($msg);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retrieve front controller instance
|
|
*
|
|
* @return Zend_Controller_Front
|
|
*/
|
|
public function getFrontController()
|
|
{
|
|
if (null === $this->_frontController) {
|
|
$this->_frontController = Zend_Controller_Front::getInstance();
|
|
}
|
|
return $this->_frontController;
|
|
}
|
|
|
|
/**
|
|
* Retrieve test case request object
|
|
*
|
|
* @return Zend_Controller_Request_Abstract
|
|
*/
|
|
public function getRequest()
|
|
{
|
|
if (null === $this->_request) {
|
|
require_once 'Zend/Controller/Request/HttpTestCase.php';
|
|
$this->_request = new Zend_Controller_Request_HttpTestCase;
|
|
}
|
|
return $this->_request;
|
|
}
|
|
|
|
/**
|
|
* Retrieve test case response object
|
|
*
|
|
* @return Zend_Controller_Response_Abstract
|
|
*/
|
|
public function getResponse()
|
|
{
|
|
if (null === $this->_response) {
|
|
require_once 'Zend/Controller/Response/HttpTestCase.php';
|
|
$this->_response = new Zend_Controller_Response_HttpTestCase;
|
|
}
|
|
return $this->_response;
|
|
}
|
|
|
|
/**
|
|
* Retrieve DOM query object
|
|
*
|
|
* @return Zend_Dom_Query
|
|
*/
|
|
public function getQuery()
|
|
{
|
|
if (null === $this->_query) {
|
|
require_once 'Zend/Dom/Query.php';
|
|
$this->_query = new Zend_Dom_Query;
|
|
}
|
|
return $this->_query;
|
|
}
|
|
|
|
/**
|
|
* URL Helper
|
|
*
|
|
* @param array $urlOptions
|
|
* @param string $name
|
|
* @param bool $reset
|
|
* @param bool $encode
|
|
*/
|
|
public function url($urlOptions = array(), $name = null, $reset = false, $encode = true)
|
|
{
|
|
$frontController = $this->getFrontController();
|
|
$router = $frontController->getRouter();
|
|
if (!$router instanceof Zend_Controller_Router_Rewrite) {
|
|
throw new Exception('This url helper utility function only works when the router is of type Zend_Controller_Router_Rewrite');
|
|
}
|
|
if (count($router->getRoutes()) == 0) {
|
|
$router->addDefaultRoutes();
|
|
}
|
|
return $router->assemble($urlOptions, $name, $reset, $encode);
|
|
}
|
|
|
|
public function urlizeOptions($urlOptions, $actionControllerModuleOnly = true)
|
|
{
|
|
$ccToDash = new Zend_Filter_Word_CamelCaseToDash();
|
|
foreach ($urlOptions as $n => $v) {
|
|
if (in_array($n, array('action', 'controller', 'module'))) {
|
|
$urlOptions[$n] = $ccToDash->filter($v);
|
|
}
|
|
}
|
|
return $urlOptions;
|
|
}
|
|
|
|
/**
|
|
* Increment assertion count
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function _incrementAssertionCount()
|
|
{
|
|
$stack = debug_backtrace();
|
|
foreach (debug_backtrace() as $step) {
|
|
if (isset($step['object'])
|
|
&& $step['object'] instanceof PHPUnit_Framework_TestCase
|
|
) {
|
|
if (version_compare(PHPUnit_Runner_Version::id(), '3.3.0', 'lt')) {
|
|
break;
|
|
} elseif (version_compare(PHPUnit_Runner_Version::id(), '3.3.3', 'lt')) {
|
|
$step['object']->incrementAssertionCounter();
|
|
} else {
|
|
$step['object']->addToAssertionCount(1);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|