3 namespace Drupal\Tests\system\Unit\Transliteration;
5 use Drupal\Core\Access\CsrfTokenGenerator;
6 use Drupal\Tests\UnitTestCase;
7 use Drupal\Component\Transliteration\PhpTransliteration;
8 use Drupal\system\MachineNameController;
10 use Symfony\Component\HttpFoundation\Request;
11 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
14 * Tests that the machine name controller can transliterate strings as expected.
18 class MachineNameControllerTest extends UnitTestCase {
21 * The machine name controller.
23 * @var \Drupal\system\MachineNameController
25 protected $machineNameController;
28 * The CSRF token generator.
30 * @var \Drupal\Core\Access\CsrfTokenGenerator
32 protected $tokenGenerator;
34 protected function 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];
42 $this->machineNameController = new MachineNameController(new PhpTransliteration(), $this->tokenGenerator->reveal());
46 * Data provider for testMachineNameController().
48 * @see testMachineNameController()
51 * An array containing:
52 * - An array of request parameters.
53 * - The expected content of the JSONresponse.
55 public function providerTestMachineNameController() {
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()"'],
72 $valid_data = array_map(function ($data) {
73 if (isset($data[0]['replace_pattern'])) {
74 $data[0]['replace_token'] = 'token-' . $data[0]['replace_pattern'];
83 * Tests machine name controller's transliteration functionality.
85 * @param array $request_params
86 * An array of request parameters.
87 * @param $expected_content
88 * The expected content of the JSONresponse.
90 * @see \Drupal\system\MachineNameController::transliterate()
92 * @dataProvider providerTestMachineNameController
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());
101 * Tests the pattern validation.
103 public function testMachineNameControllerWithInvalidReplacePattern() {
104 $request = Request::create('', 'GET', ['text' => 'Bob', 'langcode' => 'en', 'replace' => 'Alice', 'replace_pattern' => 'Bob', 'replace_token' => 'invalid']);
106 $this->setExpectedException(AccessDeniedHttpException::class, "Invalid 'replace_token' query parameter.");
107 $this->machineNameController->transliterate($request);
111 * Tests the pattern validation with a missing token.
113 public function testMachineNameControllerWithMissingToken() {
114 $request = Request::create('', 'GET', ['text' => 'Bob', 'langcode' => 'en', 'replace' => 'Alice', 'replace_pattern' => 'Bob']);
116 $this->setExpectedException(AccessDeniedHttpException::class, "Missing 'replace_token' query parameter.");
117 $this->machineNameController->transliterate($request);