Skip to content

Commit 87123f6

Browse files
committed
minor #12015 [Validator] Simplified testing of violations (webmozart)
This PR was merged into the 2.3 branch. Discussion ---------- [Validator] Simplified testing of violations | Q | A | ------------- | --- | Bug fix? | no | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | - | License | MIT | Doc PR | - I simplified the assertion of violations in preparation of a replacement PR for #7276. Commits ------- 8e5537b [Validator] Simplified testing of violations
2 parents b2524d4 + 8e5537b commit 87123f6

36 files changed

+516
-329
lines changed

src/Symfony/Bridge/Doctrine/Tests/Validator/Constraints/UniqueEntityValidatorTest.php

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,10 @@ public function testValidateUniqueness()
159159

160160
$this->validator->validate($entity2, $constraint);
161161

162-
$this->assertViolation('myMessage', array(), 'property.path.name', 'Foo');
162+
$this->buildViolation('myMessage')
163+
->atPath('property.path.name')
164+
->setInvalidValue('Foo')
165+
->assertRaised();
163166
}
164167

165168
public function testValidateCustomErrorPath()
@@ -179,7 +182,10 @@ public function testValidateCustomErrorPath()
179182

180183
$this->validator->validate($entity2, $constraint);
181184

182-
$this->assertViolation('myMessage', array(), 'property.path.bar', 'Foo');
185+
$this->buildViolation('myMessage')
186+
->atPath('property.path.bar')
187+
->setInvalidValue('Foo')
188+
->assertRaised();
183189
}
184190

185191
public function testValidateUniquenessWithNull()
@@ -227,7 +233,10 @@ public function testValidateUniquenessWithIgnoreNull()
227233

228234
$this->validator->validate($entity2, $constraint);
229235

230-
$this->assertViolation('myMessage', array(), 'property.path.name', 'Foo');
236+
$this->buildViolation('myMessage')
237+
->atPath('property.path.name')
238+
->setInvalidValue('Foo')
239+
->assertRaised();
231240
}
232241

233242
public function testValidateUniquenessUsingCustomRepositoryMethod()
@@ -321,7 +330,10 @@ public function testAssociatedEntity()
321330

322331
$this->validator->validate($associated2, $constraint);
323332

324-
$this->assertViolation('myMessage', array(), 'property.path.single', 1);
333+
$this->buildViolation('myMessage')
334+
->atPath('property.path.single')
335+
->setInvalidValue(1)
336+
->assertRaised();
325337
}
326338

327339
public function testAssociatedEntityWithNull()

src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,12 @@ function () { throw new TransformationFailedException(); }
219219

220220
$this->validator->validate($form, new Form());
221221

222-
$this->assertViolation('invalid_message_key', array(
223-
'{{ value }}' => 'foo',
224-
'{{ foo }}' => 'bar',
225-
), 'property.path', 'foo', null, Form::ERR_INVALID);
222+
$this->buildViolation('invalid_message_key')
223+
->setParameter('{{ value }}', 'foo')
224+
->setParameter('{{ foo }}', 'bar')
225+
->setInvalidValue('foo')
226+
->setCode(Form::ERR_INVALID)
227+
->assertRaised();
226228
}
227229

228230
public function testAddInvalidErrorEvenIfNoValidationGroups()
@@ -251,10 +253,12 @@ function () { throw new TransformationFailedException(); }
251253

252254
$this->validator->validate($form, new Form());
253255

254-
$this->assertViolation('invalid_message_key', array(
255-
'{{ value }}' => 'foo',
256-
'{{ foo }}' => 'bar',
257-
), 'property.path', 'foo', null, Form::ERR_INVALID);
256+
$this->buildViolation('invalid_message_key')
257+
->setParameter('{{ value }}', 'foo')
258+
->setParameter('{{ foo }}', 'bar')
259+
->setInvalidValue('foo')
260+
->setCode(Form::ERR_INVALID)
261+
->assertRaised();
258262
}
259263

260264
public function testDontValidateConstraintsIfNotSynchronized()
@@ -283,9 +287,11 @@ function () { throw new TransformationFailedException(); }
283287

284288
$this->validator->validate($form, new Form());
285289

