Mercurial > hg > isophonics-drupal-site
diff core/modules/block/tests/src/Functional/BlockLanguageTest.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 129ea1e6d783 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/block/tests/src/Functional/BlockLanguageTest.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,185 @@ +<?php + +namespace Drupal\Tests\block\Functional; + +use Drupal\Tests\BrowserTestBase; +use Drupal\block\Entity\Block; + +/** + * Tests if a block can be configured to be only visible on a particular + * language. + * + * @group block + */ +class BlockLanguageTest extends BrowserTestBase { + + /** + * An administrative user to configure the test environment. + */ + protected $adminUser; + + /** + * Modules to install. + * + * @var array + */ + public static $modules = ['language', 'block', 'content_translation']; + + protected function setUp() { + parent::setUp(); + + // Create a new user, allow him to manage the blocks and the languages. + $this->adminUser = $this->drupalCreateUser(['administer blocks', 'administer languages']); + $this->drupalLogin($this->adminUser); + + // Add predefined language. + $edit = [ + 'predefined_langcode' => 'fr', + ]; + $this->drupalPostForm('admin/config/regional/language/add', $edit, t('Add language')); + $this->assertText('French', 'Language added successfully.'); + } + + /** + * Tests the visibility settings for the blocks based on language. + */ + public function testLanguageBlockVisibility() { + // Check if the visibility setting is available. + $default_theme = $this->config('system.theme')->get('default'); + $this->drupalGet('admin/structure/block/add/system_powered_by_block' . '/' . $default_theme); + + $this->assertField('visibility[language][langcodes][en]', 'Language visibility field is visible.'); + $this->assertNoField('visibility[language][context_mapping][language]', 'Language type field is not visible.'); + + // Enable a standard block and set the visibility setting for one language. + $edit = [ + 'visibility[language][langcodes][en]' => TRUE, + 'id' => strtolower($this->randomMachineName(8)), + 'region' => 'sidebar_first', + ]; + $this->drupalPostForm('admin/structure/block/add/system_powered_by_block' . '/' . $default_theme, $edit, t('Save block')); + + // Change the default language. + $edit = [ + 'site_default_language' => 'fr', + ]; + $this->drupalPostForm('admin/config/regional/language', $edit, t('Save configuration')); + + // Check that a page has a block. + $this->drupalGet('en'); + $this->assertText('Powered by Drupal', 'The body of the custom block appears on the page.'); + + // Check that a page doesn't has a block for the current language anymore. + $this->drupalGet('fr'); + $this->assertNoText('Powered by Drupal', 'The body of the custom block does not appear on the page.'); + } + + /** + * Tests if the visibility settings are removed if the language is deleted. + */ + public function testLanguageBlockVisibilityLanguageDelete() { + // Enable a standard block and set the visibility setting for one language. + $edit = [ + 'visibility' => [ + 'language' => [ + 'langcodes' => [ + 'fr' => 'fr', + ], + 'context_mapping' => ['language' => '@language.current_language_context:language_interface'], + ], + ], + ]; + $block = $this->drupalPlaceBlock('system_powered_by_block', $edit); + + // Check that we have the language in config after saving the setting. + $visibility = $block->getVisibility(); + $this->assertEqual('fr', $visibility['language']['langcodes']['fr'], 'Language is set in the block configuration.'); + + // Delete the language. + $this->drupalPostForm('admin/config/regional/language/delete/fr', [], t('Delete')); + + // Check that the language is no longer stored in the configuration after + // it is deleted. + $block = Block::load($block->id()); + $visibility = $block->getVisibility(); + $this->assertTrue(empty($visibility['language']['langcodes']['fr']), 'Language is no longer not set in the block configuration after deleting the block.'); + + // Ensure that the block visibility for language is gone from the UI. + $this->drupalGet('admin/structure/block'); + $this->clickLink('Configure'); + $elements = $this->xpath('//details[@id="edit-visibility-language"]'); + $this->assertTrue(empty($elements)); + } + + /** + * Tests block language visibility with different language types. + */ + public function testMultipleLanguageTypes() { + // Customize content language detection to be different from interface + // language detection. + $edit = [ + // Interface language detection: only using session. + 'language_interface[enabled][language-url]' => FALSE, + 'language_interface[enabled][language-session]' => TRUE, + // Content language detection: only using URL. + 'language_content[configurable]' => TRUE, + 'language_content[enabled][language-url]' => TRUE, + 'language_content[enabled][language-interface]' => FALSE, + ]; + $this->drupalPostForm('admin/config/regional/language/detection', $edit, t('Save settings')); + + // Check if the visibility setting is available with a type setting. + $default_theme = $this->config('system.theme')->get('default'); + $this->drupalGet('admin/structure/block/add/system_powered_by_block' . '/' . $default_theme); + $this->assertField('visibility[language][langcodes][en]', 'Language visibility field is visible.'); + $this->assertField('visibility[language][context_mapping][language]', 'Language type field is visible.'); + + // Enable a standard block and set visibility to French only. + $block_id = strtolower($this->randomMachineName(8)); + $edit = [ + 'visibility[language][context_mapping][language]' => '@language.current_language_context:language_interface', + 'visibility[language][langcodes][fr]' => TRUE, + 'id' => $block_id, + 'region' => 'sidebar_first', + ]; + $this->drupalPostForm('admin/structure/block/add/system_powered_by_block' . '/' . $default_theme, $edit, t('Save block')); + + // Interface negotiation depends on request arguments. + $this->drupalGet('node', ['query' => ['language' => 'en']]); + $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.'); + $this->drupalGet('node', ['query' => ['language' => 'fr']]); + $this->assertText('Powered by Drupal', 'The body of the block appears on the page.'); + + // Log in again in order to clear the interface language stored in the + // session. + $this->drupalLogout(); + $this->drupalLogin($this->adminUser); + + // Content language does not depend on session/request arguments. + // It will fall back on English (site default) and not display the block. + $this->drupalGet('en'); + $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.'); + $this->drupalGet('fr'); + $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.'); + + // Change visibility to now depend on content language for this block. + $edit = [ + 'visibility[language][context_mapping][language]' => '@language.current_language_context:language_content' + ]; + $this->drupalPostForm('admin/structure/block/manage/' . $block_id, $edit, t('Save block')); + + // Content language negotiation does not depend on request arguments. + // It will fall back on English (site default) and not display the block. + $this->drupalGet('node', ['query' => ['language' => 'en']]); + $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.'); + $this->drupalGet('node', ['query' => ['language' => 'fr']]); + $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.'); + + // Content language negotiation depends on path prefix. + $this->drupalGet('en'); + $this->assertNoText('Powered by Drupal', 'The body of the block does not appear on the page.'); + $this->drupalGet('fr'); + $this->assertText('Powered by Drupal', 'The body of the block appears on the page.'); + } + +}