web/lib/Zend/Test/PHPUnit/ControllerTestCase.php
changeset 64 162c1de6545a
parent 19 1c2f13fd785c
child 68 ecaf28ffe26e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/Zend/Test/PHPUnit/ControllerTestCase.php	Fri Mar 11 15:05:35 2011 +0100
@@ -0,0 +1,1182 @@
+<?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-2010 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license    http://framework.zend.com/license/new-bsd     New BSD License
+ * @version    $Id: ControllerTestCase.php 22291 2010-05-25 15:52:09Z bradley.holt $
+ */
+
+/** @see PHPUnit_Framework_TestCase */
+require_once 'PHPUnit/Framework/TestCase.php';
+
+/** @see PHPUnit_Runner_Version */
+require_once 'PHPUnit/Runner/Version.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-2010 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;
+    }
+
+    /**
+     * 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;
+            }
+        }
+    }
+}