Skip to content

Commit d7aaa53

Browse files
committed
Fix reset URL creation when detection is disabled and add test cases
1 parent 40862f9 commit d7aaa53

File tree

3 files changed

+77
-5
lines changed

3 files changed

+77
-5
lines changed

UrlManager.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,10 @@ public function createUrl($params)
201201
$languageRequired = false;
202202
}
203203

204-
// Do not use prefix for default language to prevent unnecessary redirect
205-
if ($languageRequired
206-
&& $language === $this->getDefaultLanguage()
207-
&& !$this->enableDefaultLanguageUrlCode
208-
&& !$this->enableLanguagePersistence
204+
// Do not use prefix for default language to prevent unnecessary redirect if there's no persistence and no detection
205+
if (
206+
$languageRequired && $language===$this->getDefaultLanguage() &&
207+
!$this->enableDefaultLanguageUrlCode && !$this->enableLanguagePersistence && !$this->enableLanguageDetection
209208
) {
210209
$languageRequired = false;
211210
}

tests/RedirectTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,16 @@ public function testRedirectsIfNoLanguageInUrlAndAcceptedLanguageWithCountryMatc
166166
]);
167167
}
168168

169+
public function testNoRedirectIfNoLanguageInUrlAndAcceptedLanguageMatchesDefaultLanguage()
170+
{
171+
$this->mockUrlManager([
172+
'languages' => ['en-US', 'en', 'de'],
173+
]);
174+
$this->mockRequest('/site/page',[
175+
'acceptableLanguages' => ['en'],
176+
]);
177+
}
178+
169179
public function testRedirectsIfNoLanguageInUrlAndLanguageInSession()
170180
{
171181
$this->expectRedirect('/de/site/page');

tests/UrlCreationTest.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,4 +221,67 @@ public function testCreateUrlUppercaseLanguageIfEnabled()
221221
$this->assertEquals($this->prepareUrl('/en-US/foo/baz/bar?x=y'), Url::to(['/slug/action', 'language' => 'en-US', 'x' => 'y', 'term' => 'baz']));
222222
}
223223

224+
public function testCreateResetUrlWithLanguageIfPersistenceAndDetectionEnabled()
225+
{
226+
$this->mockUrlManager([
227+
'languages' => ['en-US', 'en', 'de'],
228+
'rules' => [
229+
'/foo/<term:.+>/bar' => 'slug/action',
230+
],
231+
]);
232+
$this->mockRequest('/de/site/page');
233+
$this->assertEquals($this->prepareUrl('/en/demo/action'), Url::to(['/demo/action', 'language' => 'en']));
234+
$this->assertEquals($this->prepareUrl('/en/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en']));
235+
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en']));
236+
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en']));
237+
}
238+
239+
public function testCreateResetUrlWithLanguageIfPersistenceDisabled()
240+
{
241+
$this->mockUrlManager([
242+
'languages' => ['en-US', 'en', 'de'],
243+
'enableLanguagePersistence' => false,
244+
'rules' => [
245+
'/foo/<term:.+>/bar' => 'slug/action',
246+
],
247+
]);
248+
$this->mockRequest('/de/site/page');
249+
$this->assertEquals($this->prepareUrl('/en/demo/action'), Url::to(['/demo/action', 'language' => 'en']));
250+
$this->assertEquals($this->prepareUrl('/en/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en']));
251+
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en']));
252+
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en']));
253+
}
254+
255+
public function testCreateResetUrlWithLanguageIfDetectionDisabled()
256+
{
257+
$this->mockUrlManager([
258+
'languages' => ['en-US', 'en', 'de'],
259+
'enableLanguageDetection' => false,
260+
'rules' => [
261+
'/foo/<term:.+>/bar' => 'slug/action',
262+
],
263+
]);
264+
$this->mockRequest('/de/site/page');
265+
$this->assertEquals($this->prepareUrl('/en/demo/action'), Url::to(['/demo/action', 'language' => 'en']));
266+
$this->assertEquals($this->prepareUrl('/en/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en']));
267+
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en']));
268+
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en']));
269+
}
270+
271+
public function testCreateUrlWithoutDefaultLanguageIfPersistenceAndDetectionDisabled()
272+
{
273+
$this->mockUrlManager([
274+
'languages' => ['en-US', 'en', 'de'],
275+
'enableLanguagePersistence' => false,
276+
'enableLanguageDetection' => false,
277+
'rules' => [
278+
'/foo/<term:.+>/bar' => 'slug/action',
279+
],
280+
]);
281+
$this->mockRequest('/de/site/page');
282+
$this->assertEquals($this->prepareUrl('/demo/action'), Url::to(['/demo/action', 'language' => 'en']));
283+
$this->assertEquals($this->prepareUrl('/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en']));
284+
$this->assertEquals($this->prepareUrl('/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en']));
285+
$this->assertEquals($this->prepareUrl('/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en']));
286+
}
224287
}

0 commit comments

Comments
 (0)