ソースを参照

Merge branch 'master' into 3.next

Mark Story 7 年 前
コミット
9f0d448dfe

+ 10 - 2
src/ORM/Table.php

@@ -150,7 +150,14 @@ class Table implements RepositoryInterface, EventListenerInterface, EventDispatc
      *
      * @var string
      */
-    const RULES_CLASS = 'Cake\ORM\RulesChecker';
+    const RULES_CLASS = RulesChecker::class;
+
+    /**
+     * The IsUnique class name that is used.
+     *
+     * @var string
+     */
+    const IS_UNIQUE_CLASS = IsUnique::class;
 
     /**
      * Name of the table as it can be found in the database
@@ -2797,7 +2804,8 @@ class Table implements RepositoryInterface, EventListenerInterface, EventDispatc
                 return false;
             }
         }
-        $rule = new IsUnique($fields, $options);
+        $class = static::IS_UNIQUE_CLASS;
+        $rule = new $class($fields, $options);
 
         return $rule($entity, ['repository' => $this]);
     }

+ 8 - 1
src/TestSuite/IntegrationTestTrait.php

@@ -194,6 +194,13 @@ trait IntegrationTestTrait
     protected $_cookieEncryptionKey;
 
     /**
+     * Allow router reloading to be disabled.
+     *
+     * @var bool
+     */
+    protected $_disableRouterReload = false;
+
+    /**
      * Auto-detect if the HTTP middleware stack should be used.
      *
      * @return void
@@ -540,7 +547,7 @@ trait IntegrationTestTrait
     protected function _makeDispatcher()
     {
         if ($this->_useHttpServer) {
-            return new MiddlewareDispatcher($this, $this->_appClass, $this->_appArgs);
+            return new MiddlewareDispatcher($this, $this->_appClass, $this->_appArgs, $this->_disableRouterReload);
         }
 
         return new LegacyRequestDispatcher($this);

+ 15 - 2
src/TestSuite/MiddlewareDispatcher.php

@@ -55,6 +55,13 @@ class MiddlewareDispatcher
     protected $_constructorArgs;
 
     /**
+     * Allow router reloading to be disabled.
+     *
+     * @var bool
+     */
+    protected $_disableRouterReload = false;
+
+    /**
      * The application that is being dispatched.
      *
      * @var \Cake\Core\HttpApplicationInterface
@@ -68,13 +75,17 @@ class MiddlewareDispatcher
      * @param string|null $class The application class name. Defaults to App\Application.
      * @param array|null $constructorArgs The constructor arguments for your application class.
      *   Defaults to `['./config']`
+     * @param bool $disableRouterReload Disable Router::reload() call when resolving URLs. This
+     *   flag may be necessary if you are using Router methods in your test case setup, and using array URLs
+     *   when doing requests in your tests.
      * @throws \LogicException If it cannot load class for use in integration testing.
      */
-    public function __construct($test, $class = null, $constructorArgs = null)
+    public function __construct($test, $class = null, $constructorArgs = null, $disableRouterReload = false)
     {
         $this->_test = $test;
         $this->_class = $class ?: Configure::read('App.namespace') . '\Application';
         $this->_constructorArgs = $constructorArgs ?: [CONFIG];
+        $this->_disableRouterReload = $disableRouterReload;
 
         try {
             $reflect = new ReflectionClass($this->_class);
@@ -126,7 +137,9 @@ class MiddlewareDispatcher
         }
 
         $out = Router::url($url);
-        Router::reload();
+        if (!$this->_disableRouterReload) {
+            Router::reload();
+        }
 
         return $out;
     }

+ 2 - 1
tests/TestCase/Routing/Filter/RoutingFilterTest.php

@@ -18,6 +18,7 @@ use Cake\Event\Event;
 use Cake\Http\Response;
 use Cake\Http\ServerRequest;
 use Cake\Routing\Filter\RoutingFilter;
+use Cake\Routing\RouteBuilder;
 use Cake\Routing\Router;
 use Cake\TestSuite\TestCase;
 
