diff --git a/core/lib/Drupal/Core/Routing/MethodFilter.php b/core/lib/Drupal/Core/Routing/MethodFilter.php index 346b892627..533a4602b4 100644 --- a/core/lib/Drupal/Core/Routing/MethodFilter.php +++ b/core/lib/Drupal/Core/Routing/MethodFilter.php @@ -20,19 +20,7 @@ public function filter(RouteCollection $collection, Request $request) { $all_supported_methods = []; - $routes_without_methods = []; - $routes_with_methods = []; foreach ($collection->all() as $name => $route) { - if (empty($route->getMethods())) { - $routes_without_methods[$name] = $route; - } - else { - $routes_with_methods[$name] = $route; - } - } - - $result_collection = new RouteCollection(); - foreach ($routes_with_methods as $name => $route) { $supported_methods = $route->getMethods(); // A route not restricted to specific methods allows any method. If this @@ -48,20 +36,13 @@ public function filter(RouteCollection $collection, Request $request) { $supported_methods[] = 'HEAD'; } - if (in_array($method, $supported_methods, TRUE)) { - $result_collection->add($name, $route); - } - else { + if (!in_array($method, $supported_methods, TRUE)) { $all_supported_methods = array_merge($supported_methods, $all_supported_methods); + $collection->remove($name); } } - - foreach ($routes_without_methods as $name => $route) { - $result_collection->add($name, $route); - } - - if (count($result_collection)) { - return $result_collection; + if (count($collection)) { + return $collection; } throw new MethodNotAllowedException(array_unique($all_supported_methods)); } diff --git a/core/tests/Drupal/Tests/Core/Enhancer/EntityRevisionRouteEnhancerTest.php b/core/tests/Drupal/Tests/Core/Enhancer/EntityRevisionRouteEnhancerTest.php index aa0897b22c..4d1883a447 100644 --- a/core/tests/Drupal/Tests/Core/Enhancer/EntityRevisionRouteEnhancerTest.php +++ b/core/tests/Drupal/Tests/Core/Enhancer/EntityRevisionRouteEnhancerTest.php @@ -30,20 +30,16 @@ protected function setUp() { } /** - * @covers ::applies - * @dataProvider providerTestApplies + * @covers ::enhance */ - public function testApplies(Route $route, $expected) { - $this->assertEquals($expected, $this->routeEnhancer->applies($route)); - } + public function testEnhanceWithoutParameter() { + $route = new Route('/test-path/{entity_test}'); - public function providerTestApplies() { - $data = []; - $data['no-parameter'] = [new Route('/test-path'), FALSE]; - $data['none-revision-parameters'] = [new Route('/test-path/{entity_test}', [], [], ['parameters' => ['entity_test' => ['type' => 'entity:entity_test']]]), FALSE]; - $data['with-revision-parameter'] = [new Route('/test-path/{entity_test_revision}', [], [], ['parameters' => ['entity_test_revision' => ['type' => 'entity_revision:entity_test']]]), TRUE]; + $request = Request::create('/test-path'); - return $data; + $defaults = []; + $defaults[RouteObjectInterface::ROUTE_OBJECT] = $route; + $this->assertEquals($defaults, $this->routeEnhancer->enhance($defaults, $request)); } /** diff --git a/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php b/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php index 1b6525a93b..5ea28c9d86 100644 --- a/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/Enhancer/EntityRouteEnhancerTest.php @@ -6,6 +6,7 @@ use Drupal\Tests\UnitTestCase; use Symfony\Cmf\Component\Routing\RouteObjectInterface; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Routing\Route; /** * @coversDefaultClass \Drupal\Core\Entity\Enhancer\EntityRouteEnhancer @@ -26,6 +27,7 @@ public function testEnhancer() { $defaults = []; $defaults['_controller'] = 'Drupal\Tests\Core\Controller\TestController::content'; $defaults['_entity_form'] = 'entity_test.default'; + $defaults['_route_object'] = (new Route('/test', $defaults)); $new_defaults = $route_enhancer->enhance($defaults, $request); $this->assertTrue(is_callable($new_defaults['_controller'])); $this->assertEquals($defaults['_controller'], $new_defaults['_controller'], '_controller did not get overridden.'); @@ -33,12 +35,14 @@ public function testEnhancer() { // Set _entity_form and ensure that the form is set. $defaults = []; $defaults['_entity_form'] = 'entity_test.default'; + $defaults['_route_object'] = (new Route('/test', $defaults)); $new_defaults = $route_enhancer->enhance($defaults, $request); $this->assertEquals('controller.entity_form:getContentResult', $new_defaults['_controller']); // Set _entity_list and ensure that the entity list controller is set. $defaults = []; $defaults['_entity_list'] = 'entity_test.default'; + $defaults['_route_object'] = (new Route('/test', $defaults)); $new_defaults = $route_enhancer->enhance($defaults, $request); $this->assertEquals('\Drupal\Core\Entity\Controller\EntityListController::listing', $new_defaults['_controller'], 'The entity list controller was not set.'); $this->assertEquals('entity_test.default', $new_defaults['entity_type']); @@ -48,6 +52,7 @@ public function testEnhancer() { $defaults = []; $defaults['_entity_view'] = 'entity_test.full'; $defaults['entity_test'] = 'Mock entity'; + $defaults['_route_object'] = (new Route('/test', $defaults)); $defaults = $route_enhancer->enhance($defaults, $request); $this->assertEquals('\Drupal\Core\Entity\Controller\EntityViewController::view', $defaults['_controller'], 'The entity view controller was not set.'); $this->assertEquals($defaults['_entity'], 'Mock entity'); @@ -62,13 +67,9 @@ public function testEnhancer() { // Add a converter. $options['parameters']['foo'] = ['type' => 'entity:entity_test']; // Set the route. - $route = $this->getMockBuilder('Symfony\Component\Routing\Route') - ->disableOriginalConstructor() - ->getMock(); - - $route->expects($this->any()) - ->method('getOptions') - ->will($this->returnValue($options)); + $route = new Route('/test'); + $route->setOptions($options); + $route->setDefaults($defaults); $defaults[RouteObjectInterface::ROUTE_OBJECT] = $route; $defaults = $route_enhancer->enhance($defaults, $request); @@ -81,6 +82,7 @@ public function testEnhancer() { $defaults = []; $defaults['_entity_view'] = 'entity_test'; $defaults['entity_test'] = 'Mock entity'; + $defaults['_route_object'] = (new Route('/test', $defaults)); $defaults = $route_enhancer->enhance($defaults, $request); $this->assertEquals('\Drupal\Core\Entity\Controller\EntityViewController::view', $defaults['_controller'], 'The entity view controller was not set.'); $this->assertEquals($defaults['_entity'], 'Mock entity'); diff --git a/core/tests/Drupal/Tests/Core/Routing/MethodFilterTest.php b/core/tests/Drupal/Tests/Core/Routing/MethodFilterTest.php index 8837a9bcea..2e411b2b85 100644 --- a/core/tests/Drupal/Tests/Core/Routing/MethodFilterTest.php +++ b/core/tests/Drupal/Tests/Core/Routing/MethodFilterTest.php @@ -97,4 +97,22 @@ public function testFilteredMethods() { $this->assertEquals($expected_collection, $result_collection); } + /** + * Ensures that the incoming and outgoing collections have the same order. + * + * @covers ::filter + */ + public function testCollectionOrder() { + $request = Request::create('/test', 'GET'); + + $collection = new RouteCollection(); + $collection->add('entity.taxonomy_term.canonical', new Route('/test')); + $collection->add('views.view.taxonomy_term_page', new Route('/test', [], [], [], '', [], ['GET', 'POST'])); + + $method_filter = new MethodFilter(); + $result_collection = $method_filter->filter($collection, $request); + + $this->assertEquals(['entity.taxonomy_term.canonical', 'views.view.taxonomy_term_page'], array_keys($result_collection->all())); + } + } diff --git a/core/tests/Drupal/Tests/Core/Routing/RequestFormatRouteFilterTest.php b/core/tests/Drupal/Tests/Core/Routing/RequestFormatRouteFilterTest.php index 4a9e0c6b57..3574ee1950 100644 --- a/core/tests/Drupal/Tests/Core/Routing/RequestFormatRouteFilterTest.php +++ b/core/tests/Drupal/Tests/Core/Routing/RequestFormatRouteFilterTest.php @@ -16,25 +16,6 @@ class RequestFormatRouteFilterTest extends UnitTestCase { /** - * @covers ::applies - */ - public function testAppliesWithoutFormat() { - $route_filter = new RequestFormatRouteFilter(); - $route = new Route('/test'); - $this->assertFalse($route_filter->applies($route)); - } - - /** - * @covers ::applies - */ - public function testAppliesWithFormat() { - $route_filter = new RequestFormatRouteFilter(); - $route = new Route('/test'); - $route->setRequirement('_format', 'json'); - $this->assertTrue($route_filter->applies($route)); - } - - /** * @covers ::filter * @dataProvider filterProvider */ @@ -65,6 +46,7 @@ public function filterProvider() { $sole_route_match_single_format->add('sole_route_single_format', $route_with_format); return [ + 'nothing requested' => [clone $collection, '', ['test_0']], 'xml requested' => [clone $collection, 'xml', ['test_2', 'test_0']], 'json requested' => [clone $collection, 'json', ['test_1', 'test_2', 'test_0']], 'html format requested' => [clone $collection, 'html', ['test_0']],