Browse Source

Added a test for issue #11974 - RequestHandler failing to switch views in the IntegrationTestCase.

Ilie Pandia 8 years ago
parent
commit
d59849fd92

+ 18 - 0
tests/TestCase/TestSuite/IntegrationTestCaseTest.php

@@ -18,6 +18,7 @@ use Cake\Core\Configure;
 use Cake\Event\EventManager;
 use Cake\Http\Response;
 use Cake\Routing\DispatcherFactory;
+use Cake\Routing\RouteBuilder;
 use Cake\Routing\Router;
 use Cake\Routing\Route\InflectedRoute;
 use Cake\TestSuite\IntegrationTestCase;
@@ -229,6 +230,23 @@ class IntegrationTestCaseTest extends IntegrationTestCase
         $this->assertEquals('5', $this->_getBodyAsString());
     }
 
+    public function testExceptionsInMiddlewareJsonView(){
+        Router::reload();
+        Router::connect('/json_response/api_get_data', [
+            'controller' => 'JsonResponse',
+            'action' => 'apiGetData'
+        ] );
+
+        $this->configApplication(Configure::read('App.namespace') . '\ApplicationWithExceptionsInMiddleware', null);
+
+        $this->_request['headers'] = [ "Accept" => "application/json" ];
+        $this->get( '/json_response/api_get_data');
+        $this->assertResponseCode(403);
+        $this->assertHeader('Content-Type', 'application/json; charset=UTF-8');
+        $this->assertResponseContains('"message": "Sample Message"');
+        $this->assertResponseContains('"code": 403');
+    }
+
     /**
      * Test sending head requests.
      *

+ 54 - 0
tests/test_app/TestApp/ApplicationWithExceptionsInMiddleware.php

@@ -0,0 +1,54 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ * @link          https://cakephp.org CakePHP(tm) Project
+ * @since         3.5.2
+ * @license       https://opensource.org/licenses/mit-license.php MIT License
+ */
+namespace TestApp;
+
+use Cake\Error\Middleware\ErrorHandlerMiddleware;
+use Cake\Http\BaseApplication;
+use Cake\Routing\Middleware\RoutingMiddleware;
+use TestApp\Middleware\ThrowsExceptionMiddleware;
+
+/**
+ * Simple Application class doing nothing that:
+ */
+class ApplicationWithExceptionsInMiddleware extends BaseApplication
+{
+    /**
+     * Bootstrap hook.
+     *
+     * Nerfed as this is for IntegrationTestCase testing.
+     *
+     * @return void
+     */
+    public function bootstrap()
+    {
+        // Do nothing.
+    }
+
+    public function middleware($middlewareQueue)
+    {
+        $middlewareQueue
+            // Catch any exceptions in the lower layers,
+            // and make an error page/response
+            ->add(ErrorHandlerMiddleware::class)
+
+            // Handle plugin/theme assets like CakePHP normally does.
+            ->add(ThrowsExceptionMiddleware::class)
+
+            // Add routing middleware.
+            ->add(new RoutingMiddleware($this));
+
+        return $middlewareQueue;
+    }
+}

+ 46 - 0
tests/test_app/TestApp/Controller/JsonResponseController.php

@@ -0,0 +1,46 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ * @link          https://cakephp.org CakePHP(tm) Project
+ * @since         3.0.0
+ * @license       https://opensource.org/licenses/mit-license.php MIT License
+ */
+namespace TestApp\Controller;
+
+use Cake\Http\Exception\InternalErrorException;
+
+/**
+ * PostsController class
+ */
+class JsonResponseController extends AppController
+{
+    /**
+     * Components array
+     *
+     * @var array
+     */
+    public $components = [
+        'Flash',
+        'RequestHandler' => [
+            'enableBeforeRedirect' => false
+        ],
+    ];
+
+    public function apiGetData(){
+        if(!$this->getRequest()->accepts('application/json')){
+            throw new InternalErrorException( "Client MUST sent the Accept: application/json header");
+        }
+
+        $data = ['a','b','c','d'];
+        $this->set(compact('data'));
+        $this->set('_serialize', ['data']);
+        $this->RequestHandler->renderAs($this, 'json');
+    }
+}

+ 28 - 0
tests/test_app/TestApp/Middleware/ThrowsExceptionMiddleware.php

@@ -0,0 +1,28 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+ * @link          https://cakephp.org CakePHP(tm) Project
+ * @since         3.3.0
+ * @license       https://opensource.org/licenses/mit-license.php MIT License
+ */
+namespace TestApp\Middleware;
+
+use Cake\Http\Exception\ForbiddenException;
+
+/**
+ * Testing stub for middleware tests.
+ */
+class ThrowsExceptionMiddleware
+{
+    public function __invoke($req, $res, $next)
+    {
+        throw new ForbiddenException("Sample Message");
+    }
+}