286-
$this->assertViolation('invalid_message_key', array(
287-
'{{ value }}' => 'foo',
288-
), 'property.path','foo', null, Form::ERR_INVALID);
290+
$this->buildViolation('invalid_message_key')
291+
->setParameter('{{ value }}', 'foo')
292+
->setInvalidValue('foo')
293+
->setCode(Form::ERR_INVALID)
294+
->assertRaised();
289295
}
290296

291297
// https://github.com/symfony/symfony/issues/4359
@@ -537,9 +543,10 @@ public function testViolationIfExtraData()
537543

538544
$this->validator->validate($form, new Form());
539545

540-
$this->assertViolation('Extra!', array(
541-
'{{ extra_fields }}' => 'foo',
542-
), 'property.path', array('foo' => 'bar'));
546+
$this->buildViolation('Extra!')
547+
->setParameter('{{ extra_fields }}', 'foo')
548+
->setInvalidValue(array('foo' => 'bar'))
549+
->assertRaised();
543550
}
544551

545552
/**

src/Symfony/Component/Validator/Tests/Constraints/AbstractComparisonValidatorTestCase.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,11 @@ public function testInvalidComparisonToValue($dirtyValue, $dirtyValueAsString, $
8484

8585
$this->validator->validate($dirtyValue, $constraint);
8686

87-
$this->assertViolation('Constraint Message', array(
88-
'{{ value }}' => $dirtyValueAsString,
89-
'{{ compared_value }}' => $comparedValueString,
90-
'{{ compared_value_type }}' => $comparedValueType,
91-
));
87+
$this->buildViolation('Constraint Message')
88+
->setParameter('{{ value }}', $dirtyValueAsString)
89+
->setParameter('{{ compared_value }}', $comparedValueString)
90+
->setParameter('{{ compared_value_type }}', $comparedValueType)
91+
->assertRaised();
9292
}
9393

9494
/**

src/Symfony/Component/Validator/Tests/Constraints/AbstractConstraintValidatorTest.php

Lines changed: 170 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313

1414
use Symfony\Component\Validator\ConstraintValidatorInterface;
1515
use Symfony\Component\Validator\ConstraintViolation;
16-
use Symfony\Component\Validator\Context\ExecutionContext;
17-
use Symfony\Component\Validator\Context\ExecutionContextInterface;
16+
use Symfony\Component\Validator\ExecutionContextInterface;
1817
use Symfony\Component\Validator\Mapping\ClassMetadata;
1918
use Symfony\Component\Validator\Mapping\PropertyMetadata;
2019
use Symfony\Component\Validator\Tests\Fixtures\StubGlobalExecutionContext;
@@ -80,6 +79,19 @@ protected function createContext()
8079
->getMock();
8180
}
8281

82+
/**
83+
* @param $message
84+
* @param array $parameters
85+
* @param string $propertyPath
86+
* @param string $invalidValue
87+
* @param null $plural
88+
* @param null $code
89+
*
90+
* @return ConstraintViolation
91+
*
92+
* @deprecated To be removed in Symfony 3.0. Use
93+
* {@link buildViolation()} instead.
94+
*/
8395
protected function createViolation($message, array $parameters = array(), $propertyPath = 'property.path', $invalidValue = 'InvalidValue', $plural = null, $code = null)
8496
{
8597
return new ConstraintViolation(
@@ -169,14 +181,34 @@ protected function assertNoViolation()
169181
$this->assertCount(0, $this->context->getViolations());
170182
}
171183

184+
/**
185+
* @param $message
186+
* @param array $parameters
187+
* @param string $propertyPath
188+
* @param string $invalidValue
189+
* @param null $plural
190+
* @param null $code
191+
*
192+
* @deprecated To be removed in Symfony 3.0. Use
193+
* {@link buildViolation()} instead.
194+
*/
172195
protected function assertViolation($message, array $parameters = array(), $propertyPath = 'property.path', $invalidValue = 'InvalidValue', $plural = null, $code = null)
173196
{
174-
$violations = $this->context->getViolations();
175-
176-
$this->assertCount(1, $violations);
177-
$this->assertEquals($this->createViolation($message, $parameters, $propertyPath, $invalidValue, $plural, $code), $violations[0]);
197+
$this->buildViolation($message)
198+
->setParameters($parameters)
199+
->atPath($propertyPath)
200+
->setInvalidValue($invalidValue)
201+
->setCode($code)
202+
->setPlural($plural)
203+
->assertRaised();
178204
}
179205

206+
/**
207+
* @param array $expected
208+
*
209+
* @deprecated To be removed in Symfony 3.0. Use
210+
* {@link buildViolation()} instead.
211+
*/
180212
protected function assertViolations(array $expected)
181213
{
182214
$violations = $this->context->getViolations();
@@ -190,5 +222,137 @@ protected function assertViolations(array $expected)
190222
}
191223
}
192224

