3 namespace Drupal\Tests\Core\Routing;
5 use Drupal\Core\Routing\CurrentRouteMatch;
6 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
7 use Symfony\Component\HttpFoundation\ParameterBag;
8 use Symfony\Component\HttpFoundation\Request;
9 use Symfony\Component\HttpFoundation\RequestStack;
10 use Symfony\Component\Routing\Route;
13 * @coversDefaultClass \Drupal\Core\Routing\CurrentRouteMatch
16 class CurrentRouteMatchTest extends RouteMatchTestBase {
21 protected function getRouteMatch($name, Route $route, array $parameters, array $raw_parameters) {
22 $request_stack = new RequestStack();
23 $request = new Request();
24 $request_stack->push($request);
26 $request = $request_stack->getCurrentRequest();
27 $request->attributes = new ParameterBag($parameters);
28 $request->attributes->set(RouteObjectInterface::ROUTE_NAME, $name);
29 $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, $route);
30 $request->attributes->set('_raw_variables', new ParameterBag($raw_parameters));
31 return new CurrentRouteMatch($request_stack);
35 * @covers ::__construct
36 * @covers ::getRouteObject
37 * @covers ::getCurrentRouteMatch
38 * @covers ::getRouteMatch
40 public function testGetCurrentRouteObject() {
42 $request_stack = new RequestStack();
43 $request = new Request();
44 $request_stack->push($request);
45 $current_route_match = new CurrentRouteMatch($request_stack);
48 $this->assertNull($current_route_match->getRouteObject());
51 $route = new Route('/test-route/{foo}');
52 $request->attributes->set(RouteObjectInterface::ROUTE_NAME, 'test_route');
53 $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, $route);
54 $request->attributes->set('foo', '1');
55 $this->assertSame('1', $current_route_match->getParameter('foo'));
57 // Immutable for the same request once a route has been matched.
58 $request->attributes->set('foo', '2');
59 $this->assertSame('1', $current_route_match->getParameter('foo'));
62 $subrequest = new Request();
63 $subrequest->attributes->set(RouteObjectInterface::ROUTE_NAME, 'test_subrequest_route');
64 $subrequest->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route('/test-subrequest-route/{foo}'));
65 $subrequest->attributes->set('foo', '2');
66 $request_stack->push($subrequest);
67 $this->assertSame('2', $current_route_match->getParameter('foo'));
69 // Restored original request.
70 $request_stack->pop();
71 $this->assertSame('1', $current_route_match->getParameter('foo'));
75 * @covers ::getRouteMatchFromRequest
77 public function testGetRouteMatchFromRequestWithRouting() {
78 $request_stack = new RequestStack();
79 $request = new Request();
80 $request_stack->push($request);
81 $current_route_match = new CurrentRouteMatch($request_stack);
83 $route_match = $current_route_match->getRouteMatchFromRequest($request);
85 $this->assertNull($route_match->getRouteName());
86 $this->assertNull($route_match->getRouteObject());
90 * @covers ::getRouteMatchFromRequest
92 public function testGetRouteMatchFromRequest() {
93 $request_stack = new RequestStack();
94 $request = new Request();
95 $request_stack->push($request);
96 $route = new Route('/test-route/{foo}');
98 $request->attributes->set(RouteObjectInterface::ROUTE_NAME, 'test_route');
99 $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, $route);
100 $request->attributes->set('foo', '1');
101 $current_route_match = new CurrentRouteMatch($request_stack);
103 $route_match = $current_route_match->getRouteMatchFromRequest($request);
104 $this->assertEquals('test_route', $route_match->getRouteName());
105 $this->assertEquals($route, $route_match->getRouteObject());
109 * @covers ::resetRouteMatch
111 public function testResetRouteMatch() {
112 $route = new Route('/test-route/{foo}');
113 $request = new Request();
114 $request->attributes->set(RouteObjectInterface::ROUTE_NAME, 'test_route');
115 $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, $route);
116 $request_stack = new RequestStack();
117 $request_stack->push($request);
119 $current_route_match = new CurrentRouteMatch($request_stack);
121 $route_name = $current_route_match->getRouteName();
122 $this->assertSame('test_route', $route_name);
124 // Replace the matched route on the request.
125 $request->attributes->set(RouteObjectInterface::ROUTE_NAME, NULL);
126 $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, NULL);
127 // Reset the route match.
128 $current_route_match->resetRouteMatch();
130 $route_name = $current_route_match->getRouteName();
131 $this->assertNull($route_name);