booking(AccommodationBookingStatus::Confirmed); $generator = $this->createMock(AccommodationBookingPdfGenerator::class); $generator->expects(self::once()) ->method('createDownloadResponse') ->with($booking) ->willReturn(new Response('%PDF-1.7')); $response = (new TestablePdfController($generator))->index($booking); self::assertSame(Response::HTTP_OK, $response->getStatusCode()); } /** * @dataProvider nonConfirmedStatuses */ public function testABookingThatIsNotConfirmedCannotBeDownloaded(AccommodationBookingStatus $status): void { $generator = $this->createMock(AccommodationBookingPdfGenerator::class); $generator->expects(self::never())->method('createDownloadResponse'); $controller = new TestablePdfController($generator); $response = $controller->index($this->booking($status)); self::assertSame(Response::HTTP_FOUND, $response->getStatusCode()); self::assertSame(['warning'], array_column($controller->flashes, 'type')); } /** * @return iterable */ public static function nonConfirmedStatuses(): iterable { yield 'draft' => [AccommodationBookingStatus::Draft]; yield 'open' => [AccommodationBookingStatus::Open]; yield 'received' => [AccommodationBookingStatus::Received]; yield 'discarded' => [AccommodationBookingStatus::Discarded]; } public function testAFailingGeneratorRedirectsWithAFlash(): void { $generator = $this->createMock(AccommodationBookingPdfGenerator::class); $generator->method('createDownloadResponse')->willThrowException(new \RuntimeException('keine Preise')); $controller = new TestablePdfController($generator); $response = $controller->index($this->booking(AccommodationBookingStatus::Confirmed)); self::assertSame(Response::HTTP_FOUND, $response->getStatusCode()); self::assertStringContainsString('keine Preise', (string) $controller->flashes[0]['message']); } private function booking(AccommodationBookingStatus $status): AccommodationBooking { $booking = new AccommodationBooking(); $booking->setStatus($status); $booking->setGroupName('Schulklasse 7b'); return $booking; } } final class TestablePdfController extends PdfController { /** @var list */ public array $flashes = []; protected function addFlash(string $type, mixed $message): void { $this->flashes[] = ['type' => $type, 'message' => $message]; } /** * @param array $parameters */ protected function generateUrl(string $route, array $parameters = [], int $referenceType = 1): string { return '/'.$route.'?'.http_build_query($parameters); } }