Files
e-ticket/tests/Controller/RegistrationControllerTest.php
Serreau Jovann 100ff96c70 Add SIRET/RNA verification, organizer management, registration flow pages
SIRET/RNA verification:
- Create SiretService with API gouv lookup + JOAFE RNA lookup + cache pool (24h)
- Verification page: declared info vs API data side by side
- Display NAF code + label (from naf.json), nature juridique code + label
- Association/Entreprise/EI badges, ESS badge, RNA, coordonnees lat/long
- JOAFE section: objet, regime, domaine, dates, lieu, PDF download link
- Tranche effectif with readable labels
- Refresh cache button
- Page restricted to non-approved organizers only

Organizer approval flow:
- Approval form with offer (free/basic/custom) and commission rate (default 3%)
- Add commissionRate field to User entity + migration
- Rejection form with required reason textarea, sent in email
- Edit page for approved organizers: all fields modifiable
- Modify button in approved organizers table

Registration flow pages:
- Post-registration success page with email verification message
- Organizer gets additional 48h staff review notice
- Post-email-verification page: confirmed for buyers, 48h notice for organizers

Dashboard:
- Simplified Meilisearch sync to single button

Tests: SiretServiceTest (9), AdminControllerTest (31), RegistrationControllerTest updated, UserTest updated

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 20:25:04 +01:00

184 lines
6.1 KiB
PHP

<?php
namespace App\Tests\Controller;
use App\Entity\User;
use App\Service\MailerService;
use App\Service\MeilisearchService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class RegistrationControllerTest extends WebTestCase
{
public function testRegistrationRedirectsWhenAuthenticated(): void
{
$client = static::createClient();
$em = static::getContainer()->get(EntityManagerInterface::class);
$user = new User();
$user->setEmail('test-reg-auth-'.uniqid().'@example.com');
$user->setFirstName('Test');
$user->setLastName('User');
$user->setPassword('$2y$13$hashed');
$em->persist($user);
$em->flush();
$client->loginUser($user);
$client->request('GET', '/inscription');
self::assertResponseRedirects();
}
public function testRegistrationPageReturnsSuccess(): void
{
$client = static::createClient();
$client->request('GET', '/inscription');
self::assertResponseIsSuccessful();
}
public function testRegistrationWithValidDataSendsVerificationEmail(): void
{
$client = static::createClient();
$mailer = $this->createMock(MailerService::class);
$mailer->expects(self::once())->method('sendEmail');
static::getContainer()->set(MailerService::class, $mailer);
$client->request('POST', '/inscription', [
'first_name' => 'Jean',
'last_name' => 'Dupont',
'email' => 'test-register-'.uniqid().'@example.com',
'password' => 'Password123!',
]);
self::assertResponseIsSuccessful();
self::assertSelectorTextContains('h1', 'Compte cree');
}
public function testRegistrationAsOrganizer(): void
{
$client = static::createClient();
$mailer = $this->createMock(MailerService::class);
$mailer->expects(self::once())->method('sendEmail');
static::getContainer()->set(MailerService::class, $mailer);
$client->request('POST', '/inscription', [
'type' => 'organizer',
'first_name' => 'Marie',
'last_name' => 'Martin',
'email' => 'test-orga-'.uniqid().'@example.com',
'password' => 'Password123!',
'company_name' => 'Mon Association',
'siret' => '12345678901234',
'address' => '12 rue de la Paix',
'postal_code' => '75001',
'city' => 'Paris',
'phone' => '0612345678',
]);
self::assertResponseIsSuccessful();
self::assertSelectorTextContains('h1', 'Compte cree');
self::assertSelectorTextContains('body', '48h');
}
public function testRegistrationWithDuplicateEmail(): void
{
$email = 'duplicate-'.uniqid().'@example.com';
$client = static::createClient();
$mailer = $this->createMock(MailerService::class);
static::getContainer()->set(MailerService::class, $mailer);
$client->request('POST', '/inscription', [
'first_name' => 'Jean',
'last_name' => 'Dupont',
'email' => $email,
'password' => 'Password123!',
]);
$client->request('POST', '/inscription', [
'first_name' => 'Marie',
'last_name' => 'Martin',
'email' => $email,
'password' => 'Password456!',
]);
self::assertResponseIsSuccessful();
}
public function testVerifyEmailWithValidToken(): void
{
$client = static::createClient();
$em = static::getContainer()->get(EntityManagerInterface::class);
$meilisearch = $this->createMock(MeilisearchService::class);
static::getContainer()->set(MeilisearchService::class, $meilisearch);
$user = new User();
$user->setEmail('test-verify-'.uniqid().'@example.com');
$user->setFirstName('Test');
$user->setLastName('User');
$user->setPassword('$2y$13$hashed');
$user->setEmailVerificationToken('valid-token-'.uniqid());
$em->persist($user);
$em->flush();
$token = $user->getEmailVerificationToken();
$client->request('GET', '/verification-email/'.$token);
self::assertResponseIsSuccessful();
self::assertSelectorTextContains('h1', 'Email verifie');
$em->refresh($user);
self::assertTrue($user->isVerified());
self::assertNotNull($user->getEmailVerifiedAt());
self::assertNull($user->getEmailVerificationToken());
}
public function testVerifyEmailOrganizerSendsNotificationEmails(): void
{
$client = static::createClient();
$em = static::getContainer()->get(EntityManagerInterface::class);
$mailer = $this->createMock(MailerService::class);
$mailer->expects(self::exactly(2))->method('sendEmail');
static::getContainer()->set(MailerService::class, $mailer);
$meilisearch = $this->createMock(MeilisearchService::class);
static::getContainer()->set(MeilisearchService::class, $meilisearch);
$user = new User();
$user->setEmail('test-orga-verify-'.uniqid().'@example.com');
$user->setFirstName('Marie');
$user->setLastName('Martin');
$user->setPassword('$2y$13$hashed');
$user->setRoles(['ROLE_ORGANIZER']);
$user->setCompanyName('Mon Asso');
$user->setSiret('12345678901234');
$user->setAddress('12 rue de la Paix');
$user->setPostalCode('75001');
$user->setCity('Paris');
$user->setPhone('0612345678');
$user->setEmailVerificationToken('orga-token-'.uniqid());
$em->persist($user);
$em->flush();
$token = $user->getEmailVerificationToken();
$client->request('GET', '/verification-email/'.$token);
self::assertResponseIsSuccessful();
self::assertSelectorTextContains('body', '48h');
}
public function testVerifyEmailWithInvalidToken(): void
{
$client = static::createClient();
$client->request('GET', '/verification-email/invalid-token');
self::assertResponseRedirects('/connexion');
}
}