You are here

public function BlockLanguageTest::testMultipleLanguageTypes in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/block/tests/src/Functional/BlockLanguageTest.php \Drupal\Tests\block\Functional\BlockLanguageTest::testMultipleLanguageTypes()
  2. 10 core/modules/block/tests/src/Functional/BlockLanguageTest.php \Drupal\Tests\block\Functional\BlockLanguageTest::testMultipleLanguageTypes()

Tests block language visibility with different language types.

File

core/modules/block/tests/src/Functional/BlockLanguageTest.php, line 131

Class

BlockLanguageTest
Tests if a block can be configured to be only visible on a particular language.

Namespace

Drupal\Tests\block\Functional

Code

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
    ->drupalGet('admin/config/regional/language/detection');
  $this
    ->submitForm($edit, '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
    ->assertSession()
    ->fieldExists('visibility[language][langcodes][en]');
  $this
    ->assertSession()
    ->fieldExists('visibility[language][context_mapping][language]');

  // 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
    ->drupalGet('admin/structure/block/add/system_powered_by_block' . '/' . $default_theme);
  $this
    ->submitForm($edit, 'Save block');

  // Interface negotiation depends on request arguments.
  $this
    ->drupalGet('node', [
    'query' => [
      'language' => 'en',
    ],
  ]);
  $this
    ->assertSession()
    ->pageTextNotContains('Powered by Drupal');
  $this
    ->drupalGet('node', [
    'query' => [
      'language' => 'fr',
    ],
  ]);
  $this
    ->assertSession()
    ->pageTextContains('Powered by Drupal');

  // 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
    ->assertSession()
    ->pageTextNotContains('Powered by Drupal');
  $this
    ->drupalGet('fr');
  $this
    ->assertSession()
    ->pageTextNotContains('Powered by Drupal');

  // Change visibility to now depend on content language for this block.
  $edit = [
    'visibility[language][context_mapping][language]' => '@language.current_language_context:language_content',
  ];
  $this
    ->drupalGet('admin/structure/block/manage/' . $block_id);
  $this
    ->submitForm($edit, '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
    ->assertSession()
    ->pageTextNotContains('Powered by Drupal');
  $this
    ->drupalGet('node', [
    'query' => [
      'language' => 'fr',
    ],
  ]);
  $this
    ->assertSession()
    ->pageTextNotContains('Powered by Drupal');

  // Content language negotiation depends on path prefix.
  $this
    ->drupalGet('en');
  $this
    ->assertSession()
    ->pageTextNotContains('Powered by Drupal');
  $this
    ->drupalGet('fr');
  $this
    ->assertSession()
    ->pageTextContains('Powered by Drupal');
}