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