Files
myep/tests/BusProNet/Model/PersonalDataCompletenessTest.php
T

119 lines
4.2 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests\BusProNet\Model;
use App\BusProNet\Model\Address;
use App\BusProNet\Model\Communication;
use App\BusProNet\Model\PersonalData;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidatorFactory;
use Symfony\Component\Validator\ConstraintValidatorInterface;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\EmailValidator;
use Symfony\Component\Validator\Validation;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class PersonalDataCompletenessTest extends TestCase
{
public function testCompletePersonalDataPassesPersonalDataValidationGroup(): void
{
$personalData = $this->createCompletePersonalData();
$personalData->remarks = 'Optional note';
$personalData->address->district = 'Mitte';
$personalData->communication->phone = '0301234567';
$violations = $this->validator()->validate($personalData, null, ['personal_data']);
self::assertCount(0, $violations);
}
public function testMissingRequiredPersonalDataFieldFailsPersonalDataValidationGroup(): void
{
$personalData = $this->createCompletePersonalData();
$personalData->name = null;
$violations = $this->validator()->validate($personalData, null, ['personal_data']);
self::assertCount(1, $violations);
self::assertSame('name', $violations->get(0)->getPropertyPath());
}
public function testAddressCompletenessIgnoresOptionalDistrict(): void
{
$address = new Address();
$address->street = 'Main Street 1';
$address->postCode = '12345';
$address->city = 'Berlin';
$address->country = 'DE';
$address->district = 'Mitte';
$violations = $this->validator()->validate($address, null, ['personal_data']);
self::assertCount(0, $violations);
$address->street = null;
$violations = $this->validator()->validate($address, null, ['personal_data']);
self::assertCount(1, $violations);
self::assertSame('street', $violations->get(0)->getPropertyPath());
}
public function testCommunicationCompletenessIgnoresOptionalPhone(): void
{
$communication = new Communication();
$communication->email = '[email protected]';
$communication->mobile = '0123456789';
$communication->phone = '0301234567';
$violations = $this->validator()->validate($communication, null, ['personal_data']);
self::assertCount(0, $violations);
$communication->mobile = null;
$violations = $this->validator()->validate($communication, null, ['personal_data']);
self::assertCount(1, $violations);
self::assertSame('mobile', $violations->get(0)->getPropertyPath());
}
private function createCompletePersonalData(): PersonalData
{
$personalData = new PersonalData();
$personalData->firstName = 'Mia';
$personalData->name = 'Muster';
$personalData->gender = 'W';
$personalData->nationality = 'DE';
$personalData->dateOfBirth = new \DateTimeImmutable('1990-05-15');
$personalData->address->street = 'Main Street 1';
$personalData->address->postCode = '10115';
$personalData->address->city = 'Berlin';
$personalData->address->country = 'DE';
$personalData->communication->email = '[email protected]';
$personalData->communication->mobile = '0123456789';
return $personalData;
}
private function validator(): ValidatorInterface
{
return Validation::createValidatorBuilder()
->enableAttributeMapping()
->setConstraintValidatorFactory(new class extends ConstraintValidatorFactory {
public function getInstance(Constraint $constraint): ConstraintValidatorInterface
{
if (true === ($constraint instanceof Email)) {
return new EmailValidator(Email::VALIDATION_MODE_HTML5);
}
return parent::getInstance($constraint);
}
})
->getValidator();
}
}