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