feat: simplify booking pricing flow

This commit is contained in:
Björn Fromme
2026-04-11 18:28:32 +02:00
parent a0cbd5a23f
commit 346256f895
10 changed files with 1561 additions and 1267 deletions
@@ -16,38 +16,24 @@ use App\Service\InsuranceService;
use App\Service\ParticipantEligibilityService;
use App\Service\ParticipantPricingCalculator;
use App\Service\RoomPricingCalculator;
use App\Service\ServicePricingCalculator;
use PHPUnit\Framework\TestCase;
class BookingPriceCalculatorServiceTest extends TestCase
{
private BookingPriceCalculatorService $service;
private ParticipantEligibilityService $participantEligibilityService;
private RoomPricingCalculator $roomPricingCalculator;
private ParticipantPricingCalculator $participantPricingCalculator;
protected function setUp(): void
{
$this->participantEligibilityService = $this->createMock(ParticipantEligibilityService::class);
$this->participantEligibilityService->method('isParticipantEligible')->willReturn(true);
// Build the calculator chain
$roomPricingCalculator = new RoomPricingCalculator();
$participantPricingCalculator = new ParticipantPricingCalculator($roomPricingCalculator);
$this->roomPricingCalculator = new RoomPricingCalculator();
$this->participantPricingCalculator = new ParticipantPricingCalculator($this->roomPricingCalculator);
// Create InsuranceService with a mock price calculator (to avoid circular reference in tests)
$mockPriceCalculator = $this->createMock(BookingPriceCalculatorService::class);
$insuranceService = new InsuranceService($mockPriceCalculator);
$servicePricingCalculator = new ServicePricingCalculator(
$this->participantEligibilityService,
$insuranceService,
$participantPricingCalculator
);
$this->service = new BookingPriceCalculatorService(
$roomPricingCalculator,
$servicePricingCalculator,
$participantPricingCalculator
);
$this->service = $this->createService($this->participantEligibilityService);
}
public function testCalculateRoomPricingWithParticipantBasedCalculation(): void
@@ -613,24 +599,7 @@ class BookingPriceCalculatorServiceTest extends TestCase
$participantEligibilityService->method('isParticipantEligible')
->willReturnCallback(fn ($booking, $index) => 0 === $index); // Only first participant eligible
// Build the calculator chain with the custom eligibility service
$roomPricingCalculator = new RoomPricingCalculator();
$participantPricingCalculator = new ParticipantPricingCalculator($roomPricingCalculator);
$mockPriceCalculator = $this->createMock(BookingPriceCalculatorService::class);
$insuranceService = new InsuranceService($mockPriceCalculator);
$servicePricingCalculator = new ServicePricingCalculator(
$participantEligibilityService,
$insuranceService,
$participantPricingCalculator
);
$this->service = new BookingPriceCalculatorService(
$roomPricingCalculator,
$servicePricingCalculator,
$participantPricingCalculator
);
$this->service = $this->createService($participantEligibilityService);
$result = $this->service->calculateServicePricing($bookingDto);
@@ -725,4 +694,14 @@ class BookingPriceCalculatorServiceTest extends TestCase
return $participant;
}
private function createService(ParticipantEligibilityService $participantEligibilityService): BookingPriceCalculatorService
{
return new BookingPriceCalculatorService(
$this->roomPricingCalculator,
$participantEligibilityService,
new InsuranceService(),
$this->participantPricingCalculator,
);
}
}