119 lines
4.2 KiB
PHP
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();
|
|
}
|
|
}
|