View source
<?php
namespace Drupal\Tests\language\Functional;
use Drupal\Core\Language\Language;
use Drupal\Core\Language\LanguageInterface;
use Drupal\Core\Url;
use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl;
use Drupal\Tests\BrowserTestBase;
use Symfony\Component\HttpFoundation\Request;
class LanguageUrlRewritingTest extends BrowserTestBase {
public static $modules = [
'language',
'language_test',
];
protected $defaultTheme = 'stark';
protected $webUser;
protected function setUp() {
parent::setUp();
$this->webUser = $this
->drupalCreateUser([
'administer languages',
'access administration pages',
]);
$this
->drupalLogin($this->webUser);
$edit = [];
$edit['predefined_langcode'] = 'fr';
$this
->drupalPostForm('admin/config/regional/language/add', $edit, t('Add language'));
$edit = [
'language_interface[enabled][language-url]' => 1,
];
$this
->drupalPostForm('admin/config/regional/language/detection', $edit, t('Save settings'));
$this
->drupalGet('fr/admin/config/regional/language/detection');
$this
->assertRaw('"pathPrefix":"fr\\/"', 'drupalSettings path prefix contains language code.');
}
public function testUrlRewritingEdgeCases() {
$non_existing = new Language([
'id' => $this
->randomMachineName(),
]);
$this
->checkUrl($non_existing, 'Path language is ignored if language is not installed.');
$this
->drupalGet('language_test/subrequest');
$this
->assertText($this->webUser
->getAccountName(), 'Page correctly retrieved');
}
private function checkUrl(LanguageInterface $language, $message) {
$options = [
'language' => $language,
'script' => '',
];
$base_path = trim(base_path(), '/');
$rewritten_path = trim(str_replace($base_path, '', Url::fromRoute('<front>', [], $options)
->toString()), '/');
$segments = explode('/', $rewritten_path, 2);
$prefix = $segments[0];
$path = isset($segments[1]) ? $segments[1] : $prefix;
$prefixes = $this
->config('language.negotiation')
->get('url.prefixes');
$stored_prefix = isset($prefixes[$language
->getId()]) ? $prefixes[$language
->getId()] : $this
->randomMachineName();
$this
->assertNotEqual($stored_prefix, $prefix, $message);
$prefix = $stored_prefix;
$this
->drupalGet("{$prefix}/{$path}");
$this
->assertSession()
->statusCodeEquals(404);
}
public function testDomainNameNegotiationPort() {
global $base_url;
$language_domain = 'example.fr';
$base_url_host = parse_url($base_url, PHP_URL_HOST);
$edit = [
'language_negotiation_url_part' => LanguageNegotiationUrl::CONFIG_DOMAIN,
'domain[en]' => $base_url_host,
'domain[fr]' => $language_domain,
];
$this
->drupalPostForm('admin/config/regional/language/detection/url', $edit, t('Save configuration'));
$this
->rebuildContainer();
$this
->config('language.negotiation')
->set('url.source', LanguageNegotiationUrl::CONFIG_DOMAIN)
->save();
$this->container
->get('language_manager')
->reset();
$index_php = strpos(Url::fromRoute('<front>', [], [
'absolute' => TRUE,
])
->toString(), 'index.php') !== FALSE;
$request = Request::createFromGlobals();
$server = $request->server
->all();
$request = $this
->prepareRequestForGenerator(TRUE, [
'HTTP_HOST' => $server['HTTP_HOST'] . ':88',
]);
$language = \Drupal::languageManager()
->getLanguage('fr');
$url = Url::fromRoute('<front>', [], [
'absolute' => TRUE,
'language' => $language,
])
->toString();
$expected = ($index_php ? 'http://example.fr:88/index.php' : 'http://example.fr:88') . rtrim(base_path(), '/') . '/';
$this
->assertEqual($url, $expected, 'The right port is used.');
$url = Url::fromRoute('<front>', [], [
'absolute' => TRUE,
'language' => $language,
'base_url' => $request
->getBaseUrl() . ':90',
])
->toString();
$expected = $index_php ? 'http://example.fr:90/index.php' : 'http://example.fr:90' . rtrim(base_path(), '/') . '/';
$this
->assertEqual($url, $expected, 'A given port is not overridden.');
}
}