1<?php 2 3namespace Drupal\Tests\Core\Routing; 4 5use Drupal\Core\Routing\RouteMatchInterface; 6use Drupal\Tests\UnitTestCase; 7use Symfony\Component\Routing\Route; 8 9/** 10 * Base test class for testing classes implementing the route match interface. 11 */ 12abstract class RouteMatchTestBase extends UnitTestCase { 13 14 /** 15 * Build a test route match object for the given implementation. 16 * 17 * @param $name 18 * Route name. 19 * @param \Symfony\Component\Routing\Route $route 20 * Request object 21 * @param array $parameters 22 * Parameters array 23 * @param $raw_parameters 24 * Raw parameters array 25 * 26 * @return \Drupal\Core\Routing\RouteMatchInterface 27 */ 28 abstract protected function getRouteMatch($name, Route $route, array $parameters, array $raw_parameters); 29 30 /** 31 * Provide sets of parameters and expected parameters for parameter tests. 32 */ 33 public function routeMatchProvider() { 34 $base_data = [ 35 [ 36 new Route( 37 '/test-route/{param_without_leading_underscore}/{_param_with_leading_underscore}', 38 [ 39 'default_without_leading_underscore' => NULL, 40 '_default_with_leading_underscore' => NULL, 41 ] 42 ), 43 [ 44 'param_without_leading_underscore' => 'value', 45 '_param_with_leading_underscore' => 'value', 46 'default_without_leading_underscore' => 'value', 47 '_default_with_leading_underscore' => 'value', 48 'foo' => 'value', 49 ], 50 // Parameters should be filtered to only those defined by the route. 51 // Specifically: 52 // - Path parameters, regardless of name. 53 // - Defaults that are not path parameters only if they do not start with 54 // an underscore. 55 [ 56 'param_without_leading_underscore' => 'value', 57 '_param_with_leading_underscore' => 'value', 58 'default_without_leading_underscore' => 'value', 59 ], 60 ], 61 ]; 62 63 $data = []; 64 foreach ($base_data as $entry) { 65 $route = $entry[0]; 66 $params = $entry[1]; 67 $expected_params = $entry[2]; 68 $data[] = [ 69 $this->getRouteMatch('test_route', $route, $params, $params), 70 $route, 71 $params, 72 $expected_params, 73 ]; 74 } 75 76 return $data; 77 } 78 79 /** 80 * @covers ::getRouteName 81 * @dataProvider routeMatchProvider 82 */ 83 public function testGetRouteName(RouteMatchInterface $route_match) { 84 $this->assertSame('test_route', $route_match->getRouteName()); 85 } 86 87 /** 88 * @covers ::getRouteObject 89 * @dataProvider routeMatchProvider 90 */ 91 public function testGetRouteObject(RouteMatchInterface $route_match, Route $route) { 92 $this->assertSame($route, $route_match->getRouteObject()); 93 } 94 95 /** 96 * @covers ::getParameter 97 * @covers \Drupal\Core\Routing\RouteMatch::getParameterNames 98 * @dataProvider routeMatchProvider 99 */ 100 public function testGetParameter(RouteMatchInterface $route_match, Route $route, $parameters, $expected_filtered_parameters) { 101 foreach ($expected_filtered_parameters as $name => $expected_value) { 102 $this->assertSame($expected_value, $route_match->getParameter($name)); 103 } 104 foreach (array_diff_key($parameters, $expected_filtered_parameters) as $name) { 105 $this->assertNull($route_match->getParameter($name)); 106 } 107 } 108 109 /** 110 * @covers ::getParameters 111 * @covers \Drupal\Core\Routing\RouteMatch::getParameterNames 112 * @dataProvider routeMatchProvider 113 */ 114 public function testGetParameters(RouteMatchInterface $route_match, Route $route, $parameters, $expected_filtered_parameters) { 115 $this->assertSame($expected_filtered_parameters, $route_match->getParameters()->all()); 116 } 117 118 /** 119 * @covers ::getRawParameter 120 * @covers \Drupal\Core\Routing\RouteMatch::getParameterNames 121 * @dataProvider routeMatchProvider 122 */ 123 public function testGetRawParameter(RouteMatchInterface $route_match, Route $route, $parameters, $expected_filtered_parameters) { 124 foreach ($expected_filtered_parameters as $name => $expected_value) { 125 $this->assertSame($expected_value, $route_match->getRawParameter($name)); 126 } 127 foreach (array_diff_key($parameters, $expected_filtered_parameters) as $name) { 128 $this->assertNull($route_match->getRawParameter($name)); 129 } 130 } 131 132 /** 133 * @covers ::getRawParameters 134 * @covers \Drupal\Core\Routing\RouteMatch::getParameterNames 135 * @dataProvider routeMatchProvider 136 */ 137 public function testGetRawParameters(RouteMatchInterface $route_match, Route $route, $parameters, $expected_filtered_parameters) { 138 $this->assertSame($expected_filtered_parameters, $route_match->getRawParameters()->all()); 139 } 140 141} 142