comparison core/modules/language/tests/src/Unit/LanguageNegotiationUrlTest.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 129ea1e6d783
comparison
equal deleted inserted replaced
-1:000000000000 0:4c8ae668cc8c
1 <?php
2
3 namespace Drupal\Tests\language\Unit;
4
5 use Drupal\Core\Cache\Cache;
6 use Drupal\Core\Language\LanguageInterface;
7 use Drupal\Core\Render\BubbleableMetadata;
8 use Drupal\Tests\UnitTestCase;
9 use Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl;
10 use Symfony\Component\DependencyInjection\ContainerBuilder;
11 use Symfony\Component\HttpFoundation\Request;
12
13 /**
14 * @coversDefaultClass \Drupal\language\Plugin\LanguageNegotiation\LanguageNegotiationUrl
15 * @group language
16 */
17 class LanguageNegotiationUrlTest extends UnitTestCase {
18
19 protected $languageManager;
20 protected $user;
21
22 /**
23 * {@inheritdoc}
24 */
25 protected function setUp() {
26
27 // Set up some languages to be used by the language-based path processor.
28 $language_de = $this->getMock('\Drupal\Core\Language\LanguageInterface');
29 $language_de->expects($this->any())
30 ->method('getId')
31 ->will($this->returnValue('de'));
32 $language_en = $this->getMock('\Drupal\Core\Language\LanguageInterface');
33 $language_en->expects($this->any())
34 ->method('getId')
35 ->will($this->returnValue('en'));
36 $languages = [
37 'de' => $language_de,
38 'en' => $language_en,
39 ];
40 $this->languages = $languages;
41
42 // Create a language manager stub.
43 $language_manager = $this->getMockBuilder('Drupal\language\ConfigurableLanguageManagerInterface')
44 ->getMock();
45 $language_manager->expects($this->any())
46 ->method('getLanguages')
47 ->will($this->returnValue($languages));
48 $this->languageManager = $language_manager;
49
50 // Create a user stub.
51 $this->user = $this->getMockBuilder('Drupal\Core\Session\AccountInterface')
52 ->getMock();
53
54 $cache_contexts_manager = $this->getMockBuilder('Drupal\Core\Cache\Context\CacheContextsManager')
55 ->disableOriginalConstructor()
56 ->getMock();
57 $cache_contexts_manager->method('assertValidTokens')->willReturn(TRUE);
58 $container = new ContainerBuilder();
59 $container->set('cache_contexts_manager', $cache_contexts_manager);
60 \Drupal::setContainer($container);
61 }
62
63 /**
64 * Test path prefix language negotiation and outbound path processing.
65 *
66 * @dataProvider providerTestPathPrefix
67 */
68 public function testPathPrefix($prefix, $prefixes, $expected_langcode) {
69 $this->languageManager->expects($this->any())
70 ->method('getCurrentLanguage')
71 ->will($this->returnValue($this->languages[(in_array($expected_langcode, ['en', 'de'])) ? $expected_langcode : 'en']));
72
73 $config = $this->getConfigFactoryStub([
74 'language.negotiation' => [
75 'url' => [
76 'source' => LanguageNegotiationUrl::CONFIG_PATH_PREFIX,
77 'prefixes' => $prefixes,
78 ],
79 ],
80 ]);
81
82 $request = Request::create('/' . $prefix . '/foo', 'GET');
83 $method = new LanguageNegotiationUrl();
84 $method->setLanguageManager($this->languageManager);
85 $method->setConfig($config);
86 $method->setCurrentUser($this->user);
87 $this->assertEquals($expected_langcode, $method->getLangcode($request));
88
89 $cacheability = new BubbleableMetadata();
90 $options = [];
91 $method->processOutbound('foo', $options, $request, $cacheability);
92 $expected_cacheability = new BubbleableMetadata();
93 if ($expected_langcode) {
94 $this->assertSame($prefix . '/', $options['prefix']);
95 $expected_cacheability->setCacheContexts(['languages:' . LanguageInterface::TYPE_URL]);
96 }
97 else {
98 $this->assertFalse(isset($options['prefix']));
99 }
100 $this->assertEquals($expected_cacheability, $cacheability);
101 }
102
103 /**
104 * Provides data for the path prefix test.
105 *
106 * @return array
107 * An array of data for checking path prefix negotiation.
108 */
109 public function providerTestPathPrefix() {
110 $path_prefix_configuration[] = [
111 'prefix' => 'de',
112 'prefixes' => [
113 'de' => 'de',
114 'en-uk' => 'en',
115 ],
116 'expected_langcode' => 'de',
117 ];
118 $path_prefix_configuration[] = [
119 'prefix' => 'en-uk',
120 'prefixes' => [
121 'de' => 'de',
122 'en' => 'en-uk',
123 ],
124 'expected_langcode' => 'en',
125 ];
126 // No configuration.
127 $path_prefix_configuration[] = [
128 'prefix' => 'de',
129 'prefixes' => [],
130 'expected_langcode' => FALSE,
131 ];
132 // Non-matching prefix.
133 $path_prefix_configuration[] = [
134 'prefix' => 'de',
135 'prefixes' => [
136 'en-uk' => 'en',
137 ],
138 'expected_langcode' => FALSE,
139 ];
140 // Non-existing language.
141 $path_prefix_configuration[] = [
142 'prefix' => 'it',
143 'prefixes' => [
144 'it' => 'it',
145 'en-uk' => 'en',
146 ],
147 'expected_langcode' => FALSE,
148 ];
149 return $path_prefix_configuration;
150 }
151
152 /**
153 * Test domain language negotiation and outbound path processing.
154 *
155 * @dataProvider providerTestDomain
156 */
157 public function testDomain($http_host, $domains, $expected_langcode) {
158 $this->languageManager->expects($this->any())
159 ->method('getCurrentLanguage')
160 ->will($this->returnValue($this->languages['en']));
161
162 $config = $this->getConfigFactoryStub([
163 'language.negotiation' => [
164 'url' => [
165 'source' => LanguageNegotiationUrl::CONFIG_DOMAIN,
166 'domains' => $domains,
167 ],
168 ],
169 ]);
170
171 $request = Request::create('', 'GET', [], [], [], ['HTTP_HOST' => $http_host]);
172 $method = new LanguageNegotiationUrl();
173 $method->setLanguageManager($this->languageManager);
174 $method->setConfig($config);
175 $method->setCurrentUser($this->user);
176 $this->assertEquals($expected_langcode, $method->getLangcode($request));
177
178 $cacheability = new BubbleableMetadata();
179 $options = [];
180 $this->assertSame('foo', $method->processOutbound('foo', $options, $request, $cacheability));
181 $expected_cacheability = new BubbleableMetadata();
182 if ($expected_langcode !== FALSE && count($domains) > 1) {
183 $expected_cacheability->setCacheMaxAge(Cache::PERMANENT)->setCacheContexts(['languages:' . LanguageInterface::TYPE_URL, 'url.site']);
184 }
185 $this->assertEquals($expected_cacheability, $cacheability);
186 }
187
188 /**
189 * Provides data for the domain test.
190 *
191 * @return array
192 * An array of data for checking domain negotiation.
193 */
194 public function providerTestDomain() {
195
196 $domain_configuration[] = [
197 'http_host' => 'example.de',
198 'domains' => [
199 'de' => 'http://example.de',
200 ],
201 'expected_langcode' => 'de',
202 ];
203 // No configuration.
204 $domain_configuration[] = [
205 'http_host' => 'example.de',
206 'domains' => [],
207 'expected_langcode' => FALSE,
208 ];
209 // HTTP host with a port.
210 $domain_configuration[] = [
211 'http_host' => 'example.de:8080',
212 'domains' => [
213 'de' => 'http://example.de',
214 ],
215 'expected_langcode' => 'de',
216 ];
217 // Domain configuration with https://.
218 $domain_configuration[] = [
219 'http_host' => 'example.de',
220 'domains' => [
221 'de' => 'https://example.de',
222 ],
223 'expected_langcode' => 'de',
224 ];
225 // Non-matching HTTP host.
226 $domain_configuration[] = [
227 'http_host' => 'example.com',
228 'domains' => [
229 'de' => 'http://example.com',
230 ],
231 'expected_langcode' => 'de',
232 ];
233 // Testing a non-existing language.
234 $domain_configuration[] = [
235 'http_host' => 'example.com',
236 'domains' => [
237 'it' => 'http://example.it',
238 ],
239 'expected_langcode' => FALSE,
240 ];
241 // Multiple domain configurations.
242 $domain_configuration[] = [
243 'http_host' => 'example.com',
244 'domains' => [
245 'de' => 'http://example.de',
246 'en' => 'http://example.com',
247 ],
248 'expected_langcode' => 'en',
249 ];
250 return $domain_configuration;
251 }
252
253 }
254
255 // @todo Remove as part of https://www.drupal.org/node/2481833.
256 namespace Drupal\language\Plugin\LanguageNegotiation;
257
258 if (!function_exists('base_path')) {
259 function base_path() {
260 return '/';
261 }
262 }