wip: group inquiries and booking

This commit is contained in:
Björn Fromme committed 2026-07-16 09:03:42 +02:00
1 parent 1e59d38eb4
commit 12760844e2
34 files changed
+1810 -436

No files matched your search

@@ -6,17 +6,13 @@ namespace App\Tests\Controller\Accommodation;
use App\Controller\Groups\Step3Controller;
use App\Entity\Groups\Accommodation;
use App\Entity\Groups\AccommodationBooking;
use App\Entity\Groups\AdditionalService;
use App\Entity\Groups\BoardService;
use App\Form\AccommodationStep3ConfirmationType;
use App\Form\AccommodationStep3Type;
use App\Form\Model\AccommodationBookingDto;
use App\Service\AccommodationBookingService;
use App\Service\AccommodationSessionManager;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\SubmitButton;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
@@ -42,13 +38,7 @@ class Step3ControllerTest extends TestCase
$sessionManager = new AccommodationSessionManager();
$sessionManager->save($request, $dto);
$form = $this->createMock(FormInterface::class);
$form
->method('handleRequest')
->willReturnSelf();
$form
->method('isSubmitted')
->willReturn(false);
$form = $this->createFormMock(submitted: false, valid: false);
$accommodation = (new Accommodation())
->setName('Hotel')
@@ -84,7 +74,7 @@ class Step3ControllerTest extends TestCase
self::assertSame([$additionalService], $controller->renderedParameters['ctx']->additionalServices);
}
public function testClickingBuchenOpensConfirmationModalWithoutPersisting(): void
public function testValidSubmitRedirectsToStep4WithoutPersisting(): void
{
$dto = new AccommodationBookingDto();
$dto->currentStep = 3;
@@ -98,20 +88,7 @@ class Step3ControllerTest extends TestCase
$sessionManager = new AccommodationSessionManager();
$sessionManager->save($request, $dto);
$submitBookingButton = $this->getMockBuilder(SubmitButton::class)
->disableOriginalConstructor()
->onlyMethods(['isClicked'])
->getMock();
$submitBookingButton->method('isClicked')->willReturn(true);
$mainForm = $this->createMock(FormInterface::class);
$mainForm->method('handleRequest')->willReturnSelf();
$mainForm->method('isSubmitted')->willReturn(true);
$mainForm->method('isValid')->willReturn(true);
$mainForm->method('has')->with('submitBooking')->willReturn(true);
$mainForm->method('get')->with('submitBooking')->willReturn($submitBookingButton);
$confirmationForm = $this->createMock(FormInterface::class);
$form = $this->createFormMock(submitted: true, valid: true);
$accommodation = (new Accommodation())
->setName('Hotel')
@@ -126,115 +103,65 @@ class Step3ControllerTest extends TestCase
'groupedAdditionalServices' => [],
'ungroupedAdditionalServices' => [],
]);
$bookingService->expects(self::never())->method('persist');
$bookingService->expects(self::never())->method('finalizeBooking');
$controller = new TestableAccommodationStep3Controller(
$bookingService,
$sessionManager,
[AccommodationStep3Type::class => $mainForm, AccommodationStep3ConfirmationType::class => $confirmationForm],
);
$controller = new TestableAccommodationStep3Controller($bookingService, $sessionManager, $form);
$response = $controller->index($request);
self::assertInstanceOf(RedirectResponse::class, $response);
self::assertSame('/app_groups_booking_step_4', $response->getTargetUrl());
self::assertSame(4, $dto->currentStep);
self::assertSame($dto, $sessionManager->getDto($request));
}
public function testInvalidSubmitReRendersFormWithErrors(): void
{
$dto = new AccommodationBookingDto();
$dto->currentStep = 3;
$dto->accommodationId = 1;
$session = new Session(new MockArraySessionStorage());
$request = Request::create('/groups/booking/step-3', 'POST');
$request->setSession($session);
$sessionManager = new AccommodationSessionManager();
$sessionManager->save($request, $dto);
$form = $this->createFormMock(submitted: true, valid: false);
$accommodation = (new Accommodation())
->setName('Hotel')
->setCalendarCode('HOTEL')
->setMaxAdolescentAge(17);
$bookingService = $this->createMock(AccommodationBookingService::class);
$bookingService->method('loadAccommodation')->with(1)->willReturn($accommodation);
$bookingService->method('loadAvailableServices')->willReturn([
'boardServices' => [],
'additionalServices' => [],
'groupedAdditionalServices' => [],
'ungroupedAdditionalServices' => [],
]);
$controller = new TestableAccommodationStep3Controller($bookingService, $sessionManager, $form);
$response = $controller->index($request);
self::assertSame(200, $response->getStatusCode());
self::assertSame('groups/booking/step_3.html.twig', $controller->renderedView);
self::assertSame($confirmationForm, $controller->renderedParameters['confirmationForm']);
self::assertFalse($dto->forceInquiry);
self::assertSame(3, $dto->currentStep);
self::assertSame($dto, $sessionManager->getDto($request));
}
public function testConfirmPersistsBookingOnValidConfirmationForm(): void
private function createFormMock(bool $submitted, bool $valid): FormInterface
{
$dto = new AccommodationBookingDto();
$dto->currentStep = 3;
$dto->accommodationId = 1;
$dto->isInquiry = false;
$form = $this->createMock(FormInterface::class);
$form->method('handleRequest')->willReturnSelf();
$form->method('isSubmitted')->willReturn($submitted);
$form->method('isValid')->willReturn($valid);
$session = new Session(new MockArraySessionStorage());
$request = Request::create('/groups/booking/step-3/confirm', 'POST');
$request->setSession($session);
$request->headers->set('HX-Request', 'true');
$sessionManager = new AccommodationSessionManager();
$sessionManager->save($request, $dto);
$confirmationForm = $this->createMock(FormInterface::class);
$confirmationForm->method('handleRequest')->willReturnSelf();
$confirmationForm->method('isSubmitted')->willReturn(true);
$confirmationForm->method('isValid')->willReturn(true);
$accommodation = (new Accommodation())
->setName('Hotel')
->setCalendarCode('HOTEL')
->setMaxAdolescentAge(17);
$booking = (new AccommodationBooking())->setIsInquiry(false);
$bookingService = $this->createMock(AccommodationBookingService::class);
$bookingService->method('loadAccommodation')->with(1)->willReturn($accommodation);
$bookingService->method('loadAvailableServices')->willReturn([
'boardServices' => [],
'additionalServices' => [],
'groupedAdditionalServices' => [],
'ungroupedAdditionalServices' => [],
]);
$bookingService->method('loadPrices')->willReturn([]);
$bookingService->expects(self::once())->method('persist')->willReturn($booking);
$bookingService->expects(self::once())->method('sendNotificationEmail');
$controller = new TestableAccommodationStep3Controller(
$bookingService,
$sessionManager,
[AccommodationStep3ConfirmationType::class => $confirmationForm],
);
$response = $controller->confirm($request);
self::assertSame(200, $response->getStatusCode());
self::assertTrue($response->headers->has('HX-Redirect'));
self::assertNull($sessionManager->getDto($request));
}
public function testConfirmRerendersModalWhenTermsNotAccepted(): void
{
$dto = new AccommodationBookingDto();
$dto->currentStep = 3;
$dto->accommodationId = 1;
$dto->isInquiry = false;
$session = new Session(new MockArraySessionStorage());
$request = Request::create('/groups/booking/step-3/confirm', 'POST');
$request->setSession($session);
$sessionManager = new AccommodationSessionManager();
$sessionManager->save($request, $dto);
$confirmationForm = $this->createMock(FormInterface::class);
$confirmationForm->method('handleRequest')->willReturnSelf();
$confirmationForm->method('isSubmitted')->willReturn(true);
$confirmationForm->method('isValid')->willReturn(false);
$accommodation = (new Accommodation())
->setName('Hotel')
->setCalendarCode('HOTEL')
->setMaxAdolescentAge(17);
$bookingService = $this->createMock(AccommodationBookingService::class);
$bookingService->method('loadAccommodation')->with(1)->willReturn($accommodation);
$bookingService->expects(self::never())->method('persist');
$controller = new TestableAccommodationStep3Controller(
$bookingService,
$sessionManager,
[AccommodationStep3ConfirmationType::class => $confirmationForm],
);
$response = $controller->confirm($request);
self::assertSame(200, $response->getStatusCode());
self::assertFalse($response->headers->has('HX-Redirect'));
self::assertSame('groups/booking/_step3_confirmation_modal.html.twig', $controller->renderedView);
self::assertNotNull($sessionManager->getDto($request));
return $form;
}
}
@@ -247,13 +174,10 @@ final class TestableAccommodationStep3Controller extends Step3Controller
public string $renderedView = '';
/**
* @param FormInterface<mixed>|array<class-string, FormInterface<mixed>> $form
*/
public function __construct(
AccommodationBookingService $bookingService,
AccommodationSessionManager $sessionManager,
private readonly FormInterface|array $form,
private readonly FormInterface $form,
) {
parent::__construct($bookingService, $sessionManager);
}
@@ -263,10 +187,6 @@ final class TestableAccommodationStep3Controller extends Step3Controller
*/
protected function createForm(string $type, mixed $data = null, array $options = []): FormInterface
{
if (is_array($this->form)) {
return $this->form[$type];
}
return $this->form;
}