1<?php 2 3namespace Drupal\Tests\path\Functional; 4 5use Drupal\Core\Language\LanguageInterface; 6 7/** 8 * Confirm that the Path module user interface works with languages. 9 * 10 * @group path 11 */ 12class PathLanguageUiTest extends PathTestBase { 13 14 /** 15 * Modules to enable. 16 * 17 * @var array 18 */ 19 protected static $modules = ['path', 'locale', 'locale_test']; 20 21 /** 22 * {@inheritdoc} 23 */ 24 protected $defaultTheme = 'stark'; 25 26 protected function setUp(): void { 27 parent::setUp(); 28 29 // Create and log in user. 30 $web_user = $this->drupalCreateUser([ 31 'edit any page content', 32 'create page content', 33 'administer url aliases', 34 'create url aliases', 35 'administer languages', 36 'access administration pages', 37 ]); 38 $this->drupalLogin($web_user); 39 40 // Enable French language. 41 $edit = []; 42 $edit['predefined_langcode'] = 'fr'; 43 44 $this->drupalGet('admin/config/regional/language/add'); 45 $this->submitForm($edit, 'Add language'); 46 47 // Enable URL language detection and selection. 48 $edit = ['language_interface[enabled][language-url]' => 1]; 49 $this->drupalGet('admin/config/regional/language/detection'); 50 $this->submitForm($edit, 'Save settings'); 51 } 52 53 /** 54 * Tests that a language-neutral URL alias works. 55 */ 56 public function testLanguageNeutralUrl() { 57 $name = $this->randomMachineName(8); 58 $edit = []; 59 $edit['path[0][value]'] = '/admin/config/search/path'; 60 $edit['alias[0][value]'] = '/' . $name; 61 $this->drupalGet('admin/config/search/path/add'); 62 $this->submitForm($edit, 'Save'); 63 64 $this->drupalGet($name); 65 $this->assertSession()->pageTextContains('Filter aliases'); 66 } 67 68 /** 69 * Tests that a default language URL alias works. 70 */ 71 public function testDefaultLanguageUrl() { 72 $name = $this->randomMachineName(8); 73 $edit = []; 74 $edit['path[0][value]'] = '/admin/config/search/path'; 75 $edit['alias[0][value]'] = '/' . $name; 76 $edit['langcode[0][value]'] = 'en'; 77 $this->drupalGet('admin/config/search/path/add'); 78 $this->submitForm($edit, 'Save'); 79 80 $this->drupalGet($name); 81 $this->assertSession()->pageTextContains('Filter aliases'); 82 } 83 84 /** 85 * Tests that a non-default language URL alias works. 86 */ 87 public function testNonDefaultUrl() { 88 $name = $this->randomMachineName(8); 89 $edit = []; 90 $edit['path[0][value]'] = '/admin/config/search/path'; 91 $edit['alias[0][value]'] = '/' . $name; 92 $edit['langcode[0][value]'] = 'fr'; 93 $this->drupalGet('admin/config/search/path/add'); 94 $this->submitForm($edit, 'Save'); 95 96 $this->drupalGet('fr/' . $name); 97 $this->assertSession()->pageTextContains('Filter aliases'); 98 } 99 100 /** 101 * Tests language unspecific aliases are shown and saved in the node form. 102 */ 103 public function testNotSpecifiedNode() { 104 // Create test node. 105 $node = $this->drupalCreateNode(); 106 107 // Create a language-unspecific alias in the admin UI, ensure that is 108 // displayed and the langcode is not changed when saving. 109 $edit = [ 110 'path[0][value]' => '/node/' . $node->id(), 111 'alias[0][value]' => '/' . $this->getRandomGenerator()->word(8), 112 'langcode[0][value]' => LanguageInterface::LANGCODE_NOT_SPECIFIED, 113 ]; 114 $this->drupalGet('admin/config/search/path/add'); 115 $this->submitForm($edit, 'Save'); 116 117 $this->drupalGet($node->toUrl('edit-form')); 118 $this->assertSession()->fieldValueEquals('path[0][alias]', $edit['alias[0][value]']); 119 $this->submitForm([], 'Save'); 120 121 $this->drupalGet('admin/config/search/path'); 122 $this->assertSession()->pageTextContains('None'); 123 $this->assertSession()->pageTextNotContains('English'); 124 125 // Create another node, with no alias, to ensure non-language specific 126 // aliases are loaded correctly. 127 $node = $this->drupalCreateNode(); 128 $this->drupalget($node->toUrl('edit-form')); 129 $this->submitForm([], 'Save'); 130 $this->assertSession()->pageTextNotContains(t('The alias is already in use.')); 131 } 132 133} 134