Files
crm_ecosplay/tests/Controller/MainControllersTest.php
Serreau Jovann f396b759f9 fix: corriger les 18 tests en echec apres le refactoring
tests/TestUserProvider.php (nouveau):
- Implementation de UserProviderInterface pour l'environnement test
- loadUserByIdentifier(), refreshUser(), supportsClass()
- Le service etait reference dans security.yaml when@test mais
  n'existait pas

config/services_test.yaml (nouveau):
- Enregistrement de App\Tests\TestUserProvider comme service public
  pour que le container test puisse le resoudre

tests/Controller/LegalControllerTest.php:
- Selecteurs CSS mis a jour: .border-red-600 remplace par .border-red-300
  et .border-green-600 par .border-green-300 (glassmorphism)

tests/Controller/Admin/AdminControllersTest.php:
- testSyncIndex(): ajout de PriceAutomaticRepository et
  StripeWebhookSecretRepository dans les arguments de
  SyncController::index() (4 arguments au lieu de 2)

tests/Controller/MainControllersTest.php:
- testForgotPasswordFullFlow(): sendEmail attendu 2 fois au lieu de 1
  (step 2 envoie le code, step 3 envoie la confirmation de changement)

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

150 lines
6.1 KiB
PHP

<?php
namespace App\Tests\Controller;
use App\Controller\ForgotPasswordController;
use App\Controller\HomeController;
use App\Controller\KeycloakController;
use App\Controller\SecurityController;
use App\Controller\SetPasswordController;
use App\Entity\User;
use App\Repository\UserRepository;
use App\Service\MailerService;
use Doctrine\ORM\EntityManagerInterface;
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
use KnpU\OAuth2ClientBundle\Client\OAuth2ClientInterface;
use PHPUnit\Framework\TestCase;
use Psr\Container\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
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 Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Twig\Environment;
class MainControllersTest extends TestCase
{
private function createContainer(array $services = []): ContainerInterface
{
$container = $this->createMock(ContainerInterface::class);
$container->expects($this->any())->method('has')->willReturnCallback(fn($id) => isset($services[$id]));
$container->expects($this->any())->method('get')->willReturnCallback(fn($id) => $services[$id] ?? null);
return $container;
}
private function setupController($controller, array $services = []): void
{
$session = new Session(new MockArraySessionStorage());
$stack = $this->createStub(RequestStack::class);
$stack->method('getSession')->willReturn($session);
$router = $this->createStub(RouterInterface::class);
$router->method('generate')->willReturn('/redirect-url');
$defaultServices = [
'twig' => $this->createStub(Environment::class),
'router' => $router,
'security.authorization_checker' => $this->createStub(AuthorizationCheckerInterface::class),
'security.token_storage' => $this->createStub(TokenStorageInterface::class),
'request_stack' => $stack,
'parameter_bag' => $this->createStub(\Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface::class),
];
$controller->setContainer($this->createContainer(array_merge($defaultServices, $services)));
}
public function testSecurityLogout(): void
{
$controller = new SecurityController();
$this->expectException(\LogicException::class);
$controller->logout();
}
public function testKeycloakConnect(): void
{
$client = $this->createMock(OAuth2ClientInterface::class);
$client->method('redirect')->willReturn(new \Symfony\Component\HttpFoundation\RedirectResponse('http://k'));
$registry = $this->createMock(ClientRegistry::class);
$registry->method('getClient')->willReturn($client);
$controller = new KeycloakController();
$this->assertSame('http://k', $controller->connect($registry)->getTargetUrl());
}
public function testKeycloakCheck(): void
{
$controller = new KeycloakController();
$this->assertSame(200, $controller->check()->getStatusCode());
}
public function testHomeIndex(): void
{
$controller = new HomeController();
$this->setupController($controller);
$this->assertSame(200, $controller->index()->getStatusCode());
}
public function testSetPasswordSuccess(): void
{
$user = new User();
$repo = $this->createStub(UserRepository::class);
$repo->method('findOneBy')->willReturn($user);
$hasher = $this->createStub(UserPasswordHasherInterface::class);
$em = $this->createMock(EntityManagerInterface::class);
$em->expects($this->once())->method('flush');
$controller = new SetPasswordController();
$this->setupController($controller);
$request = new Request([], ['password' => 'newpassword8', 'password_confirm' => 'newpassword8']);
$request->setMethod('POST');
$response = $controller->index('token', $request, $repo, $hasher, $em);
$this->assertSame(302, $response->getStatusCode());
}
public function testForgotPasswordFullFlow(): void
{
$user = new User();
$repo = $this->createStub(UserRepository::class);
$repo->method('findOneBy')->willReturn($user);
$mailer = $this->createMock(MailerService::class);
$em = $this->createMock(EntityManagerInterface::class);
$hasher = $this->createStub(UserPasswordHasherInterface::class);
$twig = $this->createStub(Environment::class);
$controller = new ForgotPasswordController();
$this->setupController($controller, ['twig' => $twig]);
// 1. GET
$request = new Request();
$session = new Session(new MockArraySessionStorage());
$request->setSession($session);
$response = $controller->index($request, $repo, $mailer, $em, $hasher, $twig);
$this->assertSame(200, $response->getStatusCode());
// 2. POST send_code
$request = new Request([], ['action' => 'send_code', 'email' => 't@t.com']);
$request->setMethod('POST');
$request->setSession($session);
$mailer->expects($this->exactly(2))->method('sendEmail');
$response = $controller->index($request, $repo, $mailer, $em, $hasher, $twig);
$this->assertSame(200, $response->getStatusCode());
$code = $session->get('reset_code');
// 3. POST reset
$request = new Request([], ['action' => 'reset', 'code' => $code, 'password' => 'newpassword8']);
$request->setMethod('POST');
$request->setSession($session);
$em->expects($this->once())->method('flush');
$response = $controller->index($request, $repo, $mailer, $em, $hasher, $twig);
$this->assertSame(302, $response->getStatusCode());
}
}