153 lines
5.3 KiB
PHP
153 lines
5.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\BusProNet\DataProcessor;
|
|
|
|
use App\BusProNet\DataProcessor\BookingPayloadBuilder;
|
|
use App\BusProNet\DataProcessor\ServiceMappingCollector;
|
|
use App\BusProNet\Model\Address;
|
|
use App\BusProNet\Model\Travel;
|
|
use App\Form\Model\BookingDto;
|
|
use App\Form\Model\ParticipantDto;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* Covers who the <anmelder> block is built from, and the participant email fallback.
|
|
*/
|
|
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', '[email protected]');
|
|
|
|
$payload = $this->builder->buildCreatePayload($bookingDto, 'BUCHUNG');
|
|
|
|
$this->assertSame('Elternteil', $payload['anmelder']['vorname']);
|
|
$this->assertSame('[email protected]', $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', '[email protected]');
|
|
$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 testParticipantWithoutEmailInheritsTheApplicants(): void
|
|
{
|
|
$bookingDto = $this->createBookingDto();
|
|
$bookingDto->applicantTravels = false;
|
|
$bookingDto->applicant = $this->createPerson('Elternteil', '[email protected]');
|
|
$bookingDto->participants[0]->email = null;
|
|
|
|
$payload = $this->builder->buildCreatePayload($bookingDto, 'BUCHUNG');
|
|
|
|
$this->assertSame(
|
|
'[email protected]',
|
|
$payload['teilnehmerliste']['teilnehmer'][0]['kommunikation']['email'],
|
|
'BusPro rejects a participant without a Mail-Adresse with 650, but accepts a shared one'
|
|
);
|
|
}
|
|
|
|
public function testParticipantKeepsTheirOwnEmail(): void
|
|
{
|
|
$bookingDto = $this->createBookingDto();
|
|
$bookingDto->applicantTravels = false;
|
|
$bookingDto->applicant = $this->createPerson('Elternteil', '[email protected]');
|
|
|
|
$payload = $this->builder->buildCreatePayload($bookingDto, 'BUCHUNG');
|
|
|
|
$this->assertSame(
|
|
'[email protected]',
|
|
$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', '[email protected]');
|
|
|
|
$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', '[email protected]');
|
|
$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;
|
|
}
|
|
}
|