function LanguageNegotiationInfoTest::testInfoAlterations

Same name in other branches
  1. 9 core/modules/language/tests/src/Functional/LanguageNegotiationInfoTest.php \Drupal\Tests\language\Functional\LanguageNegotiationInfoTest::testInfoAlterations()
  2. 8.9.x core/modules/language/tests/src/Functional/LanguageNegotiationInfoTest.php \Drupal\Tests\language\Functional\LanguageNegotiationInfoTest::testInfoAlterations()
  3. 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 75

Class

LanguageNegotiationInfoTest
Tests alterations to language types/negotiation info.

Namespace

Drupal\Tests\language\Functional

Code

public function testInfoAlterations() : void {
    $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 = \Drupal::keyValue('language_test')->get('language_negotiation_last');
    foreach ($this->languageManager()
        ->getDefinedLanguageTypes() as $type) {
        $langcode = $last[$type];
        $value = $type == LanguageInterface::TYPE_CONTENT || str_contains($type, 'test') ? 'it' : 'en';
        $this->assertEquals($langcode, $value, "The negotiated language for {$type} is {$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, "The {$type} language is still available");
    }
    // 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");
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.