View source
<?php
namespace Drupal\Tests\Core\Access;
use Drupal\Component\Utility\Crypt;
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\Tests\UnitTestCase;
use Drupal\Core\Access\RouteProcessorCsrf;
use Symfony\Component\Routing\Route;
class RouteProcessorCsrfTest extends UnitTestCase {
protected $csrfToken;
protected $processor;
protected function setUp() : void {
$this->csrfToken = $this
->getMockBuilder('Drupal\\Core\\Access\\CsrfTokenGenerator')
->disableOriginalConstructor()
->getMock();
$this->processor = new RouteProcessorCsrf($this->csrfToken);
}
public function testProcessOutboundNoRequirement() {
$this->csrfToken
->expects($this
->never())
->method('get');
$route = new Route('/test-path');
$parameters = [];
$bubbleable_metadata = new BubbleableMetadata();
$this->processor
->processOutbound('test', $route, $parameters, $bubbleable_metadata);
$this
->assertEmpty($parameters);
$this
->assertEquals(new BubbleableMetadata(), $bubbleable_metadata);
}
public function testProcessOutbound() {
$route = new Route('/test-path', [], [
'_csrf_token' => 'TRUE',
]);
$parameters = [];
$bubbleable_metadata = new BubbleableMetadata();
$this->processor
->processOutbound('test', $route, $parameters, $bubbleable_metadata);
$this
->assertArrayHasKey('token', $parameters);
$path = 'test-path';
$placeholder = Crypt::hashBase64($path);
$placeholder_render_array = [
'#lazy_builder' => [
'route_processor_csrf:renderPlaceholderCsrfToken',
[
$path,
],
],
];
$this
->assertSame($parameters['token'], $placeholder);
$this
->assertEquals((new BubbleableMetadata())
->setAttachments([
'placeholders' => [
$placeholder => $placeholder_render_array,
],
]), $bubbleable_metadata);
}
public function testProcessOutboundDynamicOne() {
$route = new Route('/test-path/{slug}', [], [
'_csrf_token' => 'TRUE',
]);
$parameters = [
'slug' => 100,
];
$bubbleable_metadata = new BubbleableMetadata();
$this->processor
->processOutbound('test', $route, $parameters, $bubbleable_metadata);
$path = 'test-path/100';
$placeholder = Crypt::hashBase64($path);
$placeholder_render_array = [
'#lazy_builder' => [
'route_processor_csrf:renderPlaceholderCsrfToken',
[
$path,
],
],
];
$this
->assertEquals((new BubbleableMetadata())
->setAttachments([
'placeholders' => [
$placeholder => $placeholder_render_array,
],
]), $bubbleable_metadata);
}
public function testProcessOutboundDynamicTwo() {
$route = new Route('{slug_1}/test-path/{slug_2}', [], [
'_csrf_token' => 'TRUE',
]);
$parameters = [
'slug_1' => 100,
'slug_2' => 'test',
];
$bubbleable_metadata = new BubbleableMetadata();
$this->processor
->processOutbound('test', $route, $parameters, $bubbleable_metadata);
$path = '100/test-path/test';
$placeholder = Crypt::hashBase64($path);
$placeholder_render_array = [
'#lazy_builder' => [
'route_processor_csrf:renderPlaceholderCsrfToken',
[
$path,
],
],
];
$this
->assertEquals((new BubbleableMetadata())
->setAttachments([
'placeholders' => [
$placeholder => $placeholder_render_array,
],
]), $bubbleable_metadata);
}
}