createMock(User::class);
$user->method('getLogoName')->willReturn(null);
$event = $this->createMock(Event::class);
$event->method('getAccount')->willReturn($user);
$order = $this->createMock(BilletBuyer::class);
$order->method('getEvent')->willReturn($event);
$order->method('getOrderNumber')->willReturn('2026-03-15-1');
return $order;
}
public function testGeneratePdfReturnsPdfContent(): void
{
$twig = $this->createMock(Environment::class);
$twig->method('render')->with('pdf/invoice.html.twig', $this->anything())
->willReturn('
Facture
');
$service = new InvoiceService($twig, '/tmp/test-project');
$order = $this->createMockOrder();
$pdf = $service->generatePdf($order);
self::assertNotEmpty($pdf);
self::assertStringStartsWith('%PDF', $pdf);
}
public function testGeneratePdfPassesCorrectData(): void
{
$twig = $this->createMock(Environment::class);
$order = $this->createMockOrder();
$twig->expects($this->once())->method('render')->with(
'pdf/invoice.html.twig',
$this->callback(function (array $params) use ($order) {
return $params['order'] === $order
&& $params['organizer'] === $order->getEvent()->getAccount()
&& '' === $params['logoBase64'];
})
)->willReturn('test');
$service = new InvoiceService($twig, '/tmp/nonexistent-project');
$service->generatePdf($order);
}
public function testGenerateToFileCreatesFile(): void
{
$twig = $this->createMock(Environment::class);
$twig->method('render')->willReturn('invoice');
$tmpDir = sys_get_temp_dir().'/invoice-test-'.uniqid();
mkdir($tmpDir);
$service = new InvoiceService($twig, $tmpDir);
$order = $this->createMockOrder();
$path = $service->generateToFile($order);
self::assertFileExists($path);
self::assertStringStartsWith('%PDF', (string) file_get_contents($path));
self::assertStringContainsString('facture_2026-03-15-1.pdf', $path);
// Cleanup
unlink($path);
rmdir($tmpDir.'/var/invoices');
rmdir($tmpDir.'/var');
rmdir($tmpDir);
}
public function testGeneratePdfWithLogo(): void
{
$twig = $this->createMock(Environment::class);
$tmpDir = sys_get_temp_dir().'/invoice-logo-test-'.uniqid();
mkdir($tmpDir);
mkdir($tmpDir.'/public', 0o755, true);
file_put_contents($tmpDir.'/public/logo.png', 'fake-png-data');
$twig->expects($this->once())->method('render')->with(
'pdf/invoice.html.twig',
$this->callback(fn (array $params) => '' !== $params['logoBase64'] && str_starts_with($params['logoBase64'], 'data:'))
)->willReturn('test');
$service = new InvoiceService($twig, $tmpDir);
$order = $this->createMockOrder();
$service->generatePdf($order);
// Cleanup
unlink($tmpDir.'/public/logo.png');
rmdir($tmpDir.'/public');
rmdir($tmpDir);
}
}