ValidationSetTest.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * ValidationSetTest file
  5. *
  6. * CakePHP(tm) Tests <https://book.cakephp.org/view/1196/Testing>
  7. * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  8. *
  9. * Licensed under The MIT License
  10. * For full copyright and license infValidationation, please see the LICENSE.txt
  11. * Redistributions of files must retain the above copyright notice
  12. *
  13. * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  14. * @link https://book.cakephp.org/view/1196/Testing CakePHP(tm) Tests
  15. * @since 2.2.0
  16. * @license https://opensource.org/licenses/mit-license.php MIT License
  17. */
  18. namespace Cake\Test\TestCase\Validation;
  19. use Cake\TestSuite\TestCase;
  20. use Cake\Validation\ValidationRule;
  21. use Cake\Validation\ValidationSet;
  22. /**
  23. * ValidationSetTest
  24. */
  25. class ValidationSetTest extends TestCase
  26. {
  27. /**
  28. * testGetRule method
  29. */
  30. public function testGetRule(): void
  31. {
  32. $field = new ValidationSet();
  33. $field->add('notBlank', ['rule' => 'notBlank', 'message' => 'Can not be empty']);
  34. $result = $field->rule('notBlank');
  35. $this->assertInstanceOf(ValidationRule::class, $result);
  36. $expected = new ValidationRule(['rule' => 'notBlank', 'message' => 'Can not be empty']);
  37. $this->assertEquals($expected, $result);
  38. }
  39. /**
  40. * testGetRules method
  41. */
  42. public function testGetRules(): void
  43. {
  44. $field = new ValidationSet();
  45. $field->add('notBlank', ['rule' => 'notBlank', 'message' => 'Can not be empty']);
  46. $result = $field->rules();
  47. $this->assertEquals(['notBlank'], array_keys($result));
  48. $this->assertInstanceOf(ValidationRule::class, $result['notBlank']);
  49. }
  50. /**
  51. * Tests getting a rule from the set using array access
  52. */
  53. public function testArrayAccessGet(): void
  54. {
  55. $set = (new ValidationSet())
  56. ->add('notBlank', ['rule' => 'notBlank'])
  57. ->add('numeric', ['rule' => 'numeric'])
  58. ->add('other', ['rule' => 'email']);
  59. $rule = $set['notBlank'];
  60. $this->assertInstanceOf(ValidationRule::class, $rule);
  61. $this->assertEquals(new ValidationRule(['rule' => 'notBlank']), $rule);
  62. $rule = $set['numeric'];
  63. $this->assertInstanceOf(ValidationRule::class, $rule);
  64. $this->assertEquals(new ValidationRule(['rule' => 'numeric']), $rule);
  65. $rule = $set['other'];
  66. $this->assertInstanceOf(ValidationRule::class, $rule);
  67. $this->assertEquals(new ValidationRule(['rule' => 'email']), $rule);
  68. }
  69. /**
  70. * Tests checking a rule from the set using array access
  71. */
  72. public function testArrayAccessExists(): void
  73. {
  74. $set = (new ValidationSet())
  75. ->add('notBlank', ['rule' => 'notBlank'])
  76. ->add('numeric', ['rule' => 'numeric'])
  77. ->add('other', ['rule' => 'email']);
  78. $this->assertArrayHasKey('notBlank', $set);
  79. $this->assertArrayHasKey('numeric', $set);
  80. $this->assertArrayHasKey('other', $set);
  81. $this->assertArrayNotHasKey('fail', $set);
  82. }
  83. /**
  84. * Tests setting a rule in the set using array access
  85. */
  86. public function testArrayAccessSet(): void
  87. {
  88. $set = (new ValidationSet())
  89. ->add('notBlank', ['rule' => 'notBlank']);
  90. $this->assertArrayNotHasKey('other', $set);
  91. $set['other'] = ['rule' => 'email'];
  92. $rule = $set['other'];
  93. $this->assertInstanceOf(ValidationRule::class, $rule);
  94. $this->assertEquals(new ValidationRule(['rule' => 'email']), $rule);
  95. }
  96. /**
  97. * Tests unseting a rule from the set using array access
  98. */
  99. public function testArrayAccessUnset(): void
  100. {
  101. $set = (new ValidationSet())
  102. ->add('notBlank', ['rule' => 'notBlank'])
  103. ->add('numeric', ['rule' => 'numeric'])
  104. ->add('other', ['rule' => 'email']);
  105. unset($set['notBlank']);
  106. $this->assertArrayNotHasKey('notBlank', $set);
  107. unset($set['numeric']);
  108. $this->assertArrayNotHasKey('numeric', $set);
  109. unset($set['other']);
  110. $this->assertArrayNotHasKey('other', $set);
  111. }
  112. /**
  113. * Tests it is possible to iterate a validation set object
  114. */
  115. public function testIterator(): void
  116. {
  117. $set = (new ValidationSet())
  118. ->add('notBlank', ['rule' => 'notBlank'])
  119. ->add('numeric', ['rule' => 'numeric'])
  120. ->add('other', ['rule' => 'email']);
  121. $i = 0;
  122. foreach ($set as $name => $rule) {
  123. if ($i === 0) {
  124. $this->assertSame('notBlank', $name);
  125. }
  126. if ($i === 1) {
  127. $this->assertSame('numeric', $name);
  128. }
  129. if ($i === 2) {
  130. $this->assertSame('other', $name);
  131. }
  132. $this->assertInstanceOf(ValidationRule::class, $rule);
  133. $i++;
  134. }
  135. $this->assertSame(3, $i);
  136. }
  137. /**
  138. * Tests countable interface
  139. */
  140. public function testCount(): void
  141. {
  142. $set = (new ValidationSet())
  143. ->add('notBlank', ['rule' => 'notBlank'])
  144. ->add('numeric', ['rule' => 'numeric'])
  145. ->add('other', ['rule' => 'email']);
  146. $this->assertCount(3, $set);
  147. unset($set['other']);
  148. $this->assertCount(2, $set);
  149. }
  150. /**
  151. * Test removeRule method
  152. */
  153. public function testRemoveRule(): void
  154. {
  155. $set = (new ValidationSet())
  156. ->add('notBlank', ['rule' => 'notBlank'])
  157. ->add('numeric', ['rule' => 'numeric'])
  158. ->add('other', ['rule' => 'email']);
  159. $this->assertArrayHasKey('notBlank', $set);
  160. $set->remove('notBlank');
  161. $this->assertArrayNotHasKey('notBlank', $set);
  162. $this->assertArrayHasKey('numeric', $set);
  163. $set->remove('numeric');
  164. $this->assertArrayNotHasKey('numeric', $set);
  165. $this->assertArrayHasKey('other', $set);
  166. $set->remove('other');
  167. $this->assertArrayNotHasKey('other', $set);
  168. }
  169. /**
  170. * Test requirePresence and isPresenceRequired methods
  171. */
  172. public function testRequirePresence(): void
  173. {
  174. $set = new ValidationSet();
  175. $this->assertFalse($set->isPresenceRequired());
  176. $set->requirePresence(true);
  177. $this->assertTrue($set->isPresenceRequired());
  178. $set->requirePresence(false);
  179. $this->assertFalse($set->isPresenceRequired());
  180. }
  181. /**
  182. * Test allowEmpty and isEmptyAllowed methods
  183. */
  184. public function testAllowEmpty(): void
  185. {
  186. $set = new ValidationSet();
  187. $this->assertFalse($set->isEmptyAllowed());
  188. $set->allowEmpty(true);
  189. $this->assertTrue($set->isEmptyAllowed());
  190. $set->allowEmpty(false);
  191. $this->assertFalse($set->isEmptyAllowed());
  192. }
  193. }