‪TYPO3CMS  11.5
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 
29 class ‪GenericObjectValidatorTest extends UnitTestCase
30 {
35  {
36  self::assertTrue((new ‪GenericObjectValidator())->validate('foo')->hasErrors());
37  }
38 
43  {
44  self::assertFalse((new ‪GenericObjectValidator())->validate(null)->hasErrors());
45  }
46 
50  public function ‪dataProviderForValidator(): array
51  {
52  $error1 = new ‪Error('error1', 1);
53  $error2 = new ‪Error('error2', 2);
54  $emptyResult1 = new ‪Result();
55  $emptyResult2 = new ‪Result();
56  $resultWithError1 = new ‪Result();
57  $resultWithError1->addError($error1);
58  $resultWithError2 = new ‪Result();
59  $resultWithError2->addError($error2);
60  $objectWithPrivateProperties = new class () {
61  protected $foo = 'foovalue';
62  protected $bar = 'barvalue';
63 
64  public function getFoo(): string
65  {
66  return $this->foo;
67  }
68 
69  public function getBar(): string
70  {
71  return $this->bar;
72  }
73  };
74 
75  return [
76  // If no errors happened, this is shown
77  [$objectWithPrivateProperties, $emptyResult1, $emptyResult2, []],
78  // If errors on two properties happened, they are merged together.
79  [$objectWithPrivateProperties, $resultWithError1, $resultWithError2, ['foo' => [$error1], 'bar' => [$error2]]],
80  ];
81  }
82 
92  public function ‪validateChecksAllPropertiesForWhichAPropertyValidatorExists($objectToBeValidated, $validationResultForFoo, $validationResultForBar, ‪$errors): void
93  {
95 
96  $validatorForFoo = $this->getMockBuilder(ValidatorInterface::class)
97  ->onlyMethods(['validate', 'getOptions'])
98  ->getMock();
99  $validatorForFoo->expects(self::once())->method('validate')->with('foovalue')->willReturn($validationResultForFoo);
100 
101  $validatorForBar = $this->getMockBuilder(ValidatorInterface::class)
102  ->onlyMethods(['validate', 'getOptions'])
103  ->getMock();
104  $validatorForBar->expects(self::once())->method('validate')->with('barvalue')->willReturn($validationResultForBar);
105 
106  ‪$validator->addPropertyValidator('foo', $validatorForFoo);
107  ‪$validator->addPropertyValidator('bar', $validatorForBar);
108 
109  self::assertEquals(‪$errors, ‪$validator->validate($objectToBeValidated)->getFlattenedErrors());
110  }
111 
116  {
117  $A = new class () {
118  public $b;
119  };
120 
121  $B = new class () {
122  public $a;
123  };
124 
125  $A->b = $B;
126  $B->a = $A;
127 
128  $aValidator = new ‪GenericObjectValidator();
129  $bValidator = new ‪GenericObjectValidator();
130 
131  $aValidator->addPropertyValidator('b', $bValidator);
132  $bValidator->addPropertyValidator('a', $aValidator);
133 
134  self::assertFalse($aValidator->validate($A)->hasErrors());
135  }
136 
141  {
142  $A = new class () {
143  public $b;
144  };
145 
146  $B = new class () {
147  public $a;
148  public $uuid = 0xF;
149  };
150 
151  $A->b = $B;
152  $B->a = $A;
153  $aValidator = new ‪GenericObjectValidator();
154  $bValidator = new ‪GenericObjectValidator();
155 
156  $aValidator->addPropertyValidator('b', $bValidator);
157  $bValidator->addPropertyValidator('a', $aValidator);
158  $error = new ‪Error('error1', 123);
159  $result = new ‪Result();
160  $result->addError($error);
161 
162  $mockUuidValidator = $this->getMockBuilder(ValidatorInterface::class)
163  ->onlyMethods(['validate', 'getOptions'])
164  ->getMock();
165  $mockUuidValidator->method('validate')->with(15)->willReturn($result);
166  $bValidator->addPropertyValidator('uuid', $mockUuidValidator);
167 
168  self::assertSame(['b.uuid' => [$error]], $aValidator->validate($A)->getFlattenedErrors());
169  }
170 
175  {
176  $A = new class () {
177  public $b;
178  public $uuid = 0xF;
179  };
180 
181  $B = new class () {
182  public $a;
183  public $uuid = 0xF;
184  };
185 
186  $A->b = $B;
187  $B->a = $A;
188  $aValidator = new ‪GenericObjectValidator();
189  $bValidator = new ‪GenericObjectValidator();
190 
191  $aValidator->addPropertyValidator('b', $bValidator);
192  $bValidator->addPropertyValidator('a', $aValidator);
193  $error1 = new ‪Error('error1', 123);
194  $result1 = new ‪Result();
195  $result1->addError($error1);
196 
197  $mockUuidValidator = $this->getMockBuilder(ValidatorInterface::class)
198  ->onlyMethods(['validate', 'getOptions'])
199  ->getMock();
200  $mockUuidValidator->method('validate')->with(15)->willReturn($result1);
201  $aValidator->addPropertyValidator('uuid', $mockUuidValidator);
202  $bValidator->addPropertyValidator('uuid', $mockUuidValidator);
203 
204  self::assertSame(['b.uuid' => [$error1], 'uuid' => [$error1]], $aValidator->validate($A)->getFlattenedErrors());
205  }
206 
211  {
212  // Create to test-entities. Use the same uuid to make the same validator trigger on both objects
213  $A = new class () {
214  public $b;
215  public $uuid = 0xF;
216  };
217 
218  $B = new class () {
219  public $a;
220  public $uuid = 0xF;
221  };
222 
223  $A->b = $B;
224  $B->a = $A;
225  $aValidator = new ‪GenericObjectValidator();
226  $bValidator = new ‪GenericObjectValidator();
227 
228  $error1 = new ‪Error('error1', 123);
229  $result1 = new ‪Result();
230  $result1->addError($error1);
231 
232  $mockValidatorUuidNot0xF = $this->getMockBuilder(ValidatorInterface::class)
233  ->onlyMethods(['validate', 'getOptions'])
234  ->getMock();
235  $mockValidatorUuidNot0xF
236  ->method('validate')->with(0xF)->willReturn($result1);
237 
238  $aValidator->addPropertyValidator('uuid', $mockValidatorUuidNot0xF);
239  $bValidator->addPropertyValidator('uuid', $mockValidatorUuidNot0xF);
240  $aValidator->addPropertyValidator('b', $bValidator);
241  $bValidator->addPropertyValidator('a', $aValidator);
242 
243  // assert that the validation error is being reported for both objects
244  self::assertSame(
245  ['uuid' => [$error1], 'b.uuid' => [$error1], 'b.a.uuid' => [$error1]],
246  $aValidator->validate($A)->getFlattenedErrors()
247  );
248  }
249 }
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validateDetectsFailuresInRecursiveTargetsI
‪validateDetectsFailuresInRecursiveTargetsI()
Definition: GenericObjectValidatorTest.php:140
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest
Definition: GenericObjectValidatorTest.php:30
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validateDetectsFailuresInRecursiveTargetsIII
‪validateDetectsFailuresInRecursiveTargetsIII()
Definition: GenericObjectValidatorTest.php:210
‪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:92
‪TYPO3\CMS\Extbase\Error\Error
Definition: Error.php:25
‪$validator
‪if(isset($args['d'])) $validator
Definition: validateRstFiles.php:218
‪TYPO3\CMS\Extbase\Validation\Validator\GenericObjectValidator
Definition: GenericObjectValidator.php:25
‪$errors
‪$errors
Definition: annotationChecker.php:123
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\dataProviderForValidator
‪array dataProviderForValidator()
Definition: GenericObjectValidatorTest.php:50
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validatorShouldReturnErrorsIfTheValueIsNoObjectAndNotNull
‪validatorShouldReturnErrorsIfTheValueIsNoObjectAndNotNull()
Definition: GenericObjectValidatorTest.php:34
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validateDetectsFailuresInRecursiveTargetsII
‪validateDetectsFailuresInRecursiveTargetsII()
Definition: GenericObjectValidatorTest.php:174
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator
Definition: AbstractCompositeValidatorTest.php:18
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validatorShouldReturnNoErrorsIfTheValueIsNull
‪validatorShouldReturnNoErrorsIfTheValueIsNull()
Definition: GenericObjectValidatorTest.php:42
‪TYPO3\CMS\Extbase\Validation\Validator\ValidatorInterface
Definition: ValidatorInterface.php:22
‪TYPO3\CMS\Extbase\Tests\Unit\Validation\Validator\GenericObjectValidatorTest\validateCanHandleRecursiveTargetsWithoutEndlessLooping
‪validateCanHandleRecursiveTargetsWithoutEndlessLooping()
Definition: GenericObjectValidatorTest.php:115