function LanguageNegotiationInfoTest::testInfoAlterations

Tests alterations to language types/negotiation info.

File

drupal/core/modules/language/lib/Drupal/language/Tests/LanguageNegotiationInfoTest.php, line 43
Definition of Drupal\language\Tests\LanguageNegotiationInfoTest.

Class

LanguageNegotiationInfoTest
Functional test for language types/negotiation info.

Namespace

Drupal\language\Tests

Code

function testInfoAlterations() {

  // Enable language type/negotiation info alterations.
  state()
    ->set('language_test.language_types', TRUE);
  state()
    ->set('language_test.language_negotiation_info', TRUE);
  $this
    ->languageNegotiationUpdate();

  // Check that fixed language types are properly configured without the need
  // of saving the language negotiation settings.
  $this
    ->checkFixedLanguageTypes();

  // Make the content language type configurable by updating the language
  // negotiation settings with the proper flag enabled.
  state()
    ->set('language_test.content_language_type', TRUE);
  $this
    ->languageNegotiationUpdate();
  $type = LANGUAGE_TYPE_CONTENT;
  $language_types = variable_get('language_types', language_types_get_default());
  $this
    ->assertTrue($language_types[$type], '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 = LANGUAGE_NEGOTIATION_INTERFACE;
  $test_method_id = 'test_language_negotiation_method';
  $form_field = $type . '[enabled][' . $interface_method_id . ']';
  $edit = array(
    $form_field => TRUE,
    $type . '[enabled][' . $test_method_id . ']' => TRUE,
    $test_type . '[enabled][' . $test_method_id . ']' => TRUE,
  );
  $this
    ->drupalPost('admin/config/regional/language/detection', $edit, t('Save settings'));

  // Remove the interface language negotiation method by updating the language
  // negotiation settings with the proper flag enabled.
  state()
    ->set('language_test.language_negotiation_info_alter', TRUE);
  $this
    ->languageNegotiationUpdate();
  $negotiation = variable_get("language_negotiation_{$type}", array());
  $this
    ->assertFalse(isset($negotiation[$interface_method_id]), 'Interface language negotiation method removed from the stored settings.');
  $this
    ->assertNoFieldByXPath("//input[@name=\"{$form_field}\"]", NULL, 'Interface language negotiation method unavailable.');

  // Check that type-specific language negotiation methods can be assigned
  // only to the corresponding language types.
  foreach (language_types_get_configurable() as $type) {
    $form_field = $type . '[enabled][test_language_negotiation_method_ts]';
    if ($type == $test_type) {
      $this
        ->assertFieldByXPath("//input[@name=\"{$form_field}\"]", NULL, format_string('Type-specific test language negotiation method available for %type.', array(
        '%type' => $type,
      )));
    }
    else {
      $this
        ->assertNoFieldByXPath("//input[@name=\"{$form_field}\"]", NULL, format_string('Type-specific test language negotiation method unavailable for %type.', array(
        '%type' => $type,
      )));
    }
  }

  // Check language negotiation results.
  $this
    ->drupalGet('');
  $last = state()
    ->get('language_test.language_negotiation_last');
  foreach (language_types_get_all() as $type) {
    $langcode = $last[$type];
    $value = $type == LANGUAGE_TYPE_CONTENT || strpos($type, 'test') !== FALSE ? 'it' : 'en';
    $this
      ->assertEqual($langcode, $value, format_string('The negotiated language for %type is %language', array(
      '%type' => $type,
      '%language' => $langcode,
    )));
  }

  // Disable language_test and check that everything is set back to the
  // original status.
  $this
    ->languageNegotiationUpdate('disable');

  // Check that only the core language types are available.
  foreach (language_types_get_all() as $type) {
    $this
      ->assertTrue(strpos($type, 'test') === FALSE, format_string('The %type language is still available', array(
      '%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 = variable_get("language_negotiation_{$type}", array());
  $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
    ->assertNoRaw(t('Test language detection'), 'No test language type configuration available.');
  $this
    ->assertNoRaw(t('This is a test language negotiation method'), 'No test language negotiation method available.');
}