From bd3dcc31cef593f23def631a8e38c2cb8432127d Mon Sep 17 00:00:00 2001
From: Fabrice Gangler <fabrice.gangler@adullact.org>
Date: Mon, 24 Mar 2025 00:41:16 +0100
Subject: [PATCH] test(organisation): allow URL wihtout slug or with not valid
 slug

- One organization page without slug redirect to valid url
- One organization page with bad slug redirect to valid url
---
 .../OrganizationDisplayController.php         | 23 ++++++++++
 .../FunctionalTestOrganizationPagesTest.php   | 45 +++++++++++++++++++
 2 files changed, 68 insertions(+)

diff --git a/webapp/src/Controller/Organization/OrganizationDisplayController.php b/webapp/src/Controller/Organization/OrganizationDisplayController.php
index 49a976d..b7acb5e 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 e00537f..e11c006 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',
+        );
+    }
+
 }
-- 
GitLab