89 lines
2.9 KiB
PHP
89 lines
2.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Tests\Model;
|
|
|
|
use App\Model\NewsletterSubscriptionRequest;
|
|
use PHPUnit\Framework\Attributes\DataProvider;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Symfony\Component\Validator\Constraint;
|
|
use Symfony\Component\Validator\Constraints\Email;
|
|
use Symfony\Component\Validator\Constraints\EmailValidator;
|
|
use Symfony\Component\Validator\ConstraintValidatorFactory;
|
|
use Symfony\Component\Validator\ConstraintValidatorInterface;
|
|
use Symfony\Component\Validator\Validation;
|
|
use Symfony\Component\Validator\Validator\ValidatorInterface;
|
|
|
|
class NewsletterSubscriptionRequestTest extends TestCase
|
|
{
|
|
public function testValidRequestPassesValidation(): void
|
|
{
|
|
$request = new NewsletterSubscriptionRequest();
|
|
$request->email = '[email protected]';
|
|
$request->listIds = [10321569, 12345678];
|
|
$request->firstName = 'Mia';
|
|
$request->lastName = 'Muster';
|
|
|
|
$violations = $this->validator()->validate($request);
|
|
|
|
self::assertCount(0, $violations);
|
|
}
|
|
|
|
public function testTooLongNamesFailValidation(): void
|
|
{
|
|
$request = new NewsletterSubscriptionRequest();
|
|
$request->email = '[email protected]';
|
|
$request->listIds = [10321569];
|
|
$request->firstName = str_repeat('A', 256);
|
|
$request->lastName = str_repeat('B', 256);
|
|
|
|
$violations = $this->validator()->validate($request);
|
|
|
|
self::assertGreaterThanOrEqual(2, $violations->count());
|
|
}
|
|
|
|
/**
|
|
* @param list<mixed> $listIds
|
|
*/
|
|
#[DataProvider('invalidRequests')]
|
|
public function testInvalidRequestFailsValidation(?string $email, array $listIds): void
|
|
{
|
|
$request = new NewsletterSubscriptionRequest();
|
|
$request->email = $email;
|
|
$request->listIds = $listIds;
|
|
|
|
$violations = $this->validator()->validate($request);
|
|
|
|
self::assertGreaterThan(0, $violations->count());
|
|
}
|
|
|
|
/**
|
|
* @return iterable<string, array{0: ?string, 1: list<mixed>}>
|
|
*/
|
|
public static function invalidRequests(): iterable
|
|
{
|
|
yield 'invalid email' => ['not-an-email', [10321569]];
|
|
yield 'empty list ids' => ['[email protected]', []];
|
|
yield 'string list id' => ['[email protected]', ['10321569']];
|
|
yield 'negative list id' => ['[email protected]', [-1]];
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|