Files
myep/tests/BusProNet/DataProcessor/BookingPayloadBuilderTest.php
T

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 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', '[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 testParticipantWithoutEmailIsSentWithoutOne(): 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->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', '[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;
}
}