View source
<?php
namespace Drupal\language\Tests;
use Drupal\Core\Language\LanguageInterface;
use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUI;
use Drupal\simpletest\WebTestBase;
class LanguageNegotiationInfoTest extends WebTestBase {
public static $modules = array(
'language',
);
protected function setUp() {
parent::setUp();
$admin_user = $this
->drupalCreateUser(array(
'administer languages',
'access administration pages',
'view the administration theme',
));
$this
->drupalLogin($admin_user);
$this
->drupalPostForm('admin/config/regional/language/add', array(
'predefined_langcode' => 'it',
), t('Add language'));
}
protected function languageManager() {
return $this->container
->get('language_manager');
}
protected function stateSet(array $values) {
$this->container
->get('state')
->setMultiple($values);
$this
->refreshVariables();
$this->container
->get('language_negotiator')
->purgeConfiguration();
}
function testInfoAlterations() {
$this
->stateSet(array(
'language_test.language_types' => TRUE,
'language_test.language_negotiation_info' => TRUE,
'language_test.content_language_type' => TRUE,
));
$this->container
->get('module_installer')
->install(array(
'language_test',
));
$this
->resetAll();
$this
->checkFixedLanguageTypes();
$type = LanguageInterface::TYPE_CONTENT;
$language_types = $this
->languageManager()
->getLanguageTypes();
$this
->assertTrue(in_array($type, $language_types), 'Content language type is 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 = array(
$form_field => TRUE,
$type . '[enabled][' . $test_method_id . ']' => TRUE,
$test_type . '[enabled][' . $test_method_id . ']' => TRUE,
$test_type . '[configurable]' => TRUE,
);
$this
->drupalPostForm('admin/config/regional/language/detection', $edit, t('Save settings'));
$this
->stateSet(array(
'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.');
$this
->drupalGet('admin/config/regional/language/detection');
$this
->assertNoFieldByName($form_field, NULL, 'Interface language negotiation method unavailable.');
foreach ($this
->languageManager()
->getLanguageTypes() as $type) {
$form_field = $type . '[enabled][test_language_negotiation_method_ts]';
if ($type == $test_type) {
$this
->assertFieldByName($form_field, NULL, format_string('Type-specific test language negotiation method available for %type.', array(
'%type' => $type,
)));
}
else {
$this
->assertNoFieldByName($form_field, NULL, format_string('Type-specific test language negotiation method unavailable for %type.', array(
'%type' => $type,
)));
}
}
$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
->assertEqual($langcode, $value, format_string('The negotiated language for %type is %language', array(
'%type' => $type,
'%language' => $value,
)));
}
$this->container
->get('module_installer')
->uninstall(array(
'language_test',
));
$this
->rebuildContainer();
foreach ($this
->languageManager()
->getDefinedLanguageTypes() as $type) {
$this
->assertTrue(strpos($type, 'test') === FALSE, format_string('The %type language is still available', array(
'%type' => $type,
)));
}
$this
->checkFixedLanguageTypes();
$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.');
$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.');
}
protected function checkFixedLanguageTypes() {
$configurable = $this
->languageManager()
->getLanguageTypes();
foreach ($this
->languageManager()
->getDefinedLanguageTypesInfo() as $type => $info) {
if (!in_array($type, $configurable) && isset($info['fixed'])) {
$negotiation = $this
->config('language.types')
->get('negotiation.' . $type . '.enabled');
$equal = count($info['fixed']) == count($negotiation);
while ($equal && (list($id) = each($negotiation))) {
list(, $info_id) = each($info['fixed']);
$equal = $info_id == $id;
}
$this
->assertTrue($equal, format_string('language negotiation for %type is properly set up', array(
'%type' => $type,
)));
}
}
}
}