email = 'customer@example.com'; $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 = 'customer@example.com'; $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 $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}> */ public static function invalidRequests(): iterable { yield 'invalid email' => ['not-an-email', [10321569]]; yield 'empty list ids' => ['customer@example.com', []]; yield 'string list id' => ['customer@example.com', ['10321569']]; yield 'negative list id' => ['customer@example.com', [-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(); } }