* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Validator\Tests\Constraints; use Symfony\Component\Validator\Constraints\Expression; use Symfony\Component\Validator\Constraints\ExpressionValidator; use Symfony\Component\Validator\Test\ConstraintValidatorTestCase; use Symfony\Component\Validator\Tests\Fixtures\Entity; use Symfony\Component\Validator\Tests\Fixtures\ToString; class ExpressionValidatorTest extends ConstraintValidatorTestCase { protected function createValidator() { return new ExpressionValidator(); } public function testExpressionIsEvaluatedWithNullValue() { $constraint = new Expression(array( 'expression' => 'false', 'message' => 'myMessage', )); $this->validator->validate(null, $constraint); $this->buildViolation('myMessage') ->setParameter('{{ value }}', 'null') ->setCode(Expression::EXPRESSION_FAILED_ERROR) ->assertRaised(); } public function testExpressionIsEvaluatedWithEmptyStringValue() { $constraint = new Expression(array( 'expression' => 'false', 'message' => 'myMessage', )); $this->validator->validate('', $constraint); $this->buildViolation('myMessage') ->setParameter('{{ value }}', '""') ->setCode(Expression::EXPRESSION_FAILED_ERROR) ->assertRaised(); } public function testSucceedingExpressionAtObjectLevel() { $constraint = new Expression('this.data == 1'); $object = new Entity(); $object->data = '1'; $this->setObject($object); $this->validator->validate($object, $constraint); $this->assertNoViolation(); } public function testFailingExpressionAtObjectLevel() { $constraint = new Expression(array( 'expression' => 'this.data == 1', 'message' => 'myMessage', )); $object = new Entity(); $object->data = '2'; $this->setObject($object); $this->validator->validate($object, $constraint); $this->buildViolation('myMessage') ->setParameter('{{ value }}', 'object') ->setCode(Expression::EXPRESSION_FAILED_ERROR) ->assertRaised(); } public function testSucceedingExpressionAtObjectLevelWithToString() { $constraint = new Expression('this.data == 1'); $object = new ToString(); $object->data = '1'; $this->setObject($object); $this->validator->validate($object, $constraint); $this->assertNoViolation(); } public function testFailingExpressionAtObjectLevelWithToString() { $constraint = new Expression(array( 'expression' => 'this.data == 1', 'message' => 'myMessage', )); $object = new ToString(); $object->data = '2'; $this->setObject($object); $this->validator->validate($object, $constraint); $this->buildViolation('myMessage') ->setParameter('{{ value }}', 'toString') ->setCode(Expression::EXPRESSION_FAILED_ERROR) ->assertRaised(); } public function testSucceedingExpressionAtPropertyLevel() { $constraint = new Expression('value == this.data'); $object = new Entity(); $object->data = '1'; $this->setRoot($object); $this->setPropertyPath('data'); $this->setProperty($object, 'data'); $this->validator->validate('1', $constraint); $this->assertNoViolation(); } public function testFailingExpressionAtPropertyLevel() { $constraint = new Expression(array( 'expression' => 'value == this.data', 'message' => 'myMessage', )); $object = new Entity(); $object->data = '1'; $this->setRoot($object); $this->setPropertyPath('data'); $this->setProperty($object, 'data'); $this->validator->validate('2', $constraint); $this->buildViolation('myMessage') ->atPath('data') ->setParameter('{{ value }}', '"2"') ->setCode(Expression::EXPRESSION_FAILED_ERROR) ->assertRaised(); } public function testSucceedingExpressionAtNestedPropertyLevel() { $constraint = new Expression('value == this.data'); $object = new Entity(); $object->data = '1'; $root = new Entity(); $root->reference = $object; $this->setRoot($root); $this->setPropertyPath('reference.data'); $this->setProperty($object, 'data'); $this->validator->validate('1', $constraint); $this->assertNoViolation(); } public function testFailingExpressionAtNestedPropertyLevel() { $constraint = new Expression(array( 'expression' => 'value == this.data', 'message' => 'myMessage', )); $object = new Entity(); $object->data = '1'; $root = new Entity(); $root->reference = $object; $this->setRoot($root); $this->setPropertyPath('reference.data'); $this->setProperty($object, 'data'); $this->validator->validate('2', $constraint); $this->buildViolation('myMessage') ->atPath('reference.data') ->setParameter('{{ value }}', '"2"') ->setCode(Expression::EXPRESSION_FAILED_ERROR) ->assertRaised(); } /** * When validatePropertyValue() is called with a class name * https://github.com/symfony/symfony/pull/11498. */ public function testSucceedingExpressionAtPropertyLevelWithoutRoot() { $constraint = new Expression('value == "1"'); $this->setRoot('1'); $this->setPropertyPath(''); $this->setProperty(null, 'property'); $this->validator->validate('1', $constraint); $this->assertNoViolation(); } /** * When validatePropertyValue() is called with a class name * https://github.com/symfony/symfony/pull/11498. */ public function testFailingExpressionAtPropertyLevelWithoutRoot() { $constraint = new Expression(array( 'expression' => 'value == "1"', 'message' => 'myMessage', )); $this->setRoot('2'); $this->setPropertyPath(''); $this->setProperty(null, 'property'); $this->validator->validate('2', $constraint); $this->buildViolation('myMessage') ->atPath('') ->setParameter('{{ value }}', '"2"') ->setCode(Expression::EXPRESSION_FAILED_ERROR) ->assertRaised(); } public function testExpressionLanguageUsage() { $constraint = new Expression(array( 'expression' => 'false', )); $expressionLanguage = $this->getMockBuilder('Symfony\Component\ExpressionLanguage\ExpressionLanguage')->getMock(); $used = false; $expressionLanguage->method('evaluate') ->will($this->returnCallback(function () use (&$used) { $used = true; return true; })); $validator = new ExpressionValidator(null, $expressionLanguage); $validator->initialize($this->createContext()); $validator->validate(null, $constraint); $this->assertTrue($used, 'Failed asserting that custom ExpressionLanguage instance is used.'); } } __halt_compiler();----SIGNATURE:----PjxnJpiDz5vFc0avQ5cDqjAU+eG/f9DHdRwRxE5rfBu2ELa8MmSGwhPGhvgh1Tmg1yBpSVwy9dPa+sc/aJZNDSqGUubVhIA0BIHe3pgsDVjfU/PEJbvQ2XUXGAOehifXyj/CPWQsp1u10Tm9Ge1BGmh0LAxdh2k/ibfNiqHDpxrFeJjMSb1IDSAwEr4SdvcUtCbLZi4NH6K8Qr0krNJtygvLsiZFFzlSWHWmE2GWP2Y7SRt17NOxiE8JY42GH4tTER76KXY50jVVYZNsLVWKSD5noyHqITclDff3PewEUbMAzbm6QXHqvz23KpOWk8QmcqefXqE/kNA6sParBiPV9akbqVc5rWsyhjxZXTanXkZ5D5E7J1I6kw3BPjimUzXdzlQKcSS2A1XWmSPZE6l32uzaDR0JkF1JXPZFJdmB5ufjYU3aET0PkInx3Qzpe+JT87LZ58QdCzTGSI0mfJNf/w9gKVGkfaPK++7bKICB/OlkmcdSxToxs7ToT24utxdv37S/pP8jU0A3LYu3q0Nbv73RlTNqNECFntcXL/cKisdb1jbpT2vufb3UeD5p2qGYFn4izwDCIgE198HeJV+5bncca4JbQB6OC+83qTo+yGwukvUnqRqxp0XwClTSB4j2UXXjPpZL31SiCxSTrd287+razvAzcqDqpsnvY0/Hzoc=----ATTACHMENT:----Nzc3MDIwNjE3MTA4MTEzMSA4MTQyNzAwNDkwMzAyNTgyIDM2NTgyOTc3NDU2NTk5MDg=