225+
/**
226+
* @param $message
227+
*
228+
* @return ConstraintViolationAssertion
229+
*/
230+
protected function buildViolation($message)
231+
{
232+
return new ConstraintViolationAssertion($this->context, $message);
233+
}
234+
193235
abstract protected function createValidator();
194236
}
237+
238+
/**
239+
* @internal
240+
*/
241+
class ConstraintViolationAssertion
242+
{
243+
/**
244+
* @var ExecutionContextInterface
245+
*/
246+
private $context;
247+
248+
/**
249+
* @var ConstraintViolationAssertion[]
250+
*/
251+
private $assertions;
252+
253+
private $message;
254+
private $parameters = array();
255+
private $invalidValue = 'InvalidValue';
256+
private $propertyPath = 'property.path';
257+
private $translationDomain;
258+
private $plural;
259+
private $code;
260+
261+
public function __construct(ExecutionContextInterface $context, $message, array $assertions = array())
262+
{
263+
$this->context = $context;
264+
$this->message = $message;
265+
$this->assertions = $assertions;
266+
}
267+
268+
public function atPath($path)
269+
{
270+
$this->propertyPath = $path;
271+
272+
return $this;
273+
}
274+
275+
public function setParameter($key, $value)
276+
{
277+
$this->parameters[$key] = $value;
278+
279+
return $this;
280+
}
281+
282+
public function setParameters(array $parameters)
283+
{
284+
$this->parameters = $parameters;
285+
286+
return $this;
287+
}
288+
289+
public function setTranslationDomain($translationDomain)
290+
{
291+
$this->translationDomain = $translationDomain;
292+
293+
return $this;
294+
}
295+
296+
public function setInvalidValue($invalidValue)
297+
{
298+
$this->invalidValue = $invalidValue;
299+
300+
return $this;
301+
}
302+
303+
public function setPlural($number)
304+
{
305+
$this->plural = $number;
306+
307+
return $this;
308+
}
309+
310+
public function setCode($code)
311+
{
312+
$this->code = $code;
313+
314+
return $this;
315+
}
316+
317+
public function buildNextViolation($message)
318+
{
319+
$assertions = $this->assertions;
320+
$assertions[] = $this;
321+
322+
return new self($this->context, $message, $assertions);
323+
}
324+
325+
public function assertRaised()
326+
{
327+
$expected = array();
328+
foreach ($this->assertions as $assertion) {
329+
$expected[] = $assertion->getViolation();
330+
}
331+
$expected[] = $this->getViolation();
332+
333+
$violations = iterator_to_array($this->context->getViolations());
334+
335+
\PHPUnit_Framework_Assert::assertCount(count($expected), $violations);
336+
337+
reset($violations);
338+
339+
foreach ($expected as $violation) {
340+
\PHPUnit_Framework_Assert::assertEquals($violation, current($violations));
341+
next($violations);
342+
}
343+
}
344+
345+
private function getViolation()
346+
{
347+
return new ConstraintViolation(
348+
null,
349+
$this->message,
350+
$this->parameters,
351+
$this->context->getRoot(),
352+
$this->propertyPath,
353+
$this->invalidValue,
354+
$this->plural,
355+
$this->code
356+
);
357+
}
358+
}

src/Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,9 @@ public function testInvalidValues($value, $valueAsString)
4646

4747
$this->validator->validate($value, $constraint);
4848

49-
$this->assertViolation(
50-
'myMessage',
51-
array('{{ value }}' => $valueAsString)
52-
);
49+
$this->buildViolation('myMessage')
50+
->setParameter('{{ value }}', $valueAsString)
51+
->assertRaised();
5352
}
5453

5554
public function getInvalidValues()

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy