‪TYPO3CMS  ‪main
GenericObjectValidatorTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
24 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
25 
26 final class ‪GenericObjectValidatorTest extends UnitTestCase
27 {
32  {
33  self::assertTrue((new ‪GenericObjectValidator())->validate('foo')->hasErrors());
34  }
35 
40  {
41  self::assertFalse((new ‪GenericObjectValidator())->validate(null)->hasErrors());
42  }
43 
44  public static function ‪dataProviderForValidator(): array
45  {
46  $error1 = new ‪Error('error1', 1);
47  $error2 = new ‪Error('error2', 2);
48  $emptyResult1 = new ‪Result();
49  $emptyResult2 = new ‪Result();
50  $resultWithError1 = new ‪Result();
51  $resultWithError1->addError($error1);
52  $resultWithError2 = new ‪Result();
53  $resultWithError2->addError($error2);
54  $objectWithPrivateProperties = new class () {
55  protected $foo = 'foovalue';
56  protected $bar = 'barvalue';
57 
58  public function getFoo(): string
59  {
60  return $this->foo;
61  }
62 
63  public function getBar(): string
64  {
65  return $this->bar;
66  }
67  };
68 
69  return [
70  // If no errors happened, this is shown
71  [$objectWithPrivateProperties, $emptyResult1, $emptyResult2, []],
72  // If errors on two properties happened, they are merged together.
73  [$objectWithPrivateProperties, $resultWithError1, $resultWithError2, ['foo' => [$error1], 'bar' => [$error2]]],
74  ];
75  }
76 
86  public function ‪validateChecksAllPropertiesForWhichAPropertyValidatorExists($objectToBeValidated, $validationResultForFoo, $validationResultForBar, ‪$errors): void
87  {
89 
90  $validatorForFoo = $this->getMockBuilder(ValidatorInterface::class)
91  ->onlyMethods(['validate', 'getOptions', 'setOptions'])
92  ->getMock();
93  $validatorForFoo->expects(self::once())->method('validate')->with('foovalue')->willReturn($validationResultForFoo);
94 
95  $validatorForBar = $this->getMockBuilder(ValidatorInterface::class)
96  ->onlyMethods(['validate', 'getOptions', 'setOptions'])
97  ->getMock();
98  $validatorForBar->expects(self::once())->method('validate')->with('barvalue')->willReturn($validationResultForBar);
99 
100  ‪$validator->addPropertyValidator('foo', $validatorForFoo);
101  ‪$validator->addPropertyValidator('bar', $validatorForBar);
102 
103  self::assertEquals(‪$errors, ‪$validator->validate($objectToBeValidated)->getFlattenedErrors());
104  }
105 
110  {
111  $A = new class () {
112  public $b;
113  };
114 
115  $B = new class () {
116  public $a;
117  };
118 
119  $A->b = $B;
120  $B->a = $A;
121 
122  $aValidator = new ‪GenericObjectValidator();
123  $bValidator = new ‪GenericObjectValidator();
124 
125  $aValidator->addPropertyValidator('b', $bValidator);
126  $bValidator->addPropertyValidator('a', $aValidator);
127 
128  self::assertFalse($aValidator->validate($A)->hasErrors());
129  }
130 
135  {
136  $A = new class () {
137  public $b;
138  };
139 
140  $B = new class () {
141  public $a;
142  public $uuid = 0xF;
143  };
144 
145  $A->b = $B;
146  $B->a = $A;
147  $aValidator = new ‪GenericObjectValidator();
148  $bValidator = new ‪GenericObjectValidator();
149 
150  $aValidator->addPropertyValidator('b', $bValidator);
151  $bValidator->addPropertyValidator('a', $aValidator);
152  $error = new ‪Error('error1', 123);
153  $result = new ‪Result();
154  $result->addError($error);
155 
156  $mockUuidValidator = $this->getMockBuilder(ValidatorInterface::class)
157  ->onlyMethods(['validate', 'getOptions', 'setOptions'])
158  ->getMock();
159  $mockUuidValidator->method('validate')->with(15)->willReturn($result);
160  $bValidator->addPropertyValidator('uuid', $mockUuidValidator);
161 
162  self::assertSame(['b.uuid' => [$error]], $aValidator->validate($A)->getFlattenedErrors());
163  }
164 
169  {
170  $A = new class () {
171  public $b;
172  public $uuid = 0xF;
173  };
174 
175  $B = new class () {
176  public $a;
177  public $uuid = 0xF;
178  };
179 
180  $A->b = $B;
181  $B->a = $A;
182  $aValidator = new ‪GenericObjectValidator();
183  $bValidator = new ‪GenericObjectValidator();
184 
185  $aValidator->addPropertyValidator('b', $bValidator);
186  $bValidator->addPropertyValidator('a', $aValidator);
187  $error1 = new ‪Error('error1', 123);
188  $result1 = new ‪Result();
189  $result1->addError($error1);
190 
191  $mockUuidValidator = $this->getMockBuilder(ValidatorInterface::class)
192  ->onlyMethods(['validate', 'getOptions', 'setOptions'])
193  ->getMock();
194  $mockUuidValidator->method('validate')->with(15)->willReturn($result1);
195  $aValidator->addPropertyValidator('uuid', $mockUuidValidator);
196  $bValidator->addPropertyValidator('uuid', $mockUuidValidator);
197 
198  self::assertSame(['b.uuid' => [$error1], 'uuid' => [$error1]], $aValidator->validate($A)->getFlattenedErrors());
199  }
200 
205  {
206  // Create to test-entities. Use the same uuid to make the same validator trigger on both objects
207  $A = new class () {
208  public $b;
209  public $uuid = 0xF;
210  };
211 
212  $B = new class () {
213  public $a;
214  public $uuid = 0xF;
215  };
216 
217  $A->b = $B;
218  $B->a = $A;
219  $aValidator = new ‪GenericObjectValidator();
220  $bValidator = new ‪GenericObjectValidator();
221 
222  $error1 = new ‪Error('error1', 123);
223  $result1 = new ‪Result();
224  $result1->addError($error1);
225 
226  $mockValidatorUuidNot0xF = $this->getMockBuilder(ValidatorInterface::class)
227  ->onlyMethods(['validate', 'getOptions', 'setOptions'])
228  ->getMock();
229  $mockValidatorUuidNot0xF
230  ->method('validate')->with(0xF)->willReturn($result1);
231 
232  $aValidator->addPropertyValidator('uuid', $mockValidatorUuidNot0xF);
233  $bValidator->addPropertyValidator('uuid', $mockValidatorUuidNot0xF);
234  $aValidator->addPropertyValidator('b', $bValidator);
235  $bValidator->addPropertyValidator('a', $aValidator);
236 
237  // assert that the validation error is being reported for both objects
238  self::assertSame(
239  ['uuid' => [$error1], 'b.uuid' => [$error1], 'b.a.uuid' => [$error1]],
240  $aValidator->validate($A)->getFlattenedErrors()
241  );
242  }
243 }
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validateDetectsFailuresInRecursiveTargetsI
‪validateDetectsFailuresInRecursiveTargetsI()
Definition: GenericObjectValidatorTest.php:134
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest
Definition: GenericObjectValidatorTest.php:27
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validateDetectsFailuresInRecursiveTargetsIII
‪validateDetectsFailuresInRecursiveTargetsIII()
Definition: GenericObjectValidatorTest.php:204
‪TYPO3\CMS\Extbase\Error\Result
Definition: Result.php:24
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validateChecksAllPropertiesForWhichAPropertyValidatorExists
‪validateChecksAllPropertiesForWhichAPropertyValidatorExists($objectToBeValidated, $validationResultForFoo, $validationResultForBar, $errors)
Definition: GenericObjectValidatorTest.php:86
‪TYPO3\CMS\Extbase\Error\Error
Definition: Error.php:25
‪$validator
‪if(isset($args['d'])) $validator
Definition: validateRstFiles.php:262
‪TYPO3\CMS\Extbase\Validation\Validator\GenericObjectValidator
Definition: GenericObjectValidator.php:24
‪$errors
‪$errors
Definition: annotationChecker.php:121
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\dataProviderForValidator
‪static dataProviderForValidator()
Definition: GenericObjectValidatorTest.php:44
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validatorShouldReturnErrorsIfTheValueIsNoObjectAndNotNull
‪validatorShouldReturnErrorsIfTheValueIsNoObjectAndNotNull()
Definition: GenericObjectValidatorTest.php:31
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validateDetectsFailuresInRecursiveTargetsII
‪validateDetectsFailuresInRecursiveTargetsII()
Definition: GenericObjectValidatorTest.php:168
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator
Definition: AbstractCompositeValidatorTest.php:18
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validatorShouldReturnNoErrorsIfTheValueIsNull
‪validatorShouldReturnNoErrorsIfTheValueIsNull()
Definition: GenericObjectValidatorTest.php:39
‪TYPO3\CMS\Extbase\Validation\Validator\ValidatorInterface
Definition: ValidatorInterface.php:26
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validateCanHandleRecursiveTargetsWithoutEndlessLooping
‪validateCanHandleRecursiveTargetsWithoutEndlessLooping()
Definition: GenericObjectValidatorTest.php:109