createValidParticipant(); $participant->rentals = [$this->createMockService()]; $participant->height = '170'; $participant->weight = '70'; $participant->shoeSize = '42'; $this->validator->validate($participant, new Participant()); $this->assertNoViolation(); } public function testParticipantWithRentalsButNoHeightFailsValidation(): void { $participant = $this->createValidParticipant(); $participant->rentals = [$this->createMockService()]; $participant->height = null; $participant->weight = '70'; $participant->shoeSize = '42'; $this->validator->validate($participant, new Participant()); $this->buildViolation('Bitte auswählen') ->atPath('property.path.height') ->assertRaised(); } public function testParticipantWithRentalsButNoWeightFailsValidation(): void { $participant = $this->createValidParticipant(); $participant->rentals = [$this->createMockService()]; $participant->height = '170'; $participant->weight = null; $participant->shoeSize = '42'; $this->validator->validate($participant, new Participant()); $this->buildViolation('Bitte auswählen') ->atPath('property.path.weight') ->assertRaised(); } public function testParticipantWithRentalsButNoShoeSizeFailsValidation(): void { $participant = $this->createValidParticipant(); $participant->rentals = [$this->createMockService()]; $participant->height = '170'; $participant->weight = '70'; $participant->shoeSize = null; $this->validator->validate($participant, new Participant()); $this->buildViolation('Bitte auswählen') ->atPath('property.path.shoeSize') ->assertRaised(); } public function testParticipantWithoutRentalsAndNoBodyMeasurementsPassesValidation(): void { $participant = $this->createValidParticipant(); $participant->rentals = []; $participant->height = null; $participant->weight = null; $participant->shoeSize = null; $this->validator->validate($participant, new Participant()); $this->assertNoViolation(); } public function testCanceledParticipantSkipsValidation(): void { $participant = $this->createValidParticipant(); $participant->status = 'S'; // Canceled $participant->transportationOutbound = null; $participant->transportationInbound = null; $this->validator->validate($participant, new Participant()); $this->assertNoViolation(); } public function testParticipantWithBusTransportationButNoPickupFailsValidation(): void { $participant = $this->createValidParticipant(); $busService = new Service(); $busService->subType = 'BUS'; $participant->transportationOutbound = $busService; $participant->transportationInbound = $this->createMockService(); $participant->pickup = null; $this->validator->validate($participant, new Participant()); $this->buildViolation('Bitte auswählen') ->atPath('property.path.pickup') ->assertRaised(); } public function testParticipantWithInboundBusOnlyAndNoPickupPassesValidation(): void { $participant = $this->createValidParticipant(); $participant->transportationOutbound = $this->createMockService(); $busService = new Service(); $busService->subType = 'BUS'; $participant->transportationInbound = $busService; $participant->pickup = null; $participant->dropOff = $this->createMockPickup(); $this->validator->validate($participant, new Participant()); $this->assertNoViolation(); } public function testParticipantWithPkwOutboundBusInboundRequiresDropOffButNotPickup(): void { $participant = $this->createValidParticipant(); $carService = new Service(); $carService->subType = 'PKW'; $participant->transportationOutbound = $carService; $busService = new Service(); $busService->subType = 'BUS'; $participant->transportationInbound = $busService; $participant->pickup = null; $participant->dropOff = null; $this->validator->validate($participant, new Participant()); $this->buildViolation('Bitte auswählen') ->atPath('property.path.dropOff') ->assertRaised(); $this->assertCount(1, $this->context->getViolations()); } public function testParticipantWithNonBusTransportationPassesPickupValidation(): void { $participant = $this->createValidParticipant(); $trainService = new Service(); $trainService->subType = 'TRAIN'; $participant->transportationOutbound = $trainService; $participant->pickup = null; // Not required for non-bus $this->validator->validate($participant, new Participant()); $this->assertNoViolation(); } private function createValidParticipant(): ParticipantDto { $participant = new ParticipantDto(); // Set valid transportation to avoid transportation validation errors $participant->transportationOutbound = $this->createMockService(); $participant->transportationInbound = $this->createMockService(); // Set status to active $participant->status = 'F'; return $participant; } private function createMockService(): Service { $service = new Service(); $service->id = 123; $service->label = 'Test Service'; $service->subType = 'TRAIN'; // Non-bus to avoid pickup validation return $service; } private function createMockPickup(): Pickup { $pickup = new Pickup(); $pickup->id = 123; $pickup->city = 'Test City'; return $pickup; } }