Files
e-ticket/tests/Service/SiretServiceTest.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

154 lines
6.1 KiB
PHP

<?php
namespace App\Tests\Service;
use App\Service\SiretService;
use PHPUnit\Framework\TestCase;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\ItemInterface;
use Symfony\Contracts\HttpClient\HttpClientInterface;
use Symfony\Contracts\HttpClient\ResponseInterface;
class SiretServiceTest extends TestCase
{
public function testLookupReturnsDataWithLabels(): void
{
$response = $this->createMock(ResponseInterface::class);
$response->method('toArray')->willReturn([
'results' => [[
'nom_complet' => 'E-COSPLAY',
'nature_juridique' => '9220',
'activite_principale' => '93.29Z',
'siren' => '943121517',
]],
]);
$httpClient = $this->createMock(HttpClientInterface::class);
$httpClient->method('request')->willReturn($response);
$cache = $this->createMock(CacheInterface::class);
$cache->method('get')->willReturnCallback(fn (string $key, callable $callback) => $callback($this->createMock(ItemInterface::class)));
$projectDir = \dirname(__DIR__, 2);
$service = new SiretService($httpClient, $cache, $projectDir);
$data = $service->lookup('94312151700016');
self::assertNotNull($data);
self::assertSame('E-COSPLAY', $data['nom_complet']);
self::assertSame('Association declaree', $data['libelle_nature_juridique']);
self::assertNotNull($data['libelle_activite_principale']);
}
public function testLookupReturnsNullWhenNotFound(): void
{
$response = $this->createMock(ResponseInterface::class);
$response->method('toArray')->willReturn(['results' => []]);
$httpClient = $this->createMock(HttpClientInterface::class);
$httpClient->method('request')->willReturn($response);
$cache = $this->createMock(CacheInterface::class);
$cache->method('get')->willReturnCallback(fn (string $key, callable $callback) => $callback($this->createMock(ItemInterface::class)));
$service = new SiretService($httpClient, $cache, \dirname(__DIR__, 2));
self::assertNull($service->lookup('00000000000000'));
}
public function testLookupReturnsNullOnApiError(): void
{
$httpClient = $this->createMock(HttpClientInterface::class);
$httpClient->method('request')->willThrowException(new \RuntimeException('API down'));
$cache = $this->createMock(CacheInterface::class);
$cache->method('get')->willReturnCallback(fn (string $key, callable $callback) => $callback($this->createMock(ItemInterface::class)));
$service = new SiretService($httpClient, $cache, \dirname(__DIR__, 2));
self::assertNull($service->lookup('00000000000000'));
}
public function testGetNatureJuridiqueLabel(): void
{
$httpClient = $this->createMock(HttpClientInterface::class);
$cache = $this->createMock(CacheInterface::class);
$service = new SiretService($httpClient, $cache, \dirname(__DIR__, 2));
self::assertSame('Association declaree', $service->getNatureJuridiqueLabel('9220'));
self::assertSame('SAS', $service->getNatureJuridiqueLabel('5710'));
self::assertNull($service->getNatureJuridiqueLabel('0000'));
}
public function testGetNafLabel(): void
{
$httpClient = $this->createMock(HttpClientInterface::class);
$cache = $this->createMock(CacheInterface::class);
$service = new SiretService($httpClient, $cache, \dirname(__DIR__, 2));
self::assertNotNull($service->getNafLabel('93.29Z'));
self::assertNull($service->getNafLabel('XX.XXX'));
}
public function testLookupRnaReturnsData(): void
{
$response = $this->createMock(ResponseInterface::class);
$response->method('toArray')->willReturn([
'records' => [[
'fields' => [
'numero_rna' => 'W022006988',
'objet' => 'promotion du cosplay',
'association_type_libelle' => 'Associations loi du 1er juillet 1901',
],
]],
]);
$httpClient = $this->createMock(HttpClientInterface::class);
$httpClient->method('request')->willReturn($response);
$cache = $this->createMock(CacheInterface::class);
$cache->method('get')->willReturnCallback(fn (string $key, callable $callback) => $callback($this->createMock(ItemInterface::class)));
$service = new SiretService($httpClient, $cache, \dirname(__DIR__, 2));
$data = $service->lookupRna('W022006988');
self::assertNotNull($data);
self::assertSame('W022006988', $data['numero_rna']);
self::assertSame('promotion du cosplay', $data['objet']);
}
public function testLookupRnaReturnsNullWhenNotFound(): void
{
$response = $this->createMock(ResponseInterface::class);
$response->method('toArray')->willReturn(['records' => []]);
$httpClient = $this->createMock(HttpClientInterface::class);
$httpClient->method('request')->willReturn($response);
$cache = $this->createMock(CacheInterface::class);
$cache->method('get')->willReturnCallback(fn (string $key, callable $callback) => $callback($this->createMock(ItemInterface::class)));
$service = new SiretService($httpClient, $cache, \dirname(__DIR__, 2));
self::assertNull($service->lookupRna('W000000000'));
}
public function testClearCacheWithRna(): void
{
$httpClient = $this->createMock(HttpClientInterface::class);
$cache = $this->createMock(CacheInterface::class);
$cache->expects(self::exactly(2))->method('delete');
$service = new SiretService($httpClient, $cache, \dirname(__DIR__, 2));
$service->clearCache('12345678901234', 'W022006988');
}
public function testGetNafLabelMissingFile(): void
{
$httpClient = $this->createMock(HttpClientInterface::class);
$cache = $this->createMock(CacheInterface::class);
$service = new SiretService($httpClient, $cache, '/nonexistent');
self::assertNull($service->getNafLabel('93.29Z'));
}
}