Skip to content

Commit

Permalink
minor #35926 [Routing] Fix some wrong localized routes tests (fancyweb)
Browse files Browse the repository at this point in the history
This PR was merged into the 4.4 branch.

Discussion
----------

[Routing] Fix some wrong localized routes tests

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | no
| New feature?  | no
| Deprecations? | no
| Tickets       | -
| License       | MIT
| Doc PR        | -

~~Since #35855, the `_locale` path param is directly substituted so those tests are not valid cases anymore. Instead, the path directly contain the right locale.~~ Actually, the compilation is done after, so instead we need to set the new requirement in all tests to reflect the "reality".

#35855 also causes a BC break on one case:
```php
$compiledUrlGenerator->generate('foo.fr', ['_locale' => 'en']))
```

Previously, the generated route would be the `/en/fourchette`. Now that the locale is hardcoded in the route path, it will always be `/fr/fourchette`. I changed `foo` to relevant words because it is easier to understand like that.

Commits
-------

99ae55f [Routing] Fix some wrong localized routes tests
  • Loading branch information
nicolas-grekas committed Mar 2, 2020
2 parents afdd507 + 99ae55f commit d246e94
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 36 deletions.
Expand Up @@ -87,8 +87,8 @@ public function testDumpWithRoutes()
public function testDumpWithSimpleLocalizedRoutes()
{
$this->routeCollection->add('test', (new Route('/foo')));
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'en'));
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'nl'));

$code = $this->generatorDumper->dump();
file_put_contents($this->testTmpFilepath, $code);
Expand Down Expand Up @@ -120,7 +120,7 @@ public function testDumpWithRouteNotFoundLocalizedRoutes()
{
$this->expectException('Symfony\Component\Routing\Exception\RouteNotFoundException');
$this->expectExceptionMessage('Unable to generate a URL for the named route "test" as such route does not exist.');
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'en'));

$code = $this->generatorDumper->dump();
file_put_contents($this->testTmpFilepath, $code);
Expand All @@ -131,9 +131,9 @@ public function testDumpWithRouteNotFoundLocalizedRoutes()

