Skip to content

Commit

Permalink
Fix reset URL creation when detection is disabled and add test cases
Browse files Browse the repository at this point in the history
  • Loading branch information
mikehaertl committed Feb 25, 2016
1 parent 40862f9 commit d7aaa53
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 5 deletions.
9 changes: 4 additions & 5 deletions UrlManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -201,11 +201,10 @@ public function createUrl($params)
$languageRequired = false;
}

// Do not use prefix for default language to prevent unnecessary redirect
if ($languageRequired
&& $language === $this->getDefaultLanguage()
&& !$this->enableDefaultLanguageUrlCode
&& !$this->enableLanguagePersistence
// Do not use prefix for default language to prevent unnecessary redirect if there's no persistence and no detection
if (
$languageRequired && $language===$this->getDefaultLanguage() &&
!$this->enableDefaultLanguageUrlCode && !$this->enableLanguagePersistence && !$this->enableLanguageDetection
) {
$languageRequired = false;
}
Expand Down
10 changes: 10 additions & 0 deletions tests/RedirectTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,16 @@ public function testRedirectsIfNoLanguageInUrlAndAcceptedLanguageWithCountryMatc
]);
}

public function testNoRedirectIfNoLanguageInUrlAndAcceptedLanguageMatchesDefaultLanguage()
{
$this->mockUrlManager([
'languages' => ['en-US', 'en', 'de'],
]);
$this->mockRequest('/site/page',[
'acceptableLanguages' => ['en'],
]);
}

public function testRedirectsIfNoLanguageInUrlAndLanguageInSession()
{
$this->expectRedirect('/de/site/page');
Expand Down
63 changes: 63 additions & 0 deletions tests/UrlCreationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -221,4 +221,67 @@ public function testCreateUrlUppercaseLanguageIfEnabled()
$this->assertEquals($this->prepareUrl('/en-US/foo/baz/bar?x=y'), Url::to(['/slug/action', 'language' => 'en-US', 'x' => 'y', 'term' => 'baz']));
}

public function testCreateResetUrlWithLanguageIfPersistenceAndDetectionEnabled()
{
$this->mockUrlManager([
'languages' => ['en-US', 'en', 'de'],
'rules' => [
'/foo/<term:.+>/bar' => 'slug/action',
],
]);
$this->mockRequest('/de/site/page');
$this->assertEquals($this->prepareUrl('/en/demo/action'), Url::to(['/demo/action', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/en/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en']));
}

public function testCreateResetUrlWithLanguageIfPersistenceDisabled()
{
$this->mockUrlManager([
'languages' => ['en-US', 'en', 'de'],
'enableLanguagePersistence' => false,
'rules' => [
'/foo/<term:.+>/bar' => 'slug/action',
],
]);
$this->mockRequest('/de/site/page');
$this->assertEquals($this->prepareUrl('/en/demo/action'), Url::to(['/demo/action', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/en/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en']));
}

public function testCreateResetUrlWithLanguageIfDetectionDisabled()
{
$this->mockUrlManager([
'languages' => ['en-US', 'en', 'de'],
'enableLanguageDetection' => false,
'rules' => [
'/foo/<term:.+>/bar' => 'slug/action',
],
]);
$this->mockRequest('/de/site/page');
$this->assertEquals($this->prepareUrl('/en/demo/action'), Url::to(['/demo/action', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/en/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/en/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en']));
}

public function testCreateUrlWithoutDefaultLanguageIfPersistenceAndDetectionDisabled()
{
$this->mockUrlManager([
'languages' => ['en-US', 'en', 'de'],
'enableLanguagePersistence' => false,
'enableLanguageDetection' => false,
'rules' => [
'/foo/<term:.+>/bar' => 'slug/action',
],
]);
$this->mockRequest('/de/site/page');
$this->assertEquals($this->prepareUrl('/demo/action'), Url::to(['/demo/action', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/demo/action?x=y'), Url::to(['/demo/action', 'x' => 'y', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/foo/baz/bar'), Url::to(['/slug/action', 'term' => 'baz', 'language' => 'en']));
$this->assertEquals($this->prepareUrl('/foo/baz/bar?x=y'), Url::to(['/slug/action', 'x' => 'y', 'term' => 'baz', 'language' => 'en']));
}
}

0 comments on commit d7aaa53

Please sign in to comment.