Fix SonarQube/PHPStan issues: session type, returns count, coverage gaps

- AuditLog: move @var before ORM attribute for PHPStan visibility
- SubAccountPermissionSubscriber: use Session instead of FlashBagAwareSessionInterface
- SuspendedUserSubscriber: same Session type fix
- OrderController::create: merge expired + invalid cart into single return (4→3 returns)
- OrderControllerTest: add testCreateOrderUnlimitedBillet (covers clampQuantity unlimited branch)
- AccountControllerTest: add BilletOrder in soldCounts test (covers foreach $rows loop)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-23 14:47:02 +01:00
parent 544e6632da
commit 1af242c307
6 changed files with 38 additions and 11 deletions

View File

@@ -30,10 +30,6 @@ class OrderController extends AbstractController
throw $this->createNotFoundException(); throw $this->createNotFoundException();
} }
if ($event->getEndAt() && $event->getEndAt() < new \DateTimeImmutable()) {
return $this->json(['error' => 'Cet evenement est termine.'], 400);
}
$cart = json_decode($request->getContent(), true); $cart = json_decode($request->getContent(), true);
$eventUrl = $this->generateUrl('app_event_detail', [ $eventUrl = $this->generateUrl('app_event_detail', [
'orgaSlug' => $event->getAccount()->getSlug(), 'orgaSlug' => $event->getAccount()->getSlug(),
@@ -41,10 +37,9 @@ class OrderController extends AbstractController
'eventSlug' => $event->getSlug(), 'eventSlug' => $event->getSlug(),
]); ]);
if (!$this->isValidCart($cart)) { $isExpired = $event->getEndAt() && $event->getEndAt() < new \DateTimeImmutable();
$this->addFlash('error', 'Votre panier est vide.'); if ($isExpired || !$this->isValidCart($cart)) {
return $this->json($isExpired ? ['error' => 'Cet evenement est termine.'] : ['redirect' => $eventUrl], 400);
return $this->json(['redirect' => $eventUrl], 400);
} }
/** @var User|null $user */ /** @var User|null $user */

View File

@@ -22,8 +22,8 @@ class AuditLog
#[ORM\Column(nullable: true)] #[ORM\Column(nullable: true)]
private ?int $entityId = null; private ?int $entityId = null;
#[ORM\Column(type: 'json')]
/** @var array<string, mixed> */ /** @var array<string, mixed> */
#[ORM\Column(type: 'json')]
private array $data = []; private array $data = [];
#[ORM\Column(length: 255, nullable: true)] #[ORM\Column(length: 255, nullable: true)]

View File

@@ -82,7 +82,7 @@ class SubAccountPermissionSubscriber implements EventSubscriberInterface
private function deny(RequestEvent $event): void private function deny(RequestEvent $event): void
{ {
/** @var \Symfony\Component\HttpFoundation\Session\Flash\FlashBagAwareSessionInterface $session */ /** @var \Symfony\Component\HttpFoundation\Session\Session $session */
$session = $event->getRequest()->getSession(); $session = $event->getRequest()->getSession();
$session->getFlashBag()->add('error', 'Vous n\'avez pas la permission d\'effectuer cette action.'); $session->getFlashBag()->add('error', 'Vous n\'avez pas la permission d\'effectuer cette action.');
$event->setResponse(new RedirectResponse($this->urlGenerator->generate('app_account'))); $event->setResponse(new RedirectResponse($this->urlGenerator->generate('app_account')));

View File

@@ -41,7 +41,7 @@ class SuspendedUserSubscriber implements EventSubscriberInterface
return; return;
} }
/** @var \Symfony\Component\HttpFoundation\Session\Flash\FlashBagAwareSessionInterface $session */ /** @var \Symfony\Component\HttpFoundation\Session\Session $session */
$session = $event->getRequest()->getSession(); $session = $event->getRequest()->getSession();
$session->getFlashBag()->add('error', 'Votre compte a ete suspendu. Contactez '.$this->adminEmail.'.'); $session->getFlashBag()->add('error', 'Votre compte a ete suspendu. Contactez '.$this->adminEmail.'.');
$event->setResponse(new RedirectResponse($this->urlGenerator->generate('app_home'))); $event->setResponse(new RedirectResponse($this->urlGenerator->generate('app_home')));

View File

@@ -2108,6 +2108,13 @@ class AccountControllerTest extends WebTestCase
$item->setUnitPriceHT(1000); $item->setUnitPriceHT(1000);
$order->addItem($item); $order->addItem($item);
$em->persist($order); $em->persist($order);
$ticket = new \App\Entity\BilletOrder();
$ticket->setBilletBuyer($order);
$ticket->setBillet($billet);
$ticket->setBilletName('Entree');
$ticket->setUnitPriceHT(1000);
$em->persist($ticket);
$em->flush(); $em->flush();
$client->loginUser($user); $client->loginUser($user);

View File

@@ -208,6 +208,31 @@ class OrderControllerTest extends WebTestCase
self::assertStringContainsString('/informations', $data['redirect']); self::assertStringContainsString('/informations', $data['redirect']);
} }
public function testCreateOrderUnlimitedBillet(): void
{
$client = static::createClient();
$em = static::getContainer()->get(EntityManagerInterface::class);
$user = $this->createOrga($em);
[$event] = $this->createEventWithBillet($em, $user);
$category = $em->getRepository(Category::class)->findOneBy(['event' => $event]);
$unlimited = new Billet();
$unlimited->setName('Illimite');
$unlimited->setCategory($category);
$unlimited->setPriceHT(500);
$unlimited->setQuantity(null);
$em->persist($unlimited);
$em->flush();
$client->request('POST', '/evenement/'.$event->getId().'/commander', [], [], ['CONTENT_TYPE' => 'application/json'], json_encode([
['billetId' => $unlimited->getId(), 'qty' => 50],
]));
self::assertResponseIsSuccessful();
$data = json_decode($client->getResponse()->getContent(), true);
self::assertStringContainsString('/informations', $data['redirect']);
}
// === GUEST === // === GUEST ===
public function testGuestPageNotFound(): void public function testGuestPageNotFound(): void