Security update for Core, with self-updated composer
[yaffs-website] / vendor / symfony / validator / Tests / Constraints / CallbackValidatorTest.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\Validator\Tests\Constraints;
13
14 use Symfony\Component\Validator\Constraint;
15 use Symfony\Component\Validator\Constraints\Callback;
16 use Symfony\Component\Validator\Constraints\CallbackValidator;
17 use Symfony\Component\Validator\Context\ExecutionContextInterface;
18 use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
19
20 class CallbackValidatorTest_Class
21 {
22     public static function validateCallback($object, ExecutionContextInterface $context)
23     {
24         $context->addViolation('Callback message', array('{{ value }}' => 'foobar'));
25
26         return false;
27     }
28 }
29
30 class CallbackValidatorTest_Object
31 {
32     public function validate(ExecutionContextInterface $context)
33     {
34         $context->addViolation('My message', array('{{ value }}' => 'foobar'));
35
36         return false;
37     }
38
39     public static function validateStatic($object, ExecutionContextInterface $context)
40     {
41         $context->addViolation('Static message', array('{{ value }}' => 'baz'));
42
43         return false;
44     }
45 }
46
47 class CallbackValidatorTest extends ConstraintValidatorTestCase
48 {
49     protected function createValidator()
50     {
51         return new CallbackValidator();
52     }
53
54     public function testNullIsValid()
55     {
56         $this->validator->validate(null, new Callback());
57
58         $this->assertNoViolation();
59     }
60
61     public function testSingleMethod()
62     {
63         $object = new CallbackValidatorTest_Object();
64         $constraint = new Callback('validate');
65
66         $this->validator->validate($object, $constraint);
67
68         $this->buildViolation('My message')
69             ->setParameter('{{ value }}', 'foobar')
70             ->assertRaised();
71     }
72
73     public function testSingleMethodExplicitName()
74     {
75         $object = new CallbackValidatorTest_Object();
76         $constraint = new Callback(array('callback' => 'validate'));
77
78         $this->validator->validate($object, $constraint);
79
80         $this->buildViolation('My message')
81             ->setParameter('{{ value }}', 'foobar')
82             ->assertRaised();
83     }
84
85     public function testSingleStaticMethod()
86     {
87         $object = new CallbackValidatorTest_Object();
88         $constraint = new Callback('validateStatic');
89
90         $this->validator->validate($object, $constraint);
91
92         $this->buildViolation('Static message')
93             ->setParameter('{{ value }}', 'baz')
94             ->assertRaised();
95     }
96
97     public function testClosure()
98     {
99         $object = new CallbackValidatorTest_Object();
100         $constraint = new Callback(function ($object, ExecutionContextInterface $context) {
101             $context->addViolation('My message', array('{{ value }}' => 'foobar'));
102
103             return false;
104         });
105
106         $this->validator->validate($object, $constraint);
107
108         $this->buildViolation('My message')
109             ->setParameter('{{ value }}', 'foobar')
110             ->assertRaised();
111     }
112
113     public function testClosureNullObject()
114     {
115         $constraint = new Callback(function ($object, ExecutionContextInterface $context) {
116             $context->addViolation('My message', array('{{ value }}' => 'foobar'));
117
118             return false;
119         });
120
121         $this->validator->validate(null, $constraint);
122
123         $this->buildViolation('My message')
124             ->setParameter('{{ value }}', 'foobar')
125             ->assertRaised();
126     }
127
128     public function testClosureExplicitName()
129     {
130         $object = new CallbackValidatorTest_Object();
131         $constraint = new Callback(array(
132             'callback' => function ($object, ExecutionContextInterface $context) {
133                 $context->addViolation('My message', array('{{ value }}' => 'foobar'));
134
135                 return false;
136             },
137         ));
138
139         $this->validator->validate($object, $constraint);
140
141         $this->buildViolation('My message')
142             ->setParameter('{{ value }}', 'foobar')
143             ->assertRaised();
144     }
145
146     public function testArrayCallable()
147     {
148         $object = new CallbackValidatorTest_Object();
149         $constraint = new Callback(array(__CLASS__.'_Class', 'validateCallback'));
150
151         $this->validator->validate($object, $constraint);
152
153         $this->buildViolation('Callback message')
154             ->setParameter('{{ value }}', 'foobar')
155             ->assertRaised();
156     }
157
158     public function testArrayCallableNullObject()
159     {
160         $constraint = new Callback(array(__CLASS__.'_Class', 'validateCallback'));
161
162         $this->validator->validate(null, $constraint);
163
164         $this->buildViolation('Callback message')
165             ->setParameter('{{ value }}', 'foobar')
166             ->assertRaised();
167     }
168
169     public function testArrayCallableExplicitName()
170     {
171         $object = new CallbackValidatorTest_Object();
172         $constraint = new Callback(array(
173             'callback' => array(__CLASS__.'_Class', 'validateCallback'),
174         ));
175
176         $this->validator->validate($object, $constraint);
177
178         $this->buildViolation('Callback message')
179             ->setParameter('{{ value }}', 'foobar')
180             ->assertRaised();
181     }
182
183     /**
184      * @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
185      */
186     public function testExpectValidMethods()
187     {
188         $object = new CallbackValidatorTest_Object();
189
190         $this->validator->validate($object, new Callback(array('callback' => array('foobar'))));
191     }
192
193     /**
194      * @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
195      */
196     public function testExpectValidCallbacks()
197     {
198         $object = new CallbackValidatorTest_Object();
199
200         $this->validator->validate($object, new Callback(array('callback' => array('foo', 'bar'))));
201     }
202
203     public function testConstraintGetTargets()
204     {
205         $constraint = new Callback(array());
206         $targets = array(Constraint::CLASS_CONSTRAINT, Constraint::PROPERTY_CONSTRAINT);
207
208         $this->assertEquals($targets, $constraint->getTargets());
209     }
210
211     // Should succeed. Needed when defining constraints as annotations.
212     public function testNoConstructorArguments()
213     {
214         $constraint = new Callback();
215
216         $this->assertSame(array(Constraint::CLASS_CONSTRAINT, Constraint::PROPERTY_CONSTRAINT), $constraint->getTargets());
217     }
218
219     public function testAnnotationInvocationSingleValued()
220     {
221         $constraint = new Callback(array('value' => 'validateStatic'));
222
223         $this->assertEquals(new Callback('validateStatic'), $constraint);
224     }
225
226     public function testAnnotationInvocationMultiValued()
227     {
228         $constraint = new Callback(array('value' => array(__CLASS__.'_Class', 'validateCallback')));
229
230         $this->assertEquals(new Callback(array(__CLASS__.'_Class', 'validateCallback')), $constraint);
231     }
232
233     public function testPayloadIsPassedToCallback()
234     {
235         $object = new \stdClass();
236         $payloadCopy = null;
237
238         $constraint = new Callback(array(
239             'callback' => function ($object, ExecutionContextInterface $constraint, $payload) use (&$payloadCopy) {
240                 $payloadCopy = $payload;
241             },
242             'payload' => 'Hello world!',
243         ));
244         $this->validator->validate($object, $constraint);
245         $this->assertEquals('Hello world!', $payloadCopy);
246
247         $payloadCopy = null;
248         $constraint = new Callback(array(
249             'callback' => function ($object, ExecutionContextInterface $constraint, $payload) use (&$payloadCopy) {
250                 $payloadCopy = $payload;
251             },
252         ));
253         $this->validator->validate($object, $constraint);
254         $this->assertNull($payloadCopy);
255     }
256 }