dateFrom = new \DateTimeImmutable('2030-01-01'); $travel->dateTo = new \DateTimeImmutable('2030-01-06'); $roomByRoom = new Room(); $roomByRoom->id = 10; $roomByRoom->label = 'Doppelzimmer'; $roomByRoom->maxPax = 2; $roomByRoom->available = 4; $roomByRoom->status = 'Frei'; $roomByPax = new Room(); $roomByPax->id = 11; $roomByPax->label = '6-Bett Zimmer'; $roomByPax->maxPax = 6; $roomByPax->available = 2; $roomByPax->status = 'Frei'; $travel->rooms = [$roomByRoom, $roomByPax]; $bookingDto = new BookingDto($travel, 157047); $summaryData = $this->createStub(BookingSummaryDto::class); $summaryDataService = $this->createMock(BookingSummaryAssembler::class); $summaryDataService->expects($this->once()) ->method('getSummaryData') ->with( $bookingDto, RoomPricingCalculator::PRICING_MODE_SELECTION ) ->willReturn($summaryData); $participantCardDataService = $this->createMock(ParticipantCardAssembler::class); $participantCardDataService->expects($this->never()) ->method('getAllCardsDataWithValidation'); $priceCalculator = $this->createMock(BookingPriceCalculator::class); $priceCalculator->expects($this->never()) ->method('calculateAllParticipantIndividualPrices'); $familyInsuranceService = $this->createStub(FamilyInsuranceAvailabilityChecker::class); $familyInsuranceService->method('isFamilyInsuranceUpgradeAvailable')->willReturn(true); $service = new BookingCreateContextFactory( $participantCardDataService, $summaryDataService, $priceCalculator, $familyInsuranceService, ); $context = $service->create($bookingDto, RoomPricingCalculator::PRICING_MODE_SELECTION); $this->assertInstanceOf(BookingCreateContext::class, $context); $this->assertSame($bookingDto, $context->bookingDto); $this->assertSame($summaryData, $context->summaryData); $this->assertTrue($context->familyInsuranceUpgradeAvailable); $this->assertNull($context->cardsData); $this->assertFalse($context->isSubmitted); $this->assertSame([11 => $roomByPax], $context->groupedRooms->byPax); $this->assertSame([10 => $roomByRoom], $context->groupedRooms->byRoom); } public function testCreateWithParticipantCardsBuildsStep2Context(): void { $travel = new Travel(); $travel->dateFrom = new \DateTimeImmutable('2030-01-01'); $travel->dateTo = new \DateTimeImmutable('2030-01-06'); $room = new Room(); $room->id = 10; $room->label = 'Doppelzimmer'; $room->maxPax = 2; $room->available = 4; $room->status = 'Frei'; $travel->rooms = [$room]; $bookingDto = new BookingDto($travel, 157047); $summaryData = $this->createStub(BookingSummaryDto::class); $cardData = new ParticipantCardDataDto( name: 'Max Mustermann', email: 'max@example.test', roomName: 'Doppelzimmer', price: new ParticipantCardPriceDto(123.45, false), isCanceled: false, ); $summaryDataService = $this->createMock(BookingSummaryAssembler::class); $summaryDataService->expects($this->once()) ->method('getSummaryData') ->with($bookingDto, RoomPricingCalculator::PRICING_MODE_SELECTION) ->willReturn($summaryData); $participantCardDataService = $this->createMock(ParticipantCardAssembler::class); $participantCardDataService->expects($this->once()) ->method('getAllCardsDataWithValidation') ->with($bookingDto) ->willReturn([$cardData]); $priceCalculator = $this->createMock(BookingPriceCalculator::class); $priceCalculator->expects($this->never()) ->method('calculateAllParticipantIndividualPrices'); $familyInsuranceService = $this->createStub(FamilyInsuranceAvailabilityChecker::class); $familyInsuranceService->method('isFamilyInsuranceUpgradeAvailable')->willReturn(true); $service = new BookingCreateContextFactory( $participantCardDataService, $summaryDataService, $priceCalculator, $familyInsuranceService, ); $context = $service->createWithParticipantCards($bookingDto, true); $this->assertInstanceOf(BookingCreateContext::class, $context); $this->assertSame([$cardData], $context->cardsData); $this->assertTrue($context->isSubmitted); $this->assertTrue($context->familyInsuranceUpgradeAvailable); $this->assertSame([], $context->groupedRooms->byPax); $this->assertSame([10 => $room], $context->groupedRooms->byRoom); } public function testCreateWithParticipantPricesBuildsStep4Context(): void { $travel = new Travel(); $travel->dateFrom = new \DateTimeImmutable('2030-01-01'); $travel->dateTo = new \DateTimeImmutable('2030-01-06'); $room = new Room(); $room->id = 10; $room->label = 'Doppelzimmer'; $room->maxPax = 2; $room->available = 4; $room->status = 'Frei'; $travel->rooms = [$room]; $bookingDto = new BookingDto($travel, 157047); $summaryData = $this->createStub(BookingSummaryDto::class); $summaryDataService = $this->createMock(BookingSummaryAssembler::class); $summaryDataService->expects($this->once()) ->method('getSummaryData') ->with($bookingDto, RoomPricingCalculator::PRICING_MODE_ASSIGNMENT) ->willReturn($summaryData); $participantCardDataService = $this->createMock(ParticipantCardAssembler::class); $participantCardDataService->expects($this->never()) ->method('getAllCardsDataWithValidation'); $priceCalculator = $this->createMock(BookingPriceCalculator::class); $priceCalculator->expects($this->once()) ->method('calculateAllParticipantIndividualPrices') ->with($bookingDto) ->willReturn([123.45]); $familyInsuranceService = $this->createStub(FamilyInsuranceAvailabilityChecker::class); $familyInsuranceService->method('isFamilyInsuranceUpgradeAvailable')->willReturn(true); $service = new BookingCreateContextFactory( $participantCardDataService, $summaryDataService, $priceCalculator, $familyInsuranceService, ); $context = $service->createWithParticipantPrices($bookingDto); $this->assertInstanceOf(BookingCreateContext::class, $context); $this->assertSame([123.45], $context->participantPrices); $this->assertTrue($context->familyInsuranceUpgradeAvailable); $this->assertNull($context->cardsData); $this->assertSame([10 => $room], $context->groupedRooms->byRoom); } }