PageRenderTime 44ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/Tests/Unit/Validation/Validator/GenericObjectValidatorTest.php

https://github.com/christianjul/FLOW3-Composer
PHP | 194 lines | 113 code | 37 blank | 44 comment | 0 complexity | 5cb5ce218807c4339df894c8635f663f MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-3.0
  1. <?php
  2. namespace TYPO3\FLOW3\Tests\Unit\Validation\Validator;
  3. /* *
  4. * This script belongs to the FLOW3 framework. *
  5. * *
  6. * It is free software; you can redistribute it and/or modify it under *
  7. * the terms of the GNU Lesser General Public License, either version 3 *
  8. * of the License, or (at your option) any later version. *
  9. * *
  10. * The TYPO3 project - inspiring people to share! *
  11. * */
  12. require_once('AbstractValidatorTestcase.php');
  13. /**
  14. * Testcase for the Generic Object Validator
  15. *
  16. */
  17. class GenericObjectValidatorTest extends \TYPO3\FLOW3\Tests\Unit\Validation\Validator\AbstractValidatorTestcase {
  18. protected $validatorClassName = 'TYPO3\FLOW3\Validation\Validator\GenericObjectValidator';
  19. /**
  20. * @test
  21. */
  22. public function validateReturnsNoErrorIfTheGivenValueIsAnEmptyString() {
  23. $this->assertFalse($this->validator->validate('')->hasErrors());
  24. }
  25. /**
  26. * @test
  27. */
  28. public function validatorShouldReturnErrorsIfTheValueIsNoObjectAndNotNull() {
  29. $this->assertTrue($this->validator->validate('foo')->hasErrors());
  30. }
  31. /**
  32. * @test
  33. */
  34. public function validatorShouldReturnNoErrorsIfTheValueIsNull() {
  35. $this->assertFalse($this->validator->validate(NULL)->hasErrors());
  36. }
  37. /**
  38. * @return array
  39. */
  40. public function dataProviderForValidator() {
  41. $error1 = new \TYPO3\FLOW3\Error\Error('error1', 1);
  42. $error2 = new \TYPO3\FLOW3\Error\Error('error2', 2);
  43. $emptyResult1 = new \TYPO3\FLOW3\Error\Result();
  44. $emptyResult2 = new \TYPO3\FLOW3\Error\Result();
  45. $resultWithError1 = new \TYPO3\FLOW3\Error\Result();
  46. $resultWithError1->addError($error1);
  47. $resultWithError2 = new \TYPO3\FLOW3\Error\Result();
  48. $resultWithError2->addError($error2);
  49. $classNameForObjectWithPrivateProperties = 'B' . md5(uniqid(mt_rand(), TRUE));
  50. eval('class ' . $classNameForObjectWithPrivateProperties . '{ protected $foo = \'foovalue\'; protected $bar = \'barvalue\'; }');
  51. $objectWithPrivateProperties = new $classNameForObjectWithPrivateProperties();
  52. return array(
  53. // If no errors happened, this is shown
  54. array($objectWithPrivateProperties, $emptyResult1, $emptyResult2, array()),
  55. // If errors on two properties happened, they are merged together.
  56. array($objectWithPrivateProperties, $resultWithError1, $resultWithError2, array('foo' => array($error1), 'bar' => array($error2)))
  57. );
  58. }
  59. /**
  60. * @test
  61. * @dataProvider dataProviderForValidator
  62. */
  63. public function validateChecksAllPropertiesForWhichAPropertyValidatorExists($mockObject, $validationResultForFoo, $validationResultForBar, $errors) {
  64. $validatorForFoo = $this->getMock('TYPO3\FLOW3\Validation\Validator\ValidatorInterface');
  65. $validatorForFoo->expects($this->once())->method('validate')->with('foovalue')->will($this->returnValue($validationResultForFoo));
  66. $validatorForBar = $this->getMock('TYPO3\FLOW3\Validation\Validator\ValidatorInterface');
  67. $validatorForBar->expects($this->once())->method('validate')->with('barvalue')->will($this->returnValue($validationResultForBar));
  68. $this->validator->addPropertyValidator('foo', $validatorForFoo);
  69. $this->validator->addPropertyValidator('bar', $validatorForBar);
  70. $this->assertEquals($errors, $this->validator->validate($mockObject)->getFlattenedErrors());
  71. }
  72. /**
  73. * @test
  74. */
  75. public function validateCanHandleRecursiveTargetsWithoutEndlessLooping() {
  76. $classNameA = 'B' . md5(uniqid(mt_rand(), TRUE));
  77. eval('class ' . $classNameA . '{ public $b; }');
  78. $classNameB = 'B' . md5(uniqid(mt_rand(), TRUE));
  79. eval('class ' . $classNameB . '{ public $a; }');
  80. $A = new $classNameA();
  81. $B = new $classNameB();
  82. $A->b = $B;
  83. $B->a = $A;
  84. $aValidator = new \TYPO3\FLOW3\Validation\Validator\GenericObjectValidator(array());
  85. $bValidator = new \TYPO3\FLOW3\Validation\Validator\GenericObjectValidator(array());
  86. $aValidator->addPropertyValidator('b', $bValidator);
  87. $bValidator->addPropertyValidator('a', $aValidator);
  88. $this->assertFalse($aValidator->validate($A)->hasErrors());
  89. }
  90. /**
  91. * @test
  92. */
  93. public function validateDetectsFailuresInRecursiveTargetsI() {
  94. $classNameA = 'A' . md5(uniqid(mt_rand(), TRUE));
  95. eval('class ' . $classNameA . '{ public $b; }');
  96. $classNameB = 'B' . md5(uniqid(mt_rand(), TRUE));
  97. eval('class ' . $classNameB . '{ public $a; public $uuid = 0xF; }');
  98. $A = new $classNameA();
  99. $B = new $classNameB();
  100. $A->b = $B;
  101. $B->a = $A;
  102. $aValidator = $this->getValidator();
  103. $bValidator = $this->getValidator();
  104. $aValidator->addPropertyValidator('b', $bValidator);
  105. $bValidator->addPropertyValidator('a', $aValidator);
  106. $error = new \TYPO3\FLOW3\Error\Error('error1', 123);
  107. $result = new \TYPO3\FLOW3\Error\Result();
  108. $result->addError($error);
  109. $mockUuidValidator = $this->getMock('TYPO3\FLOW3\Validation\Validator\ValidatorInterface');
  110. $mockUuidValidator->expects($this->any())->method('validate')->with(0xF)->will($this->returnValue($result));
  111. $bValidator->addPropertyValidator('uuid', $mockUuidValidator);
  112. $this->assertSame(array('b.uuid' => array($error)), $aValidator->validate($A)->getFlattenedErrors());
  113. }
  114. /**
  115. * @test
  116. */
  117. public function validateDetectsFailuresInRecursiveTargetsII() {
  118. $classNameA = 'A' . md5(uniqid(mt_rand(), TRUE));
  119. eval('class ' . $classNameA . '{ public $b; public $uuid = 0xF; }');
  120. $classNameB = 'B' . md5(uniqid(mt_rand(), TRUE));
  121. eval('class ' . $classNameB . '{ public $a; public $uuid = 0xF; }');
  122. $A = new $classNameA();
  123. $B = new $classNameB();
  124. $A->b = $B;
  125. $B->a = $A;
  126. $aValidator = $this->getValidator();
  127. $bValidator = $this->getValidator();
  128. $aValidator->addPropertyValidator('b', $bValidator);
  129. $bValidator->addPropertyValidator('a', $aValidator);
  130. $error1 = new \TYPO3\FLOW3\Error\Error('error1', 123);
  131. $result1 = new \TYPO3\FLOW3\Error\Result();
  132. $result1->addError($error1);
  133. $mockUuidValidator = $this->getMock('TYPO3\FLOW3\Validation\Validator\ValidatorInterface');
  134. $mockUuidValidator->expects($this->any())->method('validate')->with(0xF)->will($this->returnValue($result1));
  135. $aValidator->addPropertyValidator('uuid', $mockUuidValidator);
  136. $bValidator->addPropertyValidator('uuid', $mockUuidValidator);
  137. $this->assertSame(array('b.uuid' => array($error1), 'uuid' => array($error1)), $aValidator->validate($A)->getFlattenedErrors());
  138. }
  139. /**
  140. * @test
  141. */
  142. public function objectsAreValidatedOnlyOnce() {
  143. $className = 'A' . md5(uniqid(mt_rand(), TRUE));
  144. eval('class ' . $className . '{ public $integer = 1; }');
  145. $object = new $className();
  146. $integerValidator = $this->getAccessibleMock('TYPO3\FLOW3\Validation\Validator\IntegerValidator');
  147. $matcher = $this->any();
  148. $integerValidator->expects($matcher)->method('validate')->with(1)->will($this->returnValue(new \TYPO3\FLOW3\Error\Result()));
  149. $validator = $this->getValidator();
  150. $validator->addPropertyValidator('integer', $integerValidator);
  151. // Call the validation twice
  152. $validator->validate($object);
  153. $validator->validate($object);
  154. $this->assertEquals(1, $matcher->getInvocationCount());
  155. }
  156. }
  157. ?>