diff --git a/webapp/src/Controller/Organization/OrganizationDisplayController.php b/webapp/src/Controller/Organization/OrganizationDisplayController.php index 49a976d8c4be5dfee8867bdc14745158da9ce046..b7acb5ec4a814e3b54e565519c2c1ae8913485f5 100644 --- a/webapp/src/Controller/Organization/OrganizationDisplayController.php +++ b/webapp/src/Controller/Organization/OrganizationDisplayController.php @@ -66,6 +66,29 @@ public function displayOneOrganizationPageAllowToChangeLocaleInUrl( } + #[Route( + path: [ + 'en' => '/{_locale}/organization/{id}/', + 'fr' => '/{_locale}/organisation/{id}/', + ], + name: 'app_anonymous_organization_display_one_organization_without_slug', + methods: ['GET', 'HEAD'] + )] + public function oneOrganizatioUrlWithoutSlugRedirectToValidUrl( + string $_locale, + Organization $organization, + ): RedirectResponse { + $newUrl = $this->generateUrl('app_anonymous_organization_display_one_organization', [ + '_locale' => $_locale, + 'id' => $organization->getId(), + 'slug' => $organization->getSlug(), + ]); + return new RedirectResponse( + url: $newUrl, + status: Response::HTTP_PERMANENTLY_REDIRECT // 308 Permanent Redirect + ); + } + #[Route( path: [ 'en' => '/{_locale}/organization/{id}/{slug}/', diff --git a/webapp/tests/Functional/Organization/FunctionalTestOrganizationPagesTest.php b/webapp/tests/Functional/Organization/FunctionalTestOrganizationPagesTest.php index e00537f1a4ccdf130f9763f9e337dc4f255fbe7f..e11c006e32d4fde2063480bd7dc9d1536933c01e 100644 --- a/webapp/tests/Functional/Organization/FunctionalTestOrganizationPagesTest.php +++ b/webapp/tests/Functional/Organization/FunctionalTestOrganizationPagesTest.php @@ -27,6 +27,7 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; /** + * @group allow_mutation_testing_by_infection * @group gogogo */ class FunctionalTestOrganizationPagesTest extends WebTestCase @@ -94,4 +95,48 @@ public function testOneOrganizationPageAllowToChangeLocaleInUrl(): void expectedNewRoute: 'app_anonymous_organization_display_one_organization', ); } + + + public function testOneOrganizationPageWithoutSlugRedirectToValidUrl(): void + { + $organizationId = AppOrganizationFixtures::ORGANIZATIONS[3]['id']; + $organizationSlug = AppOrganizationFixtures::ORGANIZATIONS[$organizationId]['slug']; + $client = static::createClient(); + $this->checkRedirectionToNewUrl( + client: $client, + currentUrl: "/en/organization/$organizationId/", + expectedNewUrl: "/en/organization/$organizationId/$organizationSlug/", + expectedCurrentRoute: 'app_anonymous_organization_display_one_organization_without_slug', + expectedNewRoute: 'app_anonymous_organization_display_one_organization', + ); + $this->checkRedirectionToNewUrl( + client: $client, + currentUrl: "/fr/organisation/$organizationId/", + expectedNewUrl: "/fr/organisation/$organizationId/$organizationSlug/", + expectedCurrentRoute: 'app_anonymous_organization_display_one_organization_without_slug', + expectedNewRoute: 'app_anonymous_organization_display_one_organization', + ); + } + + public function testOneOrganizationPageWithBadSlugRedirectToValidUrl(): void + { + $organizationId = AppOrganizationFixtures::ORGANIZATIONS[3]['id']; + $organizationSlug = AppOrganizationFixtures::ORGANIZATIONS[$organizationId]['slug']; + $client = static::createClient(); + $this->checkRedirectionToNewUrl( + client: $client, + currentUrl: "/en/organization/$organizationId/not-valid-slug/", + expectedNewUrl: "/en/organization/$organizationId/$organizationSlug/", + expectedCurrentRoute: 'app_anonymous_organization_display_one_organization', + expectedNewRoute: 'app_anonymous_organization_display_one_organization', + ); + $this->checkRedirectionToNewUrl( + client: $client, + currentUrl: "/fr/organisation/$organizationId/not-valid-slug/", + expectedNewUrl: "/fr/organisation/$organizationId/$organizationSlug/", + expectedCurrentRoute: 'app_anonymous_organization_display_one_organization', + expectedNewRoute: 'app_anonymous_organization_display_one_organization', + ); + } + }