ValidatorTest.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Test\Unit;
  7. /**
  8. * Test case for \Magento\Framework\Validator
  9. */
  10. class ValidatorTest extends \PHPUnit\Framework\TestCase
  11. {
  12. /**
  13. * @var \Magento\Framework\Validator
  14. */
  15. protected $_validator;
  16. /**
  17. * Set up
  18. */
  19. protected function setUp()
  20. {
  21. $this->_validator = new \Magento\Framework\Validator();
  22. }
  23. /**
  24. * Cleanup validator instance to unset default translator if any
  25. */
  26. protected function tearDown()
  27. {
  28. unset($this->_validator);
  29. }
  30. /**
  31. * Test isValid method
  32. *
  33. * @dataProvider isValidDataProvider
  34. *
  35. * @param mixed $value
  36. * @param \Magento\Framework\Validator\ValidatorInterface[] $validators
  37. * @param boolean $expectedResult
  38. * @param array $expectedMessages
  39. * @param boolean $breakChainOnFailure
  40. */
  41. public function testIsValid(
  42. $value,
  43. $validators,
  44. $expectedResult,
  45. $expectedMessages = [],
  46. $breakChainOnFailure = false
  47. ) {
  48. foreach ($validators as $validator) {
  49. $this->_validator->addValidator($validator, $breakChainOnFailure);
  50. }
  51. $this->assertEquals($expectedResult, $this->_validator->isValid($value));
  52. $this->assertEquals($expectedMessages, $this->_validator->getMessages($value));
  53. }
  54. /**
  55. * Data provider for testIsValid
  56. *
  57. * @return array
  58. */
  59. public function isValidDataProvider()
  60. {
  61. $result = [];
  62. $value = 'test';
  63. // Case 1. Validators fails without breaking chain
  64. $validatorA = $this->createMock(\Magento\Framework\Validator\ValidatorInterface::class);
  65. $validatorA->expects($this->once())->method('isValid')->with($value)->will($this->returnValue(false));
  66. $validatorA->expects(
  67. $this->once()
  68. )->method(
  69. 'getMessages'
  70. )->will(
  71. $this->returnValue(['foo' => ['Foo message 1'], 'bar' => ['Foo message 2']])
  72. );
  73. $validatorB = $this->createMock(\Magento\Framework\Validator\ValidatorInterface::class);
  74. $validatorB->expects($this->once())->method('isValid')->with($value)->will($this->returnValue(false));
  75. $validatorB->expects(
  76. $this->once()
  77. )->method(
  78. 'getMessages'
  79. )->will(
  80. $this->returnValue(['foo' => ['Bar message 1'], 'bar' => ['Bar message 2']])
  81. );
  82. $result[] = [
  83. $value,
  84. [$validatorA, $validatorB],
  85. false,
  86. ['foo' => ['Foo message 1', 'Bar message 1'], 'bar' => ['Foo message 2', 'Bar message 2']],
  87. ];
  88. // Case 2. Validators fails with breaking chain
  89. $validatorA = $this->createMock(\Magento\Framework\Validator\ValidatorInterface::class);
  90. $validatorA->expects($this->once())->method('isValid')->with($value)->will($this->returnValue(false));
  91. $validatorA->expects(
  92. $this->once()
  93. )->method(
  94. 'getMessages'
  95. )->will(
  96. $this->returnValue(['field' => 'Error message'])
  97. );
  98. $validatorB = $this->createMock(\Magento\Framework\Validator\ValidatorInterface::class);
  99. $validatorB->expects($this->never())->method('isValid');
  100. $result[] = [$value, [$validatorA, $validatorB], false, ['field' => 'Error message'], true];
  101. // Case 3. Validators succeed
  102. $validatorA = $this->createMock(\Magento\Framework\Validator\ValidatorInterface::class);
  103. $validatorA->expects($this->once())->method('isValid')->with($value)->will($this->returnValue(true));
  104. $validatorA->expects($this->never())->method('getMessages');
  105. $validatorB = $this->createMock(\Magento\Framework\Validator\ValidatorInterface::class);
  106. $validatorB->expects($this->once())->method('isValid')->with($value)->will($this->returnValue(true));
  107. $validatorB->expects($this->never())->method('getMessages');
  108. $result[] = [$value, [$validatorA, $validatorB], true];
  109. return $result;
  110. }
  111. /**
  112. * Test addValidator
  113. */
  114. public function testAddValidator()
  115. {
  116. $fooValidator = new \Magento\Framework\Validator\Test\Unit\Test\IsTrue();
  117. $classConstraint = new \Magento\Framework\Validator\Constraint($fooValidator, 'id');
  118. $propertyValidator = new \Magento\Framework\Validator\Constraint\Property($classConstraint, 'name', 'id');
  119. /** @var \Magento\Framework\Translate\AbstractAdapter $translator */
  120. $translator = $this->getMockBuilder(
  121. \Magento\Framework\Translate\AbstractAdapter::class
  122. )->getMockForAbstractClass();
  123. \Magento\Framework\Validator\AbstractValidator::setDefaultTranslator($translator);
  124. $this->_validator->addValidator($classConstraint);
  125. $this->_validator->addValidator($propertyValidator);
  126. $expected = [
  127. ['instance' => $classConstraint, 'breakChainOnFailure' => false],
  128. ['instance' => $propertyValidator, 'breakChainOnFailure' => false],
  129. ];
  130. $this->assertAttributeEquals($expected, '_validators', $this->_validator);
  131. $this->assertEquals($translator, $fooValidator->getTranslator(), 'Translator was not set');
  132. }
  133. /**
  134. * Check that translator passed into validator in chain
  135. */
  136. public function testSetTranslator()
  137. {
  138. $fooValidator = new \Magento\Framework\Validator\Test\Unit\Test\IsTrue();
  139. $this->_validator->addValidator($fooValidator);
  140. /** @var \Magento\Framework\Translate\AbstractAdapter $translator */
  141. $translator = $this->getMockBuilder(
  142. \Magento\Framework\Translate\AbstractAdapter::class
  143. )->getMockForAbstractClass();
  144. $this->_validator->setTranslator($translator);
  145. $this->assertEquals($translator, $fooValidator->getTranslator());
  146. $this->assertEquals($translator, $this->_validator->getTranslator());
  147. }
  148. }