@@ -82,7 +83,7 @@ class RoutingFilterTest extends TestCase
      */
     public function testBeforeDispatchRedirectRoute()
     {
-        Router::scope('/', function ($routes) {
+        Router::scope('/', function (RouteBuilder $routes) {
             $routes->redirect('/home', ['controller' => 'articles']);
             $routes->connect('/:controller/:action/*');
         });

+ 1 - 1
tests/TestCase/Routing/RouteBuilderTest.php

@@ -586,7 +586,7 @@ class RouteBuilderTest extends TestCase
     public function testResourcesPathOption()
     {
         $routes = new RouteBuilder($this->collection, '/api');
-        $routes->resources('Articles', ['path' => 'posts'], function ($routes) {
+        $routes->resources('Articles', ['path' => 'posts'], function (RouteBuilder $routes) {
             $routes->resources('Comments');
         });
         $all = $this->collection->routes();

+ 15 - 1
tests/TestCase/TestSuite/IntegrationTestTraitTest.php

@@ -19,6 +19,7 @@ use Cake\Core\Plugin;
 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;
@@ -44,7 +45,8 @@ class IntegrationTestTraitTest extends IntegrationTestCase
         static::setAppNamespace();
 
         Router::reload();
-        Router::scope('/', function ($routes) {
+        Router::extensions(['json']);
+        Router::scope('/', function (RouteBuilder $routes) {
             $routes->setRouteClass(InflectedRoute::class);
             $routes->get('/get/:controller/:action', []);
             $routes->head('/head/:controller/:action', []);
@@ -590,6 +592,18 @@ class IntegrationTestTraitTest extends IntegrationTestCase
     }
 
     /**
+     * Tests URLs containing extensions.
+     *
+     * @return void
+     */
+    public function testRequestWithExt()
+    {
+        $this->get(['controller' => 'Posts', 'action' => 'ajax', '_ext' => 'json']);
+
+        $this->assertResponseCode(200);
+    }
+
+    /**
      * Assert that the stored template doesn't change when cells are rendered.
      *
      * @return void

+ 16 - 2
tests/test_app/TestApp/Application.php

@@ -16,16 +16,24 @@ namespace TestApp;
 
 use Cake\Http\BaseApplication;
 use Cake\Routing\Middleware\RoutingMiddleware;
+use Cake\Routing\RouteBuilder;
 use TestApp\Command\AbortCommand;
 
 class Application extends BaseApplication
 {
-
+    /**
+     * @return void
+     */
     public function bootstrap()
     {
         parent::bootstrap();
     }
 
+    /**
+     * @param \Cake\Console\CommandCollection $commands
+     *
+     * @return \Cake\Console\CommandCollection
+     */
     public function console($commands)
     {
         return $commands
@@ -33,10 +41,16 @@ class Application extends BaseApplication
             ->addMany($commands->autoDiscover());
     }
 
+    /**
+     * @param \Cake\Http\MiddlewareQueue $middleware
+     *
+     * @return \Cake\Http\MiddlewareQueue
+     */
     public function middleware($middleware)
     {
         $middleware->add(new RoutingMiddleware());
         $middleware->add(function ($req, $res, $next) {
+            /** @var \Cake\Http\ServerRequest $res */
             $res = $next($req, $res);
 
             return $res->withHeader('X-Middleware', 'true');
@@ -53,7 +67,7 @@ class Application extends BaseApplication
      */
     public function routes($routes)
     {
-        $routes->scope('/app', function ($routes) {
+        $routes->scope('/app', function (RouteBuilder $routes) {
             $routes->connect('/articles', ['controller' => 'Articles']);
         });
     }

+ 5 - 0
tests/test_app/TestApp/ApplicationWithDefaultRoutes.php

@@ -39,6 +39,11 @@ class ApplicationWithDefaultRoutes extends BaseApplication
         // Do nothing.
     }
 
+    /**
+     * @param \Cake\Http\MiddlewareQueue $middlewareQueue
+     *
+     * @return \Cake\Http\MiddlewareQueue
+     */
     public function middleware($middlewareQueue)
     {
         $middlewareQueue->add(new RoutingMiddleware($this));

+ 10 - 1
tests/test_app/TestApp/ApplicationWithPluginRoutes.php

@@ -16,15 +16,24 @@ namespace TestApp;
 
 use Cake\Http\BaseApplication;
 use Cake\Routing\Middleware\RoutingMiddleware;
+use Cake\Routing\RouteBuilder;
 
 class ApplicationWithPluginRoutes extends BaseApplication
 {
+    /**
+     * @return void
+     */
     public function bootstrap()
     {
         parent::bootstrap();
         $this->addPlugin('TestPlugin');
     }
 
+    /**
+     * @param \Cake\Http\MiddlewareQueue $middleware
+     *
+     * @return \Cake\Http\MiddlewareQueue
+     */
     public function middleware($middleware)
     {
         $middleware->add(new RoutingMiddleware($this));
@@ -40,7 +49,7 @@ class ApplicationWithPluginRoutes extends BaseApplication
      */
     public function routes($routes)
     {
-        $routes->scope('/app', function ($routes) {
+        $routes->scope('/app', function (RouteBuilder $routes) {
             $routes->connect('/articles', ['controller' => 'Articles']);
         });
         $routes->loadPlugin('TestPlugin');

+ 13 - 0
tests/test_app/TestApp/Controller/PostsController.php

@@ -84,6 +84,19 @@ class PostsController extends AppController
     }
 
     /**
+     * Stub AJAX method
+     *
+     * @return void
+     */
+    public function ajax()
+    {
+        $data = [];
+
+        $this->set(compact('data'));
+        $this->set('_serialize', ['data']);
+    }
+
+    /**
      * Post endpoint for integration testing with security component.
      *
      * @return void

+ 3 - 1
tests/test_app/config/routes.php

@@ -12,10 +12,12 @@
  * @since         2.0.0
  * @license       https://opensource.org/licenses/mit-license.php MIT License
  */
+
+use Cake\Routing\RouteBuilder;
 use Cake\Routing\Router;
 
 Router::extensions('json');
-Router::scope('/', function ($routes) {
+Router::scope('/', function (RouteBuilder $routes) {
     $routes->connect('/', ['controller' => 'pages', 'action' => 'display', 'home']);
     $routes->connect(
         '/some_alias',