3 namespace Drupal\Tests\Core\Access;
5 use Drupal\Component\Utility\Crypt;
6 use Drupal\Core\Render\BubbleableMetadata;
7 use Drupal\Tests\UnitTestCase;
8 use Drupal\Core\Access\RouteProcessorCsrf;
9 use Symfony\Component\Routing\Route;
12 * @coversDefaultClass \Drupal\Core\Access\RouteProcessorCsrf
15 class RouteProcessorCsrfTest extends UnitTestCase {
18 * The mock CSRF token generator.
20 * @var \Drupal\Core\Access\CsrfTokenGenerator|\PHPUnit_Framework_MockObject_MockObject
25 * The route processor.
27 * @var \Drupal\Core\Access\RouteProcessorCsrf
31 protected function setUp() {
32 $this->csrfToken = $this->getMockBuilder('Drupal\Core\Access\CsrfTokenGenerator')
33 ->disableOriginalConstructor()
36 $this->processor = new RouteProcessorCsrf($this->csrfToken);
40 * Tests the processOutbound() method with no _csrf_token route requirement.
42 public function testProcessOutboundNoRequirement() {
43 $this->csrfToken->expects($this->never())
46 $route = new Route('/test-path');
49 $bubbleable_metadata = new BubbleableMetadata();
50 $this->processor->processOutbound('test', $route, $parameters, $bubbleable_metadata);
51 // No parameters should be added to the parameters array.
52 $this->assertEmpty($parameters);
53 // Cacheability of routes without a _csrf_token route requirement is
55 $this->assertEquals((new BubbleableMetadata()), $bubbleable_metadata);
59 * Tests the processOutbound() method with a _csrf_token route requirement.
61 public function testProcessOutbound() {
62 $route = new Route('/test-path', [], ['_csrf_token' => 'TRUE']);
65 $bubbleable_metadata = new BubbleableMetadata();
66 $this->processor->processOutbound('test', $route, $parameters, $bubbleable_metadata);
67 // 'token' should be added to the parameters array.
68 $this->assertArrayHasKey('token', $parameters);
69 // Bubbleable metadata of routes with a _csrf_token route requirement is a
72 $placeholder = Crypt::hashBase64($path);
73 $placeholder_render_array = [
74 '#lazy_builder' => ['route_processor_csrf:renderPlaceholderCsrfToken', [$path]],
76 $this->assertSame($parameters['token'], $placeholder);
77 $this->assertEquals((new BubbleableMetadata())->setAttachments(['placeholders' => [$placeholder => $placeholder_render_array]]), $bubbleable_metadata);
81 * Tests the processOutbound() method with a dynamic path and one replacement.
83 public function testProcessOutboundDynamicOne() {
84 $route = new Route('/test-path/{slug}', [], ['_csrf_token' => 'TRUE']);
85 $parameters = ['slug' => 100];
87 $bubbleable_metadata = new BubbleableMetadata();
88 $this->processor->processOutbound('test', $route, $parameters, $bubbleable_metadata);
89 // Bubbleable metadata of routes with a _csrf_token route requirement is a
91 $path = 'test-path/100';
92 $placeholder = Crypt::hashBase64($path);
93 $placeholder_render_array = [
94 '#lazy_builder' => ['route_processor_csrf:renderPlaceholderCsrfToken', [$path]],
96 $this->assertEquals((new BubbleableMetadata())->setAttachments(['placeholders' => [$placeholder => $placeholder_render_array]]), $bubbleable_metadata);
100 * Tests the processOutbound() method with two parameter replacements.
102 public function testProcessOutboundDynamicTwo() {
103 $route = new Route('{slug_1}/test-path/{slug_2}', [], ['_csrf_token' => 'TRUE']);
104 $parameters = ['slug_1' => 100, 'slug_2' => 'test'];
106 $bubbleable_metadata = new BubbleableMetadata();
107 $this->processor->processOutbound('test', $route, $parameters, $bubbleable_metadata);
108 // Bubbleable metadata of routes with a _csrf_token route requirement is a
110 $path = '100/test-path/test';
111 $placeholder = Crypt::hashBase64($path);
112 $placeholder_render_array = [
113 '#lazy_builder' => ['route_processor_csrf:renderPlaceholderCsrfToken', [$path]],
115 $this->assertEquals((new BubbleableMetadata())->setAttachments(['placeholders' => [$placeholder => $placeholder_render_array]]), $bubbleable_metadata);