block is built from, and that a participant's blank email stays blank. */ class BookingPayloadBuilderTest extends TestCase { private BookingPayloadBuilder $builder; protected function setUp(): void { $mappingCollector = $this->createStub(ServiceMappingCollector::class); $mappingCollector->method('getPromoVoucherCodeForParticipant')->willReturn(null); $this->builder = new BookingPayloadBuilder($mappingCollector); } public function testAnmelderComesFromFirstParticipantWhenTheApplicantTravels(): void { $bookingDto = $this->createBookingDto(); $payload = $this->builder->buildCreatePayload($bookingDto, 'BUCHUNG'); $this->assertSame('Kind', $payload['anmelder']['vorname']); $this->assertSame('Kind', $payload['teilnehmerliste']['teilnehmer'][0]['vorname']); } public function testAnmelderComesFromTheApplicantRecordWhenTheyDoNotTravel(): void { $bookingDto = $this->createBookingDto(); $bookingDto->applicantTravels = false; $bookingDto->applicant = $this->createPerson('Elternteil', 'elternteil@example.com'); $payload = $this->builder->buildCreatePayload($bookingDto, 'BUCHUNG'); $this->assertSame('Elternteil', $payload['anmelder']['vorname']); $this->assertSame('elternteil@example.com', $payload['anmelder']['kommunikation']['email']); $this->assertSame( 'Kind', $payload['teilnehmerliste']['teilnehmer'][0]['vorname'], 'participant[0] stays an ordinary traveller' ); } public function testAnmelderStillCarriesNoIdsOnCreate(): void { $bookingDto = $this->createBookingDto(); $bookingDto->applicantTravels = false; $applicant = $this->createPerson('Elternteil', 'elternteil@example.com'); $applicant->personId = 4711; $applicant->addressId = 1234; $bookingDto->applicant = $applicant; $payload = $this->builder->buildCreatePayload($bookingDto, 'BUCHUNG'); $this->assertArrayNotHasKey('idadresseperson', $payload['anmelder']); $this->assertArrayNotHasKey('idadresse', $payload['anmelder']); } public function testParticipantWithoutEmailIsSentWithoutOne(): void { $bookingDto = $this->createBookingDto(); $bookingDto->applicantTravels = false; $bookingDto->applicant = $this->createPerson('Elternteil', 'elternteil@example.com'); $bookingDto->participants[0]->email = null; $payload = $this->builder->buildCreatePayload($bookingDto, 'BUCHUNG'); $this->assertArrayNotHasKey( 'email', $payload['teilnehmerliste']['teilnehmer'][0]['kommunikation'], 'BusPro accepts a participant without a Mail-Adresse; the applicant\'s must not be borrowed' ); } public function testParticipantKeepsTheirOwnEmail(): void { $bookingDto = $this->createBookingDto(); $bookingDto->applicantTravels = false; $bookingDto->applicant = $this->createPerson('Elternteil', 'elternteil@example.com'); $payload = $this->builder->buildCreatePayload($bookingDto, 'BUCHUNG'); $this->assertSame( 'kind@example.com', $payload['teilnehmerliste']['teilnehmer'][0]['kommunikation']['email'] ); } public function testOrdinaryBookingPayloadIsUnchangedByTheApplicantSwitch(): void { $withApplicantTravelling = $this->builder->buildCreatePayload($this->createBookingDto(), 'BUCHUNG'); $bookingDto = $this->createBookingDto(); $bookingDto->applicant = $this->createPerson('Elternteil', 'elternteil@example.com'); $this->assertSame( $withApplicantTravelling, $this->builder->buildCreatePayload($bookingDto, 'BUCHUNG'), 'A stale applicant record must not leak into a booking where the applicant travels' ); } private function createBookingDto(): BookingDto { $travel = new Travel(); $travel->id = 12500; $travel->hotelId = 223055; $bookingDto = new BookingDto($travel, 223055); $bookingDto->agencyId = 77883; $participant = $this->createPerson('Kind', 'kind@example.com'); $participant->index = 0; $bookingDto->participants = [$participant]; return $bookingDto; } private function createPerson(string $firstName, string $email): ParticipantDto { $person = new ParticipantDto(); $person->firstName = $firstName; $person->lastName = 'Probe'; $person->gender = 'W'; $person->nationality = 'D'; $person->dateOfBirth = new \DateTimeImmutable('2014-09-16'); $person->email = $email; $person->mobile = '0171/222222'; $address = new Address(); $address->street = 'Probeweg 7'; $address->postCode = '99999'; $address->city = 'MusterOrt'; $address->country = 'D'; $person->address = $address; return $person; } }