3 namespace Drupal\KernelTests\Core\RouteProcessor;
5 use Drupal\Core\Cache\Cache;
6 use Drupal\Core\GeneratedUrl;
7 use Drupal\Core\Render\BubbleableMetadata;
8 use Drupal\KernelTests\KernelTestBase;
9 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
10 use Symfony\Component\HttpFoundation\Request;
11 use Symfony\Component\Routing\Route;
14 * Tests the <current> route processor.
16 * @see \Drupal\Core\RouteProcessor\RouteProcessorCurrent
17 * @group route_processor
19 class RouteProcessorCurrentIntegrationTest extends KernelTestBase {
24 public static $modules = ['system'];
29 * @var \Drupal\Core\Routing\UrlGeneratorInterface
31 protected $urlGenerator;
36 protected function setUp() {
39 $this->urlGenerator = \Drupal::urlGenerator();
43 * Tests the output process.
45 public function testProcessOutbound() {
46 $expected_cacheability = (new BubbleableMetadata())
47 ->addCacheContexts(['route'])
48 ->setCacheMaxAge(Cache::PERMANENT);
50 $request_stack = \Drupal::requestStack();
51 /** @var \Symfony\Component\Routing\RequestContext $request_context */
52 $request_context = \Drupal::service('router.request_context');
54 // Test request with subdir on homepage.
56 'SCRIPT_NAME' => '/subdir/index.php',
57 'SCRIPT_FILENAME' => \Drupal::root() . '/index.php',
58 'SERVER_NAME' => 'http://www.example.com',
60 $request = Request::create('/subdir/', 'GET', [], [], [], $server);
61 $request->attributes->set(RouteObjectInterface::ROUTE_NAME, '<front>');
62 $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route('/'));
64 $request_stack->push($request);
65 $request_context->fromRequest($request);
66 $url = GeneratedUrl::createFromObject($expected_cacheability)->setGeneratedUrl('/subdir/');
67 $this->assertEqual($url, $this->urlGenerator->generateFromRoute('<current>', [], [], TRUE));
69 // Test request with subdir on other page.
71 'SCRIPT_NAME' => '/subdir/index.php',
72 'SCRIPT_FILENAME' => \Drupal::root() . '/index.php',
73 'SERVER_NAME' => 'http://www.example.com',
75 $request = Request::create('/subdir/node/add', 'GET', [], [], [], $server);
76 $request->attributes->set(RouteObjectInterface::ROUTE_NAME, 'node.add');
77 $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route('/node/add'));
79 $request_stack->push($request);
80 $request_context->fromRequest($request);
81 $url = GeneratedUrl::createFromObject($expected_cacheability)->setGeneratedUrl('/subdir/node/add');
82 $this->assertEqual($url, $this->urlGenerator->generateFromRoute('<current>', [], [], TRUE));
84 // Test request without subdir on the homepage.
86 'SCRIPT_NAME' => '/index.php',
87 'SCRIPT_FILENAME' => \Drupal::root() . '/index.php',
88 'SERVER_NAME' => 'http://www.example.com',
90 $request = Request::create('/', 'GET', [], [], [], $server);
91 $request->attributes->set(RouteObjectInterface::ROUTE_NAME, '<front>');
92 $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route('/'));
94 $request_stack->push($request);
95 $request_context->fromRequest($request);
96 $url = GeneratedUrl::createFromObject($expected_cacheability)->setGeneratedUrl('/');
97 $this->assertEqual($url, $this->urlGenerator->generateFromRoute('<current>', [], [], TRUE));
99 // Test request without subdir on other page.
101 'SCRIPT_NAME' => '/index.php',
102 'SCRIPT_FILENAME' => \Drupal::root() . '/index.php',
103 'SERVER_NAME' => 'http://www.example.com',
105 $request = Request::create('/node/add', 'GET', [], [], [], $server);
106 $request->attributes->set(RouteObjectInterface::ROUTE_NAME, 'node.add');
107 $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, new Route('/node/add'));
109 $request_stack->push($request);
110 $request_context->fromRequest($request);
111 $url = GeneratedUrl::createFromObject($expected_cacheability)->setGeneratedUrl('/node/add');
112 $this->assertEqual($url, $this->urlGenerator->generateFromRoute('<current>', [], [], TRUE));
114 // Test request without a found route. This happens for example on an
115 // not found exception page.
117 'SCRIPT_NAME' => '/index.php',
118 'SCRIPT_FILENAME' => \Drupal::root() . '/index.php',
119 'SERVER_NAME' => 'http://www.example.com',
121 $request = Request::create('/invalid-path', 'GET', [], [], [], $server);
123 $request_stack->push($request);
124 $request_context->fromRequest($request);
125 // In case we have no routing, the current route should point to the front,
126 // and the cacheability does not depend on the 'route' cache context, since
127 // no route was involved at all: this is fallback behavior.
128 $url = GeneratedUrl::createFromObject((new BubbleableMetadata())->setCacheMaxAge(Cache::PERMANENT))->setGeneratedUrl('/');
129 $this->assertEqual($url, $this->urlGenerator->generateFromRoute('<current>', [], [], TRUE));