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>
150 lines
6.1 KiB
PHP
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());
|
|
}
|
|
}
|