cf1b87720a2472c0825e09b8792b8659a034a9ce
[yaffs-website] / web / core / modules / block / tests / src / Functional / BlockLanguageTest.php
1 <?php
2
3 namespace Drupal\Tests\block\Functional;
4
5 use Drupal\Tests\BrowserTestBase;
6 use Drupal\block\Entity\Block;
7
8 /**
9  * Tests if a block can be configured to be only visible on a particular
10  * language.
11  *
12  * @group block
13  */
14 class BlockLanguageTest extends BrowserTestBase {
15
16   /**
17    * An administrative user to configure the test environment.
18    */
19   protected $adminUser;
20
21   /**
22    * Modules to install.
23    *
24    * @var array
25    */
26   public static $modules = ['language', 'block', 'content_translation'];
27
28   protected function setUp() {
29     parent::setUp();
30
31     // Create a new user, allow him to manage the blocks and the languages.
32     $this->adminUser = $this->drupalCreateUser(['administer blocks', 'administer languages']);
33     $this->drupalLogin($this->adminUser);
34
35     // Add predefined language.
36     $edit = [
37       'predefined_langcode' => 'fr',
38     ];
39     $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add language'));
40     $this->assertText('French', 'Language added successfully.');
41   }
42
43   /**
44    * Tests the visibility settings for the blocks based on language.
45    */
46   public function testLanguageBlockVisibility() {
47     // Check if the visibility setting is available.
48     $default_theme = $this->config('system.theme')->get('default');
49     $this->drupalGet('admin/structure/block/add/system_powered_by_block' . '/' . $default_theme);
50
51     $this->assertField('visibility[language][langcodes][en]', 'Language visibility field is visible.');
52     $this->assertNoField('visibility[language][context_mapping][language]', 'Language type field is not visible.');
53
54     // Enable a standard block and set the visibility setting for one language.
55     $edit = [
56       'visibility[language][langcodes][en]' => TRUE,
57       'id' => strtolower($this->randomMachineName(8)),
58       'region' => 'sidebar_first',
59     ];
60     $this->drupalPostForm('admin/structure/block/add/system_powered_by_block' . '/' . $default_theme, $edit, t('Save block'));
61
62     // Change the default language.
63     $edit = [
64       'site_default_language' => 'fr',
65     ];
66     $this->drupalPostForm('admin/config/regional/language', $edit, t('Save configuration'));
67
68     // Check that a page has a block.
69     $this->drupalGet('en');
70     $this->assertText('Powered by Drupal', 'The body of the custom block appears on the page.');
71
72     // Check that a page doesn't has a block for the current language anymore.
73     $this->drupalGet('fr');
74     $this->assertNoText('Powered by Drupal', 'The body of the custom block does not appear on the page.');
75   }
76
77   /**
78    * Tests if the visibility settings are removed if the language is deleted.
79    */
80   public function testLanguageBlockVisibilityLanguageDelete() {
81     // Enable a standard block and set the visibility setting for one language.
82     $edit = [
83       'visibility' => [
84         'language' => [
85           'langcodes' => [
86             'fr' => 'fr',
87           ],
88           'context_mapping' => ['language' => '@language.current_language_context:language_interface'],
89         ],
90       ],
91     ];
92     $block = $this->drupalPlaceBlock('system_powered_by_block', $edit);
93
94     // Check that we have the language in config after saving the setting.
95     $visibility = $block->getVisibility();
96     $this->assertEqual('fr', $visibility['language']['langcodes']['fr'], 'Language is set in the block configuration.');
97
98     // Delete the language.
99     $this->drupalPostForm('admin/config/regional/language/delete/fr', [], t('Delete'));
100
101     // Check that the language is no longer stored in the configuration after
102     // it is deleted.
103     $block = Block::load($block->id());
104     $visibility = $block->getVisibility();
105     $this->assertTrue(empty($visibility['language']['langcodes']['fr']), 'Language is no longer not set in the block configuration after deleting the block.');
106
107     // Ensure that the block visibility for language is gone from the UI.
108     $this->drupalGet('admin/structure/block');
109     $this->clickLink('Configure');
110     $elements = $this->xpath('//details[@id="edit-visibility-language"]');
111     $this->assertTrue(empty($elements));
112   }
113
114   /**
115    * Tests block language visibility with different language types.
116    */
117   public function testMultipleLanguageTypes() {
118     // Customize content language detection to be different from interface
119     // language detection.
120     $edit = [
121       // Interface language detection: only using session.
122       'language_interface[enabled][language-url]' => FALSE,
123       'language_interface[enabled][language-session]' => TRUE,
124       // Content language detection: only using URL.
125       'language_content[configurable]' => TRUE,
126       'language_content[enabled][language-url]' => TRUE,
127       'language_content[enabled][language-interface]' => FALSE,
128     ];
129     $this->drupalPostForm('admin/config/regional/language/detection', $edit, t('Save settings'));
130
131     // Check if the visibility setting is available with a type setting.
132     $default_theme = $this->config('system.theme')->get('default');
133     $this->drupalGet('admin/structure/block/add/system_powered_by_block' . '/' . $default_theme);
134     $this->assertField('visibility[language][langcodes][en]', 'Language visibility field is visible.');
135     $this->assertField('visibility[language][context_mapping][language]', 'Language type field is visible.');
136
137     // Enable a standard block and set visibility to French only.
138     $block_id = strtolower($this->randomMachineName(8));
139     $edit = [
140       'visibility[language][context_mapping][language]' => '@language.current_language_context:language_interface',
141       'visibility[language][langcodes][fr]' => TRUE,
142       'id' => $block_id,
143       'region' => 'sidebar_first',
144     ];
145     $this->drupalPostForm('admin/structure/block/add/system_powered_by_block' . '/' . $default_theme, $edit, t('Save block'));
146
147     // Interface negotiation depends on request arguments.
148     $this->drupalGet('node', ['query' => ['language' => 'en']]);
149     $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.');
150     $this->drupalGet('node', ['query' => ['language' => 'fr']]);
151     $this->assertText('Powered by Drupal', 'The body of the block appears on the page.');
152
153     // Log in again in order to clear the interface language stored in the
154     // session.
155     $this->drupalLogout();
156     $this->drupalLogin($this->adminUser);
157
158     // Content language does not depend on session/request arguments.
159     // It will fall back on English (site default) and not display the block.
160     $this->drupalGet('en');
161     $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.');
162     $this->drupalGet('fr');
163     $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.');
164
165     // Change visibility to now depend on content language for this block.
166     $edit = [
167       'visibility[language][context_mapping][language]' => '@language.current_language_context:language_content'
168     ];
169     $this->drupalPostForm('admin/structure/block/manage/' . $block_id, $edit, t('Save block'));
170
171     // Content language negotiation does not depend on request arguments.
172     // It will fall back on English (site default) and not display the block.
173     $this->drupalGet('node', ['query' => ['language' => 'en']]);
174     $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.');
175     $this->drupalGet('node', ['query' => ['language' => 'fr']]);
176     $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.');
177
178     // Content language negotiation depends on path prefix.
179     $this->drupalGet('en');
180     $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.');
181     $this->drupalGet('fr');
182     $this->assertText('Powered by Drupal', 'The body of the block appears on the page.');
183   }
184
185 }