Files
myep/tests/Model/NewsletterSubscriptionRequestTest.php
T

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();
}
}