Version 1
[yaffs-website] / web / core / modules / system / tests / src / Unit / Transliteration / MachineNameControllerTest.php
1 <?php
2
3 namespace Drupal\Tests\system\Unit\Transliteration;
4
5 use Drupal\Core\Access\CsrfTokenGenerator;
6 use Drupal\Tests\UnitTestCase;
7 use Drupal\Component\Transliteration\PhpTransliteration;
8 use Drupal\system\MachineNameController;
9 use Prophecy\Argument;
10 use Symfony\Component\HttpFoundation\Request;
11 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
12
13 /**
14  * Tests that the machine name controller can transliterate strings as expected.
15  *
16  * @group system
17  */
18 class MachineNameControllerTest extends UnitTestCase {
19
20   /**
21    * The machine name controller.
22    *
23    * @var \Drupal\system\MachineNameController
24    */
25   protected $machineNameController;
26
27   /**
28    * The CSRF token generator.
29    *
30    * @var \Drupal\Core\Access\CsrfTokenGenerator
31    */
32   protected $tokenGenerator;
33
34   protected function setUp() {
35     parent::setUp();
36     // Create the machine name controller.
37     $this->tokenGenerator = $this->prophesize(CsrfTokenGenerator::class);
38     $this->tokenGenerator->validate(Argument::cetera())->will(function ($args) {
39       return $args[0] === 'token-' . $args[1];
40     });
41
42     $this->machineNameController = new MachineNameController(new PhpTransliteration(), $this->tokenGenerator->reveal());
43   }
44
45   /**
46    * Data provider for testMachineNameController().
47    *
48    * @see testMachineNameController()
49    *
50    * @return array
51    *   An array containing:
52    *     - An array of request parameters.
53    *     - The expected content of the JSONresponse.
54    */
55   public function providerTestMachineNameController() {
56     $valid_data = [
57       [['text' => 'Bob', 'langcode' => 'en'], '"Bob"'],
58       [['text' => 'Bob', 'langcode' => 'en', 'lowercase' => TRUE], '"bob"'],
59       [['text' => 'Bob', 'langcode' => 'en', 'replace' => 'Alice', 'replace_pattern' => 'Bob'], '"Alice"'],
60       [['text' => 'Bob', 'langcode' => 'en', 'replace' => 'Alice', 'replace_pattern' => 'Tom'], '"Bob"'],
61       [['text' => 'Äwesome', 'langcode' => 'en', 'lowercase' => TRUE], '"awesome"'],
62       [['text' => 'Äwesome', 'langcode' => 'de', 'lowercase' => TRUE], '"aewesome"'],
63       // Tests special characters replacement in the input text.
64       [['text' => 'B?!"@\/-ob@e', 'langcode' => 'en', 'lowercase' => TRUE, 'replace' => '_', 'replace_pattern' => '[^a-z0-9_.]+'], '"b_ob_e"'],
65       // Tests @ character in the replace_pattern regex.
66       [['text' => 'Bob@e\0', 'langcode' => 'en', 'lowercase' => TRUE, 'replace' => '_', 'replace_pattern' => '[^a-z0-9_.@]+'], '"bob@e_0"'],
67       // Tests null byte in the replace_pattern regex.
68       [['text' => 'Bob', 'langcode' => 'en', 'lowercase' => TRUE, 'replace' => 'fail()', 'replace_pattern' => ".*@e\0"], '"bob"'],
69       [['text' => 'Bob@e', 'langcode' => 'en', 'lowercase' => TRUE, 'replace' => 'fail()', 'replace_pattern' => ".*@e\0"], '"fail()"'],
70     ];
71
72     $valid_data = array_map(function ($data) {
73       if (isset($data[0]['replace_pattern'])) {
74         $data[0]['replace_token'] = 'token-' . $data[0]['replace_pattern'];
75       }
76       return $data;
77     }, $valid_data);
78
79     return $valid_data;
80   }
81
82   /**
83    * Tests machine name controller's transliteration functionality.
84    *
85    * @param array $request_params
86    *   An array of request parameters.
87    * @param $expected_content
88    *   The expected content of the JSONresponse.
89    *
90    * @see \Drupal\system\MachineNameController::transliterate()
91    *
92    * @dataProvider providerTestMachineNameController
93    */
94   public function testMachineNameController(array $request_params, $expected_content) {
95     $request = Request::create('', 'GET', $request_params);
96     $json = $this->machineNameController->transliterate($request);
97     $this->assertEquals($expected_content, $json->getContent());
98   }
99
100   /**
101    * Tests the pattern validation.
102    */
103   public function testMachineNameControllerWithInvalidReplacePattern() {
104     $request = Request::create('', 'GET', ['text' => 'Bob', 'langcode' => 'en', 'replace' => 'Alice', 'replace_pattern' => 'Bob', 'replace_token' => 'invalid']);
105
106     $this->setExpectedException(AccessDeniedHttpException::class, "Invalid 'replace_token' query parameter.");
107     $this->machineNameController->transliterate($request);
108   }
109
110   /**
111    * Tests the pattern validation with a missing token.
112    */
113   public function testMachineNameControllerWithMissingToken() {
114     $request = Request::create('', 'GET', ['text' => 'Bob', 'langcode' => 'en', 'replace' => 'Alice', 'replace_pattern' => 'Bob']);
115
116     $this->setExpectedException(AccessDeniedHttpException::class, "Missing 'replace_token' query parameter.");
117     $this->machineNameController->transliterate($request);
118   }
119
120 }