diff options
Diffstat (limited to 'zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/test')
2 files changed, 278 insertions, 0 deletions
| diff --git a/zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/test/PostRedirectGetTest.php b/zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/test/PostRedirectGetTest.php new file mode 100644 index 0000000..d0538d5 --- /dev/null +++ b/zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/test/PostRedirectGetTest.php @@ -0,0 +1,258 @@ +<?php +/** + * @link      http://github.com/zendframework/zend-mvc-plugin-prg for the canonical source repository + * @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com) + * @license   http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace ZendTest\Mvc\Plugin\Prg; + +use PHPUnit_Framework_TestCase as TestCase; +use Zend\Http\Request; +use Zend\Http\Response; +use Zend\Mvc\MvcEvent; +use Zend\Mvc\ModuleRouteListener; +use Zend\Mvc\Plugin\Prg\PostRedirectGet; +use Zend\Router\Exception\RuntimeException; +use Zend\Router\Http\Literal as LiteralRoute; +use Zend\Router\Http\Segment as SegmentRoute; +use Zend\Router\RouteMatch; +use Zend\Router\SimpleRouteStack; +use Zend\Router\Http\TreeRouteStack; +use Zend\Stdlib\Parameters; + +class PostRedirectGetTest extends TestCase +{ +    public $controller; +    public $event; +    public $request; +    public $response; + +    public function setUp() +    { +        $router = new TreeRouteStack; +        $router->addRoute('home', LiteralRoute::factory([ +            'route'    => '/', +            'defaults' => [ +                'controller' => TestAsset\SampleController::class, +            ] +        ])); + +        $router->addRoute('sub', SegmentRoute::factory([ +            'route' => '/foo/:param', +            'defaults' => [ +                'param' => 1 +            ] +        ])); + +        $router->addRoute('ctl', SegmentRoute::factory([ +            'route' => '/ctl/:controller', +            'defaults' => [ +                '__NAMESPACE__' => 'ZendTest\Mvc\Plugin\Prg\TestAsset', +                'controller' => 'sample' +            ] +        ])); + +        $this->controller = new TestAsset\SampleController(); +        $this->request    = new Request(); +        $this->event      = new MvcEvent(); +        $this->routeMatch = new RouteMatch(['controller' => 'controller-sample', 'action' => 'postPage']); + +        $this->event->setRequest($this->request); +        $this->event->setRouteMatch($this->routeMatch); +        $this->event->setRouter($router); + +        $this->controller->setEvent($this->event); + +        $this->plugin = new PostRedirectGet(); +        $this->plugin->setController($this->controller); +    } + +    public function testReturnsFalseOnInitialGet() +    { +        $this->controller->dispatch($this->request, $this->response); + +        $plugin = $this->plugin; +        $this->assertFalse($plugin('home')); +    } + +    public function testRedirectsToUrlOnPost() +    { +        $this->request->setMethod('POST'); +        $this->request->setPost(new Parameters([ +            'postval1' => 'value' +        ])); +        $this->controller->dispatch($this->request, $this->response); + +        $plugin       = $this->plugin; +        $prgResultUrl = $plugin('/test/getPage', true); + +        $this->assertInstanceOf('Zend\Http\Response', $prgResultUrl); +        $this->assertTrue($prgResultUrl->getHeaders()->has('Location')); +        $this->assertEquals('/test/getPage', $prgResultUrl->getHeaders()->get('Location')->getUri()); +        $this->assertEquals(303, $prgResultUrl->getStatusCode()); +    } + +    public function testRedirectsToRouteOnPost() +    { +        $this->request->setMethod('POST'); +        $this->request->setPost(new Parameters([ +            'postval1' => 'value1' +        ])); +        $this->controller->dispatch($this->request, $this->response); + +        $plugin         = $this->plugin; +        $prgResultRoute = $plugin('home'); + +        $this->assertInstanceOf('Zend\Http\Response', $prgResultRoute); +        $this->assertTrue($prgResultRoute->getHeaders()->has('Location')); +        $this->assertEquals('/', $prgResultRoute->getHeaders()->get('Location')->getUri()); +        $this->assertEquals(303, $prgResultRoute->getStatusCode()); +    } + +    public function testReturnsPostOnRedirectGet() +    { +        $params = [ +            'postval1' => 'value1' +        ]; +        $this->request->setMethod('POST'); +        $this->request->setPost(new Parameters($params)); +        $this->controller->dispatch($this->request, $this->response); + +        $plugin         = $this->plugin; +        $prgResultRoute = $plugin('home'); + +        $this->assertInstanceOf('Zend\Http\Response', $prgResultRoute); +        $this->assertTrue($prgResultRoute->getHeaders()->has('Location')); +        $this->assertEquals('/', $prgResultRoute->getHeaders()->get('Location')->getUri()); +        $this->assertEquals(303, $prgResultRoute->getStatusCode()); + +        // Do GET +        $this->request = new Request(); +        $this->controller->dispatch($this->request, $this->response); +        $prgResult = $plugin('home'); + +        $this->assertEquals($params, $prgResult); + +        // Do GET again to make sure data is empty +        $this->request = new Request(); +        $this->controller->dispatch($this->request, $this->response); +        $prgResult = $plugin('home'); + +        $this->assertFalse($prgResult); +    } + +    public function testThrowsExceptionOnRouteWithoutRouter() +    { +        $controller = $this->controller; +        $controller = $controller->getEvent()->setRouter(new SimpleRouteStack); + +        $this->request->setMethod('POST'); +        $this->request->setPost(new Parameters([ +            'postval1' => 'value' +        ])); +        $this->controller->dispatch($this->request, $this->response); + +        $this->setExpectedException(RuntimeException::class); +        $plugin         = $this->plugin; +        $prgResultRoute = $plugin('some/route'); +    } + +    public function testNullRouteUsesMatchedRouteName() +    { +        $this->controller->getEvent()->getRouteMatch()->setMatchedRouteName('home'); + +        $this->request->setMethod('POST'); +        $this->request->setPost(new Parameters([ +            'postval1' => 'value1' +        ])); +        $this->controller->dispatch($this->request, $this->response); + +        $plugin         = $this->plugin; +        $prgResultRoute = $plugin(); + +        $this->assertInstanceOf('Zend\Http\Response', $prgResultRoute); +        $this->assertTrue($prgResultRoute->getHeaders()->has('Location')); +        $this->assertEquals('/', $prgResultRoute->getHeaders()->get('Location')->getUri()); +        $this->assertEquals(303, $prgResultRoute->getStatusCode()); +    } + +    public function testReuseMatchedParameters() +    { +        $this->controller->getEvent()->getRouteMatch()->setMatchedRouteName('sub'); + +        $this->request->setMethod('POST'); +        $this->request->setPost(new Parameters([ +            'postval1' => 'value1' +        ])); +        $this->controller->dispatch($this->request, $this->response); + +        $plugin         = $this->plugin; +        $prgResultRoute = $plugin(); + +        $this->assertInstanceOf('Zend\Http\Response', $prgResultRoute); +        $this->assertTrue($prgResultRoute->getHeaders()->has('Location')); +        $this->assertEquals('/foo/1', $prgResultRoute->getHeaders()->get('Location')->getUri()); +        $this->assertEquals(303, $prgResultRoute->getStatusCode()); +    } + +    public function testReuseMatchedParametersWithSegmentController() +    { +        $expects = '/ctl/sample'; +        $this->request->setMethod('POST'); +        $this->request->setUri($expects); +        $this->request->setPost(new Parameters([ +            'postval1' => 'value1' +        ])); + +        $routeMatch = $this->event->getRouter()->match($this->request); +        $this->event->setRouteMatch($routeMatch); + +        $moduleRouteListener = new ModuleRouteListener; +        $moduleRouteListener->onRoute($this->event); + +        $this->controller->dispatch($this->request, $this->response); + +        $plugin         = $this->plugin; +        $prgResultRoute = $plugin(); + +        $this->assertInstanceOf('Zend\Http\Response', $prgResultRoute); +        $this->assertTrue($prgResultRoute->getHeaders()->has('Location')); +        $this->assertEquals( +            $expects, +            $prgResultRoute->getHeaders()->get('Location')->getUri(), +            'expects to redirect for the same url' +        ); +        $this->assertEquals(303, $prgResultRoute->getStatusCode()); +    } + +    public function testKeepUrlQueryParameters() +    { +        $expects = '/ctl/sample'; +        $this->request->setMethod('POST'); +        $this->request->setUri($expects); +        $this->request->setQuery(new Parameters([ +            'id' => '123', +        ])); + +        $routeMatch = $this->event->getRouter()->match($this->request); +        $this->event->setRouteMatch($routeMatch); + +        $moduleRouteListener = new ModuleRouteListener; +        $moduleRouteListener->onRoute($this->event); + +        $this->controller->dispatch($this->request, $this->response); + +        $plugin         = $this->plugin; +        $prgResultRoute = $plugin(); + +        $this->assertInstanceOf('Zend\Http\Response', $prgResultRoute); +        $this->assertTrue($prgResultRoute->getHeaders()->has('Location')); +        $this->assertEquals( +            $expects . '?id=123', +            $prgResultRoute->getHeaders()->get('Location')->getUri(), +            'expects to redirect for the same url' +        ); +        $this->assertEquals(303, $prgResultRoute->getStatusCode()); +    } +} diff --git a/zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/test/TestAsset/SampleController.php b/zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/test/TestAsset/SampleController.php new file mode 100644 index 0000000..f44f240 --- /dev/null +++ b/zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/test/TestAsset/SampleController.php @@ -0,0 +1,20 @@ +<?php +/** + * @link      http://github.com/zendframework/zend-mvc-plugin-prg for the canonical source repository + * @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com) + * @license   http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace ZendTest\Mvc\Plugin\Prg\TestAsset; + +use Zend\Mvc\Controller\AbstractActionController; + +class SampleController extends AbstractActionController +{ +    /** +     * Override notFoundAction() to work as a no-op. +     */ +    public function notFoundAction() +    { +    } +} | 
