Files
crm_ecosplay/tests/Controller/SetPasswordControllerTest.php
Serreau Jovann 0f7c752d9a test: ajout tests SetPasswordController, SonarBadgeController, StatusPageController, WebhookDocuSealController
tests/Controller/SetPasswordControllerTest.php (nouveau, 5 tests):
- testGetFormRendered: token valide, affiche le formulaire
- testTokenExpired: token invalide, affiche la page expired
- testPostPasswordTooShort: mot de passe < 8 caracteres, erreur
- testPostPasswordMismatch: confirmation differente, erreur
- testPostSuccess: mot de passe valide, flush + redirect 302

tests/Controller/SonarBadgeControllerTest.php (nouveau, 2 tests):
- testBadgeSuccess: metric valide, retourne SVG avec Content-Type image/svg+xml
- testBadgeInvalidMetric: metric invalide, retourne 404

tests/Controller/StatusPageControllerTest.php (reecrit, 2 tests):
- testIndexEmpty: aucune categorie, retourne 200
- testIndexWithServices: categorie avec service, QueryBuilder mocke
  pour les logs, retourne 200

tests/Controller/WebhookDocuSealControllerTest.php (nouveau, 9 tests):
- testUnauthorized: mauvais secret dans le header, retourne 401
- testInvalidPayload: JSON invalide, retourne 400
- testIgnoredDocType: doc_type autre que attestation, retourne ignored
- testEmptySecret: secret vide bypass la verification
- testFormViewedAttestationNotFound: attestation introuvable, retourne 404
- testFormViewedAttestationFound: attestation trouvee, retourne 200
- testFormStarted: evenement started, retourne 200
- testFormDeclined: evenement declined, retourne 200
- testUnknownEvent: evenement inconnu, retourne ignored

Resultat: 368 tests, 718 assertions, 0 failures, 0 notices

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 00:12:54 +02:00

146 lines
5.6 KiB
PHP

<?php
namespace App\Tests\Controller;
use App\Controller\SetPasswordController;
use App\Entity\User;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\RouterInterface;
use Twig\Environment;
class SetPasswordControllerTest extends TestCase
{
private function createController(Request $request): SetPasswordController
{
$twig = $this->createStub(Environment::class);
$twig->method('render')->willReturn('<html></html>');
$router = $this->createStub(RouterInterface::class);
$router->method('generate')->willReturn('/');
$requestStack = new RequestStack();
$requestStack->push($request);
$container = $this->createStub(ContainerInterface::class);
$container->method('has')->willReturn(true);
$container->method('get')->willReturnMap([
['twig', $twig],
['router', $router],
['request_stack', $requestStack],
]);
$controller = new SetPasswordController();
$controller->setContainer($container);
return $controller;
}
public function testGetFormRendered(): void
{
$user = new User();
$user->setEmail('t@t.com');
$user->setFirstName('T');
$user->setLastName('T');
$user->setPassword('h');
$user->setTempPassword('valid-token');
$repo = $this->createStub(UserRepository::class);
$repo->method('findOneBy')->willReturn($user);
$request = new Request();
$request->setSession(new Session(new MockArraySessionStorage()));
$controller = $this->createController($request);
$response = $controller->index('valid-token', $request, $repo, $this->createStub(UserPasswordHasherInterface::class), $this->createStub(EntityManagerInterface::class));
$this->assertSame(200, $response->getStatusCode());
}
public function testTokenExpired(): void
{
$repo = $this->createStub(UserRepository::class);
$repo->method('findOneBy')->willReturn(null);
$request = new Request();
$request->setSession(new Session(new MockArraySessionStorage()));
$controller = $this->createController($request);
$response = $controller->index('bad-token', $request, $repo, $this->createStub(UserPasswordHasherInterface::class), $this->createStub(EntityManagerInterface::class));
$this->assertSame(200, $response->getStatusCode());
}
public function testPostPasswordTooShort(): void
{
$user = new User();
$user->setEmail('t@t.com');
$user->setFirstName('T');
$user->setLastName('T');
$user->setPassword('h');
$user->setTempPassword('token');
$repo = $this->createStub(UserRepository::class);
$repo->method('findOneBy')->willReturn($user);
$request = new Request([], ['password' => 'short', 'password_confirm' => 'short']);
$request->setMethod('POST');
$request->setSession(new Session(new MockArraySessionStorage()));
$controller = $this->createController($request);
$response = $controller->index('token', $request, $repo, $this->createStub(UserPasswordHasherInterface::class), $this->createStub(EntityManagerInterface::class));
$this->assertSame(200, $response->getStatusCode());
}
public function testPostPasswordMismatch(): void
{
$user = new User();
$user->setEmail('t@t.com');
$user->setFirstName('T');
$user->setLastName('T');
$user->setPassword('h');
$user->setTempPassword('token');
$repo = $this->createStub(UserRepository::class);
$repo->method('findOneBy')->willReturn($user);
$request = new Request([], ['password' => 'password123', 'password_confirm' => 'different123']);
$request->setMethod('POST');
$request->setSession(new Session(new MockArraySessionStorage()));
$controller = $this->createController($request);
$response = $controller->index('token', $request, $repo, $this->createStub(UserPasswordHasherInterface::class), $this->createStub(EntityManagerInterface::class));
$this->assertSame(200, $response->getStatusCode());
}
public function testPostSuccess(): void
{
$user = new User();
$user->setEmail('t@t.com');
$user->setFirstName('T');
$user->setLastName('T');
$user->setPassword('h');
$user->setTempPassword('token');
$repo = $this->createStub(UserRepository::class);
$repo->method('findOneBy')->willReturn($user);
$hasher = $this->createStub(UserPasswordHasherInterface::class);
$hasher->method('hashPassword')->willReturn('hashed');
$em = $this->createMock(EntityManagerInterface::class);
$em->expects($this->once())->method('flush');
$request = new Request([], ['password' => 'newpassword8', 'password_confirm' => 'newpassword8']);
$request->setMethod('POST');
$request->setSession(new Session(new MockArraySessionStorage()));
$controller = $this->createController($request);
$response = $controller->index('token', $request, $repo, $hasher, $em);
$this->assertSame(302, $response->getStatusCode());
}
}