feat: Implémente la fonctionnalité de réinitialisation du mot de passe

Ce commit introduit la fonctionnalité de réinitialisation du mot de passe pour les utilisateurs.

Les modifications apportées sont les suivantes :

- Ajout de l'entité `AccountResetPasswordRequest` pour gérer les requêtes de réinitialisation de mot de passe.
- Ajout du repository `AccountResetPasswordRequestRepository` pour interagir avec l'entité `AccountResetPasswordRequest`.
- Ajout du formulaire `RequestPasswordRequestType` pour permettre aux utilisateurs de demander une réinitialisation de mot de passe.
- Ajout de l'événement `ResetPasswordEvent` pour déclencher le processus de réinitialisation du mot de passe.
- Ajout de la route `/forgot-password` dans le `HomeController` pour gérer la demande de réinitialisation.
- Création des templates twig `admin/forgot-password.twig` et `admin/base.twig` et `form_tailwind.twig` pour la gestion de l'affichage du formulaire et de la base de l'interface admin.
- Modification des templates twig `admin/login.twig` pour ajouter un lien vers la page de réinitialisation de mot de passe.
- Mise à jour du fichier `assets/app.scss` pour inclure des styles CSS personnalisés.
- Ajout de tests unitaires pour l'entité, le repository et le formulaire.
- Ajout de la configuration twig pour prendre en charge les formulaires avec tailwind
- Ajout des règles d'exclusions sonar dans `sonar-project.properties`
This commit is contained in:
Serreau Jovann
2025-07-18 11:25:13 +02:00
parent 617eae9f24
commit 6d7a9552f6
15 changed files with 586 additions and 83 deletions

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Tests\Entity;
use App\Entity\Account;
use App\Entity\AccountResetPasswordRequest;
use PHPUnit\Framework\TestCase;
use ReflectionClass;
class AccountResetPasswordRequestTest extends TestCase
{
public function testEntitySettersAndGetters(): void
{
$account = new Account(); // Ou crée un mock si la classe est complexe
$token = 'reset-token-example';
$now = new \DateTimeImmutable();
$expires = $now->modify('+1 hour');
$resetRequest = new AccountResetPasswordRequest();
$resetRequest->setAccount($account);
$resetRequest->setToken($token);
$resetRequest->setRequestedAt($now);
$resetRequest->setExpiresAt($expires);
$refClass = new ReflectionClass($resetRequest);
$idProp = $refClass->getProperty('id');
$idProp->setAccessible(true);
$idProp->setValue($resetRequest, 123);
$this->assertSame($account, $resetRequest->getAccount());
$this->assertSame($token, $resetRequest->getToken());
$this->assertSame($now, $resetRequest->getRequestedAt());
$this->assertSame($expires, $resetRequest->getExpiresAt());
$this->assertSame(123, $resetRequest->getId());
}
}

View File

@@ -0,0 +1,51 @@
<?php
namespace App\Tests\Form;
use App\Form\RequestPasswordRequestType;
use App\Service\ResetPassword\Event\ResetPasswordEvent;
use Symfony\Component\Form\Test\TypeTestCase;
class RequestPasswordRequestTypeTest extends TypeTestCase
{
public function testSubmitValidData(): void
{
$formData = [
'email' => 'user@example.com',
];
$model = new ResetPasswordEvent(); // l'objet lié au formulaire
$form = $this->factory->create(RequestPasswordRequestType::class, $model);
// Soumission du formulaire avec des données valides
$form->submit($formData);
$this->assertTrue($form->isSynchronized());
$this->assertTrue($form->isValid());
$expected = new ResetPasswordEvent();
$expected->setEmail('user@example.com'); // Assure-toi que la méthode setEmail existe
$this->assertEquals($expected, $model);
// Vérification de la création des champs dans le formulaire
$view = $form->createView();
$children = $view->children;
$this->assertArrayHasKey('email', $children);
}
public function testSubmitInvalidEmail(): void
{
$formData = [
'email' => 'not-an-email',
];
$model = new ResetPasswordEvent();
$form = $this->factory->create(RequestPasswordRequestType::class, $model);
$form->submit($formData);
$this->assertTrue($form->isValid());
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace App\Tests\Repository;
use App\Entity\AccountResetPasswordRequest;
use App\Repository\AccountResetPasswordRequestRepository;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Doctrine\ORM\EntityManagerInterface;
class AccountResetPasswordRequestRepositoryTest extends KernelTestCase
{
private ?EntityManagerInterface $entityManager;
private ?AccountResetPasswordRequestRepository $accountResetPasswordRequestRepository;
protected function setUp(): void
{
self::bootKernel();
$this->entityManager = self::getContainer()->get('doctrine')->getManager();
$this->accountResetPasswordRequestRepository = $this->entityManager->getRepository(AccountResetPasswordRequest::class);
}
public function testRepositoryExistsAndIsCorrectInstance(): void
{
$this->assertInstanceOf(AccountResetPasswordRequestRepository::class, $this->accountResetPasswordRequestRepository);
}
protected function tearDown(): void
{
parent::tearDown();
$this->entityManager->close();
$this->entityManager = null; // Avoid memory leaks
$this->accountResetPasswordRequestRepository = null;
}
}