service = new ParticipantEligibilityService(); } public function testBabyParticipantIsAlwaysEligible(): void { $travel = $this->createTravelWithNoSkiPasses(); $bookingDto = new BookingDto($travel, 1); // Create a baby participant (1 year old at travel date) $participant = new ParticipantDto(); $participant->index = 0; $participant->dateOfBirth = $travel->dateFrom->modify('-1 year'); $bookingDto->participants[0] = $participant; $result = $this->service->isParticipantEligible($bookingDto, 0); $this->assertTrue($result, 'Baby participant (1 year old) should be eligible regardless of ski pass availability'); } public function testTwoYearOldParticipantIsEligibleAsBaby(): void { $travel = $this->createTravelWithNoSkiPasses(); $bookingDto = new BookingDto($travel, 1); // Create a participant exactly at BABY_MAX_AGE (2 years old at travel date) $participant = new ParticipantDto(); $participant->index = 0; $participant->dateOfBirth = $travel->dateFrom->modify('-2 years'); $bookingDto->participants[0] = $participant; $result = $this->service->isParticipantEligible($bookingDto, 0); $this->assertTrue($result, 'Participant at BABY_MAX_AGE (2 years) should be eligible'); } public function testThreeYearOldParticipantIsNotBabyEligible(): void { $travel = $this->createTravelWithNoSkiPasses(); $bookingDto = new BookingDto($travel, 1); // Create a participant just over BABY_MAX_AGE (3 years old at travel date) $participant = new ParticipantDto(); $participant->index = 0; $participant->dateOfBirth = $travel->dateFrom->modify('-3 years'); $bookingDto->participants[0] = $participant; $result = $this->service->isParticipantEligible($bookingDto, 0); $this->assertFalse($result, 'Participant over BABY_MAX_AGE (3 years) should not be eligible without ski passes'); } public function testAdultParticipantWithSkiPassIsEligible(): void { $travel = $this->createTravelWithSkiPasses(); $bookingDto = new BookingDto($travel, 1); // Create an adult participant (25 years old at travel date) $participant = new ParticipantDto(); $participant->index = 0; $participant->dateOfBirth = $travel->dateFrom->modify('-25 years'); $bookingDto->participants[0] = $participant; $result = $this->service->isParticipantEligible($bookingDto, 0); $this->assertTrue($result, 'Adult participant with available ski passes should be eligible'); } public function testParticipantWithoutDateOfBirthIsNotEligible(): void { $travel = $this->createTravelWithSkiPasses(); $bookingDto = new BookingDto($travel, 1); // Create a participant without date of birth $participant = new ParticipantDto(); $participant->index = 0; $participant->dateOfBirth = null; $bookingDto->participants[0] = $participant; $result = $this->service->isParticipantEligible($bookingDto, 0); $this->assertFalse($result, 'Participant without date of birth should not be eligible'); } public function testNewbornBabyIsEligible(): void { $travel = $this->createTravelWithNoSkiPasses(); $bookingDto = new BookingDto($travel, 1); // Create a newborn (born on travel date) $participant = new ParticipantDto(); $participant->index = 0; $participant->dateOfBirth = $travel->dateFrom; $bookingDto->participants[0] = $participant; $result = $this->service->isParticipantEligible($bookingDto, 0); $this->assertTrue($result, 'Newborn baby (0 years old) should be eligible'); } public function testBabyAgeIsCalculatedAtTravelDate(): void { $travel = new Travel(); $travel->dateFrom = new \DateTimeImmutable('2025-06-01'); $travel->dateTo = new \DateTimeImmutable('2025-06-08'); $travel->additionalServices = []; $bookingDto = new BookingDto($travel, 1); // Create a participant who will be 2 at travel date but 3 now // Born 2023-06-02, travel date 2025-06-01 = 1 year 364 days = 1 year old $participant = new ParticipantDto(); $participant->index = 0; $participant->dateOfBirth = new \DateTimeImmutable('2023-06-02'); $bookingDto->participants[0] = $participant; $result = $this->service->isParticipantEligible($bookingDto, 0); $this->assertTrue($result, 'Age should be calculated at travel date, not current date'); } private function createTravelWithNoSkiPasses(): Travel { $travel = new Travel(); $travel->dateFrom = new \DateTimeImmutable('+30 days'); $travel->dateTo = new \DateTimeImmutable('+37 days'); $travel->additionalServices = []; return $travel; } private function createTravelWithSkiPasses(): Travel { $travel = new Travel(); $travel->dateFrom = new \DateTimeImmutable('+30 days'); $travel->dateTo = new \DateTimeImmutable('+37 days'); // Create a ski pass service available for all ages $skiPass = new Service(); $skiPass->id = 1; $skiPass->label = 'Test Ski Pass'; $skiPass->subType = Constants::TOKEN_SKI_PASS; $skiPass->available = 10; $skiPass->price = 100.0; $skiPass->ageConstraintType = null; // No age constraint $skiPass->dateFrom = $travel->dateFrom; $skiPass->dateTo = $travel->dateTo; $travel->additionalServices = [1 => $skiPass]; return $travel; } }