Files
e-ticket/tests/Entity/BilletTest.php

228 lines
6.6 KiB
PHP
Raw Permalink Normal View History

Add Billet entity, BilletDesign, ticket designer, CRUD billets, commissions - Create Billet entity: name, position, priceHT, quantity (nullable=unlimited), isGeneratedBillet, hasDefinedExit, notBuyable, type (billet/reservation_brocante/vote), stripeProductId, description, picture (VichUploader), category (ManyToOne CASCADE) - Create BilletDesign entity (OneToOne Event): accentColor, invitationTitle, invitationColor - Billet CRUD: add/edit/delete with access control, Stripe product sync on connected account - Billet reorder: drag & drop with position field, refactored sortable.js for both categories and billets - Ticket designer tab (custom offer only): accent color, invitation title/color, live iframe preview - A4 ticket preview: 4 zones (HG infos+billet, HD affiche, BG association, BD sortie+invitation), fake QR code SVG - Commission calculator JS: live breakdown of E-Ticket fee, Stripe fee (1.5%+0.25EUR), net amount - Sales recap on categories tab: qty sold, total HT, total commissions, total net - DisableProfilerSubscriber: disable web profiler toolbar on preview iframe - CSP: allow self in frame-src and frame-ancestors for preview iframe - Flysystem: dedicated billets.storage for billet images - Upload accept restricted to png/jpeg/webp/gif (no HEIC) - Makefile: add force_sql_dev command - CLAUDE.md: add rule to never modify existing migrations - Consolidate all migrations into single Version20260321111125 - Tests: BilletTest (20), BilletDesignTest (6), DisableProfilerSubscriberTest (5), billet-designer.test.js (7), commission-calculator.test.js (7), AccountControllerTest billet CRUD tests (11) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 12:19:46 +01:00
<?php
namespace App\Tests\Entity;
use App\Entity\Billet;
use App\Entity\Category;
use PHPUnit\Framework\TestCase;
use Symfony\Component\HttpFoundation\File\File;
class BilletTest extends TestCase
{
public function testNewBilletDefaults(): void
{
$billet = new Billet();
self::assertNull($billet->getId());
self::assertNull($billet->getName());
self::assertNull($billet->getCategory());
self::assertNull($billet->getDescription());
self::assertNull($billet->getPictureName());
self::assertNull($billet->getPictureFile());
self::assertNull($billet->getUpdatedAt());
self::assertSame(0, $billet->getPosition());
self::assertSame(0, $billet->getPriceHT());
self::assertNull($billet->getQuantity());
self::assertTrue($billet->isUnlimited());
self::assertTrue($billet->isGeneratedBillet());
self::assertFalse($billet->hasDefinedExit());
self::assertFalse($billet->isNotBuyable());
self::assertSame('billet', $billet->getType());
self::assertNull($billet->getStripeProductId());
self::assertInstanceOf(\DateTimeImmutable::class, $billet->getCreatedAt());
}
public function testSetAndGetCategory(): void
{
$billet = new Billet();
$category = new Category();
$result = $billet->setCategory($category);
self::assertSame($category, $billet->getCategory());
self::assertSame($billet, $result);
}
public function testSetAndGetName(): void
{
$billet = new Billet();
$result = $billet->setName('Entree VIP');
self::assertSame('Entree VIP', $billet->getName());
self::assertSame($billet, $result);
}
public function testSetAndGetPriceHT(): void
{
$billet = new Billet();
$result = $billet->setPriceHT(1500);
self::assertSame(1500, $billet->getPriceHT());
self::assertSame($billet, $result);
}
public function testGetPriceHTDecimal(): void
{
$billet = new Billet();
$billet->setPriceHT(1500);
self::assertSame(15.0, $billet->getPriceHTDecimal());
}
public function testGetPriceHTDecimalZero(): void
{
$billet = new Billet();
self::assertSame(0.0, $billet->getPriceHTDecimal());
}
public function testSetAndGetIsGeneratedBillet(): void
{
$billet = new Billet();
$result = $billet->setIsGeneratedBillet(false);
self::assertFalse($billet->isGeneratedBillet());
self::assertSame($billet, $result);
$billet->setIsGeneratedBillet(true);
self::assertTrue($billet->isGeneratedBillet());
}
public function testSetAndGetHasDefinedExit(): void
{
$billet = new Billet();
$result = $billet->setHasDefinedExit(true);
self::assertTrue($billet->hasDefinedExit());
self::assertSame($billet, $result);
$billet->setHasDefinedExit(false);
self::assertFalse($billet->hasDefinedExit());
}
public function testSetAndGetDescription(): void
{
$billet = new Billet();
$result = $billet->setDescription('Acces backstage inclus');
self::assertSame('Acces backstage inclus', $billet->getDescription());
self::assertSame($billet, $result);
}
public function testSetDescriptionNull(): void
{
$billet = new Billet();
$billet->setDescription('Test');
$billet->setDescription(null);
self::assertNull($billet->getDescription());
}
public function testSetAndGetPictureName(): void
{
$billet = new Billet();
$result = $billet->setPictureName('billet-vip.jpg');
self::assertSame('billet-vip.jpg', $billet->getPictureName());
self::assertSame($billet, $result);
}
public function testSetPictureFileUpdatesTimestamp(): void
{
$billet = new Billet();
self::assertNull($billet->getUpdatedAt());
$file = $this->createMock(File::class);
$result = $billet->setPictureFile($file);
self::assertSame($file, $billet->getPictureFile());
self::assertInstanceOf(\DateTimeImmutable::class, $billet->getUpdatedAt());
self::assertSame($billet, $result);
}
public function testSetAndGetPosition(): void
{
$billet = new Billet();
$result = $billet->setPosition(3);
self::assertSame(3, $billet->getPosition());
self::assertSame($billet, $result);
}
public function testSetAndGetQuantity(): void
{
$billet = new Billet();
$result = $billet->setQuantity(100);
self::assertSame(100, $billet->getQuantity());
self::assertFalse($billet->isUnlimited());
self::assertSame($billet, $result);
$billet->setQuantity(null);
self::assertNull($billet->getQuantity());
self::assertTrue($billet->isUnlimited());
}
public function testSetAndGetNotBuyable(): void
{
$billet = new Billet();
$result = $billet->setNotBuyable(true);
self::assertTrue($billet->isNotBuyable());
self::assertSame($billet, $result);
$billet->setNotBuyable(false);
self::assertFalse($billet->isNotBuyable());
}
public function testSetAndGetType(): void
{
$billet = new Billet();
$result = $billet->setType('reservation_brocante');
self::assertSame('reservation_brocante', $billet->getType());
self::assertSame($billet, $result);
$billet->setType('vote');
self::assertSame('vote', $billet->getType());
}
public function testSetAndGetStripeProductId(): void
{
$billet = new Billet();
$result = $billet->setStripeProductId('prod_abc123');
self::assertSame('prod_abc123', $billet->getStripeProductId());
self::assertSame($billet, $result);
$billet->setStripeProductId(null);
self::assertNull($billet->getStripeProductId());
}
public function testSetPictureFileNullDoesNotUpdateTimestamp(): void
{
$billet = new Billet();
$billet->setPictureFile(null);
self::assertNull($billet->getUpdatedAt());
self::assertNull($billet->getPictureFile());
}
public function testSetCategoryNull(): void
{
$billet = new Billet();
$billet->setCategory(null);
self::assertNull($billet->getCategory());
}
public function testGetCreatedAt(): void
{
$before = new \DateTimeImmutable();
$billet = new Billet();
$after = new \DateTimeImmutable();
self::assertGreaterThanOrEqual($before, $billet->getCreatedAt());
self::assertLessThanOrEqual($after, $billet->getCreatedAt());
}
}