public function testDumpWithFallbackLocaleLocalizedRoutes()
{
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.fr', (new Route('/tester/est/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'en'));
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'nl'));
$this->routeCollection->add('test.fr', (new Route('/tester/est/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'fr'));

$code = $this->generatorDumper->dump();
file_put_contents($this->testTmpFilepath, $code);
Expand Down Expand Up @@ -234,10 +234,10 @@ public function testDumpWithSchemeRequirement()

public function testDumpWithLocalizedRoutesPreserveTheGoodLocaleInTheUrl()
{
$this->routeCollection->add('foo.en', (new Route('/{_locale}/foo'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo'));
$this->routeCollection->add('foo.fr', (new Route('/{_locale}/foo'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'foo'));
$this->routeCollection->add('fun.en', (new Route('/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'fun'));
$this->routeCollection->add('fun.fr', (new Route('/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'fun'));
$this->routeCollection->add('foo.en', (new Route('/{_locale}/fork'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'en'));
$this->routeCollection->add('foo.fr', (new Route('/{_locale}/fourchette'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'fr'));
$this->routeCollection->add('fun.en', (new Route('/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'fun')->setRequirement('_locale', 'en'));
$this->routeCollection->add('fun.fr', (new Route('/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'fun')->setRequirement('_locale', 'fr'));

file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump());

Expand All @@ -246,10 +246,10 @@ public function testDumpWithLocalizedRoutesPreserveTheGoodLocaleInTheUrl()

$compiledUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, $requestContext, null, null);

$this->assertSame('/fr/foo', $compiledUrlGenerator->generate('foo'));
$this->assertSame('/en/foo', $compiledUrlGenerator->generate('foo.en'));
$this->assertSame('/en/foo', $compiledUrlGenerator->generate('foo', ['_locale' => 'en']));
$this->assertSame('/en/foo', $compiledUrlGenerator->generate('foo.fr', ['_locale' => 'en']));
$this->assertSame('/fr/fourchette', $compiledUrlGenerator->generate('foo'));
$this->assertSame('/en/fork', $compiledUrlGenerator->generate('foo.en'));
$this->assertSame('/en/fork', $compiledUrlGenerator->generate('foo', ['_locale' => 'en']));
$this->assertSame('/fr/fourchette', $compiledUrlGenerator->generate('foo.fr', ['_locale' => 'en']));

$this->assertSame('/amusant', $compiledUrlGenerator->generate('fun'));
$this->assertSame('/fun', $compiledUrlGenerator->generate('fun.en'));
Expand Down
Expand Up @@ -90,8 +90,8 @@ public function testDumpWithRoutes()
public function testDumpWithSimpleLocalizedRoutes()
{
$this->routeCollection->add('test', (new Route('/foo')));
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'en'));
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'nl'));

$code = $this->generatorDumper->dump([
'class' => 'SimpleLocalizedProjectUrlGenerator',
Expand Down Expand Up @@ -126,7 +126,7 @@ public function testDumpWithRouteNotFoundLocalizedRoutes()
{
$this->expectException('Symfony\Component\Routing\Exception\RouteNotFoundException');
$this->expectExceptionMessage('Unable to generate a URL for the named route "test" as such route does not exist.');
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'en'));

$code = $this->generatorDumper->dump([
'class' => 'RouteNotFoundLocalizedProjectUrlGenerator',
Expand All @@ -140,9 +140,9 @@ public function testDumpWithRouteNotFoundLocalizedRoutes()

public function testDumpWithFallbackLocaleLocalizedRoutes()
{
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.fr', (new Route('/tester/est/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'test'));
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'en'));
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'nl'));
$this->routeCollection->add('test.fr', (new Route('/tester/est/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'test')->setRequirement('_locale', 'fr'));

$code = $this->generatorDumper->dump([
'class' => 'FallbackLocaleLocalizedProjectUrlGenerator',
Expand Down Expand Up @@ -253,10 +253,10 @@ public function testDumpWithSchemeRequirement()

public function testDumpWithLocalizedRoutesPreserveTheGoodLocaleInTheUrl()
{
$this->routeCollection->add('foo.en', (new Route('/{_locale}/foo'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo'));
$this->routeCollection->add('foo.fr', (new Route('/{_locale}/foo'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'foo'));
$this->routeCollection->add('fun.en', (new Route('/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'fun'));
$this->routeCollection->add('fun.fr', (new Route('/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'fun'));
$this->routeCollection->add('foo.en', (new Route('/{_locale}/fork'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'en'));
$this->routeCollection->add('foo.fr', (new Route('/{_locale}/fourchette'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'fr'));
$this->routeCollection->add('fun.en', (new Route('/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'fun')->setRequirement('_locale', 'en'));
$this->routeCollection->add('fun.fr', (new Route('/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'fun')->setRequirement('_locale', 'fr'));

file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump([
'class' => 'PreserveTheGoodLocaleInTheUrlGenerator',
Expand All @@ -268,10 +268,10 @@ public function testDumpWithLocalizedRoutesPreserveTheGoodLocaleInTheUrl()

$phpGenerator = new \PreserveTheGoodLocaleInTheUrlGenerator($requestContext);

$this->assertSame('/fr/foo', $phpGenerator->generate('foo'));
$this->assertSame('/en/foo', $phpGenerator->generate('foo.en'));
$this->assertSame('/en/foo', $phpGenerator->generate('foo', ['_locale' => 'en']));
$this->assertSame('/en/foo', $phpGenerator->generate('foo.fr', ['_locale' => 'en']));
$this->assertSame('/fr/fourchette', $phpGenerator->generate('foo'));
$this->assertSame('/en/fork', $phpGenerator->generate('foo.en'));
$this->assertSame('/en/fork', $phpGenerator->generate('foo', ['_locale' => 'en']));
$this->assertSame('/fr/fourchette', $phpGenerator->generate('foo.fr', ['_locale' => 'en']));

$this->assertSame('/amusant', $phpGenerator->generate('fun'));
$this->assertSame('/fun', $phpGenerator->generate('fun.en'));
Expand Down
20 changes: 12 additions & 8 deletions src/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php
Expand Up @@ -171,6 +171,7 @@ public function testGenerateWithDefaultLocale()
foreach (['hr' => '/foo', 'en' => '/bar'] as $locale => $path) {
$localizedRoute = clone $route;
$localizedRoute->setDefault('_locale', $locale);
$localizedRoute->setRequirement('_locale', $locale);
$localizedRoute->setDefault('_canonical_route', $name);
$localizedRoute->setPath($path);
$routes->add($name.'.'.$locale, $localizedRoute);
Expand All @@ -195,6 +196,7 @@ public function testGenerateWithOverriddenParameterLocale()
foreach (['hr' => '/foo', 'en' => '/bar'] as $locale => $path) {
$localizedRoute = clone $route;
$localizedRoute->setDefault('_locale', $locale);
$localizedRoute->setRequirement('_locale', $locale);
$localizedRoute->setDefault('_canonical_route', $name);
$localizedRoute->setPath($path);
$routes->add($name.'.'.$locale, $localizedRoute);
Expand All @@ -219,6 +221,7 @@ public function testGenerateWithOverriddenParameterLocaleFromRequestContext()
foreach (['hr' => '/foo', 'en' => '/bar'] as $locale => $path) {
$localizedRoute = clone $route;
$localizedRoute->setDefault('_locale', $locale);
$localizedRoute->setRequirement('_locale', $locale);
$localizedRoute->setDefault('_canonical_route', $name);
$localizedRoute->setPath($path);
$routes->add($name.'.'.$locale, $localizedRoute);
Expand All @@ -240,18 +243,18 @@ public function testDumpWithLocalizedRoutesPreserveTheGoodLocaleInTheUrl()
{
$routeCollection = new RouteCollection();

$routeCollection->add('foo.en', (new Route('/{_locale}/foo'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo'));
$routeCollection->add('foo.fr', (new Route('/{_locale}/foo'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'foo'));
$routeCollection->add('fun.en', (new Route('/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'fun'));
$routeCollection->add('fun.fr', (new Route('/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'fun'));
$routeCollection->add('foo.en', (new Route('/{_locale}/fork'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'en'));
$routeCollection->add('foo.fr', (new Route('/{_locale}/fourchette'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'foo')->setRequirement('_locale', 'fr'));
$routeCollection->add('fun.en', (new Route('/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'fun')->setRequirement('_locale', 'en'));
$routeCollection->add('fun.fr', (new Route('/amusant'))->setDefault('_locale', 'fr')->setDefault('_canonical_route', 'fun')->setRequirement('_locale', 'fr'));

$urlGenerator = $this->getGenerator($routeCollection);
$urlGenerator->getContext()->setParameter('_locale', 'fr');

$this->assertSame('/app.php/fr/foo', $urlGenerator->generate('foo'));
$this->assertSame('/app.php/en/foo', $urlGenerator->generate('foo.en'));
$this->assertSame('/app.php/en/foo', $urlGenerator->generate('foo', ['_locale' => 'en']));
$this->assertSame('/app.php/en/foo', $urlGenerator->generate('foo.fr', ['_locale' => 'en']));
$this->assertSame('/app.php/fr/fourchette', $urlGenerator->generate('foo'));
$this->assertSame('/app.php/en/fork', $urlGenerator->generate('foo.en'));
$this->assertSame('/app.php/en/fork', $urlGenerator->generate('foo', ['_locale' => 'en']));
$this->assertSame('/app.php/fr/fourchette', $urlGenerator->generate('foo.fr', ['_locale' => 'en']));

$this->assertSame('/app.php/amusant', $urlGenerator->generate('fun'));
$this->assertSame('/app.php/fun', $urlGenerator->generate('fun.en'));
Expand All @@ -278,6 +281,7 @@ public function testGenerateWithInvalidLocale()
foreach (['hr' => '/foo', 'en' => '/bar'] as $locale => $path) {
$localizedRoute = clone $route;
$localizedRoute->setDefault('_locale', $locale);
$localizedRoute->setRequirement('_locale', $locale);
$localizedRoute->setDefault('_canonical_route', $name);
$localizedRoute->setPath($path);
$routes->add($name.'.'.$locale, $localizedRoute);
Expand Down

0 comments on commit d246e94

Please sign in to comment.