diff --git a/src/Symfony/Component/Validator/Constraints/CardSchemeValidator.php b/src/Symfony/Component/Validator/Constraints/CardSchemeValidator.php index 97b4567491..f674773127 100644 --- a/src/Symfony/Component/Validator/Constraints/CardSchemeValidator.php +++ b/src/Symfony/Component/Validator/Constraints/CardSchemeValidator.php @@ -74,9 +74,11 @@ class CardSchemeValidator extends ConstraintValidator if (!is_numeric($value)) { $this->context->addViolation($constraint->message); + + return; } - $schemes = array_flip($constraint->schemes); + $schemes = array_flip((array) $constraint->schemes); $schemeRegexes = array_intersect_key($this->schemes, $schemes); foreach ($schemeRegexes as $regexes) { diff --git a/src/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php b/src/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php index 3fa3092dca..fab8ff9235 100644 --- a/src/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php +++ b/src/Symfony/Component/Validator/Tests/Constraints/CardSchemeValidatorTest.php @@ -56,13 +56,23 @@ class CardSchemeValidatorTest extends \PHPUnit_Framework_TestCase $this->context->expects($this->never()) ->method('addViolation'); - $this->validator->validate($number, new CardScheme(array('schemes' => array($scheme)))); + $this->validator->validate($number, new CardScheme(array('schemes' => $scheme))); + } + + /** + * @dataProvider getInvalidNumbers + */ + public function testInvalidNumbers($scheme, $number) + { + $this->context->expects($this->once()) + ->method('addViolation'); + + $this->validator->validate($number, new CardScheme(array('schemes' => $scheme))); } public function getValidNumbers() { return array( - array('VISA', '42424242424242424242'), array('AMEX', '378282246310005'), array('AMEX', '371449635398431'), array('AMEX', '378734493671000'), @@ -76,6 +86,24 @@ class CardSchemeValidatorTest extends \PHPUnit_Framework_TestCase array('VISA', '4111111111111111'), array('VISA', '4012888888881881'), array('VISA', '4222222222222'), + array('VISA', '42424242424242424242'), + array(array('AMEX', 'VISA'), '42424242424242424242'), + array(array('AMEX', 'VISA'), '378282246310005'), + array(array('JCB', 'MASTERCARD'), '5105105105105100'), + array(array('VISA', 'MASTERCARD'), '5105105105105100'), + ); + } + + public function getInvalidNumbers() + { + return array( + array('AMEX', '30569309025904'), // DINERS number + array('AMEX', 'invalid'), // A string + array('AMEX', 0), // a lone number + array('AMEX', '0'), // a lone number + array('AMEX', '000000000000'), // a lone number + array('DINERS', '3056930'), // only first part of the number + array('DISCOVER', '1117'), // only last 4 digits ); } }