<?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-2014 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-2014 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_HttpTestCase */ 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_HttpTestCase */ 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; } } } }