You are here

public function LanguageNegotiationInfoTest::testInfoAlterations in Drupal 9

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

Tests alterations to language types/negotiation info.

File

core/modules/language/tests/src/Functional/LanguageNegotiationInfoTest.php, line 76

Class

LanguageNegotiationInfoTest
Tests alterations to language types/negotiation info.

Namespace

Drupal\Tests\language\Functional

Code

public function testInfoAlterations() {
  $this
    ->stateSet([
    // Enable language_test type info.
    'language_test.language_types' => TRUE,
    // Enable language_test negotiation info (not altered yet).
    'language_test.language_negotiation_info' => TRUE,
    // Alter LanguageInterface::TYPE_CONTENT to be configurable.
    'language_test.content_language_type' => TRUE,
  ]);
  $this->container
    ->get('module_installer')
    ->install([
    'language_test',
  ]);
  $this
    ->resetAll();

  // Check that fixed language types are properly configured without the need
  // of saving the language negotiation settings.
  $this
    ->checkFixedLanguageTypes();
  $type = LanguageInterface::TYPE_CONTENT;
  $language_types = $this
    ->languageManager()
    ->getLanguageTypes();
  $this
    ->assertContains($type, $language_types, 'Content language type is configurable.');

  // Enable some core and custom language negotiation methods. The test
  // language type is supposed to be configurable.
  $test_type = 'test_language_type';
  $interface_method_id = LanguageNegotiationUI::METHOD_ID;
  $test_method_id = 'test_language_negotiation_method';
  $form_field = $type . '[enabled][' . $interface_method_id . ']';
  $edit = [
    $form_field => TRUE,
    $type . '[enabled][' . $test_method_id . ']' => TRUE,
    $test_type . '[enabled][' . $test_method_id . ']' => TRUE,
    $test_type . '[configurable]' => TRUE,
  ];
  $this
    ->drupalGet('admin/config/regional/language/detection');
  $this
    ->submitForm($edit, 'Save settings');

  // Alter language negotiation info to remove interface language negotiation
  // method.
  $this
    ->stateSet([
    'language_test.language_negotiation_info_alter' => TRUE,
  ]);
  $negotiation = $this
    ->config('language.types')
    ->get('negotiation.' . $type . '.enabled');
  $this
    ->assertFalse(isset($negotiation[$interface_method_id]), 'Interface language negotiation method removed from the stored settings.');

  // Check that the interface language negotiation method is unavailable.
  $this
    ->drupalGet('admin/config/regional/language/detection');
  $this
    ->assertSession()
    ->fieldNotExists($form_field);

  // Check that type-specific language negotiation methods can be assigned
  // only to the corresponding language types.
  foreach ($this
    ->languageManager()
    ->getLanguageTypes() as $type) {
    $form_field = $type . '[enabled][test_language_negotiation_method_ts]';
    if ($type == $test_type) {
      $this
        ->assertSession()
        ->fieldExists($form_field);
    }
    else {
      $this
        ->assertSession()
        ->fieldNotExists($form_field);
    }
  }

  // Check language negotiation results.
  $this
    ->drupalGet('');
  $last = $this->container
    ->get('state')
    ->get('language_test.language_negotiation_last');
  foreach ($this
    ->languageManager()
    ->getDefinedLanguageTypes() as $type) {
    $langcode = $last[$type];
    $value = $type == LanguageInterface::TYPE_CONTENT || strpos($type, 'test') !== FALSE ? 'it' : 'en';
    $this
      ->assertEquals($langcode, $value, new FormattableMarkup('The negotiated language for %type is %language', [
      '%type' => $type,
      '%language' => $value,
    ]));
  }

  // Uninstall language_test and check that everything is set back to the
  // original status.
  $this->container
    ->get('module_installer')
    ->uninstall([
    'language_test',
  ]);
  $this
    ->rebuildContainer();

  // Check that only the core language types are available.
  foreach ($this
    ->languageManager()
    ->getDefinedLanguageTypes() as $type) {
    $this
      ->assertStringNotContainsString('test', $type, new FormattableMarkup('The %type language is still available', [
      '%type' => $type,
    ]));
  }

  // Check that fixed language types are properly configured, even those
  // previously set to configurable.
  $this
    ->checkFixedLanguageTypes();

  // Check that unavailable language negotiation methods are not present in
  // the negotiation settings.
  $negotiation = $this
    ->config('language.types')
    ->get('negotiation.' . $type . '.enabled');
  $this
    ->assertFalse(isset($negotiation[$test_method_id]), 'The disabled test language negotiation method is not part of the content language negotiation settings.');

  // Check that configuration page presents the correct options and settings.
  $this
    ->assertSession()
    ->pageTextNotContains("Test language detection");
  $this
    ->assertSession()
    ->pageTextNotContains("This is a test language negotiation method");
}