RulesCheckerTest.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
  5. * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  6. *
  7. * Licensed under The MIT License
  8. * For full copyright and license information, please see the LICENSE.txt
  9. * Redistributions of files must retain the above copyright notice.
  10. *
  11. * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  12. * @link https://cakephp.org CakePHP(tm) Project
  13. * @since 3.0.7
  14. * @license https://opensource.org/licenses/mit-license.php MIT License
  15. */
  16. namespace Cake\Test\TestCase\Datasource;
  17. use Cake\Datasource\RulesChecker;
  18. use Cake\ORM\Entity;
  19. use Cake\TestSuite\TestCase;
  20. /**
  21. * Tests the integration between the ORM and the domain checker
  22. */
  23. class RulesCheckerTest extends TestCase
  24. {
  25. /**
  26. * Test adding rule for update mode
  27. */
  28. public function testAddingRuleDeleteMode(): void
  29. {
  30. $entity = new Entity([
  31. 'name' => 'larry',
  32. ]);
  33. $rules = new RulesChecker();
  34. $rules->addDelete(
  35. function () {
  36. return false;
  37. },
  38. 'ruleName',
  39. ['errorField' => 'name']
  40. );
  41. $this->assertTrue($rules->check($entity, RulesChecker::CREATE));
  42. $this->assertEmpty($entity->getErrors());
  43. $this->assertTrue($rules->check($entity, RulesChecker::UPDATE));
  44. $this->assertEmpty($entity->getErrors());
  45. $this->assertFalse($rules->check($entity, RulesChecker::DELETE));
  46. $this->assertEquals(['ruleName' => 'invalid'], $entity->getError('name'));
  47. }
  48. /**
  49. * Test adding rule for update mode
  50. */
  51. public function testAddingRuleUpdateMode(): void
  52. {
  53. $entity = new Entity([
  54. 'name' => 'larry',
  55. ]);
  56. $rules = new RulesChecker();
  57. $rules->addUpdate(
  58. function () {
  59. return false;
  60. },
  61. 'ruleName',
  62. ['errorField' => 'name']
  63. );
  64. $this->assertTrue($rules->check($entity, RulesChecker::CREATE));
  65. $this->assertEmpty($entity->getErrors());
  66. $this->assertTrue($rules->check($entity, RulesChecker::DELETE));
  67. $this->assertEmpty($entity->getErrors());
  68. $this->assertFalse($rules->check($entity, RulesChecker::UPDATE));
  69. $this->assertEquals(['ruleName' => 'invalid'], $entity->getError('name'));
  70. }
  71. /**
  72. * Test adding rule for create mode
  73. */
  74. public function testAddingRuleCreateMode(): void
  75. {
  76. $entity = new Entity([
  77. 'name' => 'larry',
  78. ]);
  79. $rules = new RulesChecker();
  80. $rules->addCreate(
  81. function () {
  82. return false;
  83. },
  84. 'ruleName',
  85. ['errorField' => 'name']
  86. );
  87. $this->assertTrue($rules->check($entity, RulesChecker::UPDATE));
  88. $this->assertEmpty($entity->getErrors());
  89. $this->assertTrue($rules->check($entity, RulesChecker::DELETE));
  90. $this->assertEmpty($entity->getErrors());
  91. $this->assertFalse($rules->check($entity, RulesChecker::CREATE));
  92. $this->assertEquals(['ruleName' => 'invalid'], $entity->getError('name'));
  93. }
  94. /**
  95. * Test adding rule with name
  96. */
  97. public function testAddingRuleWithName(): void
  98. {
  99. $entity = new Entity([
  100. 'name' => 'larry',
  101. ]);
  102. $rules = new RulesChecker();
  103. $rules->add(
  104. function () {
  105. return false;
  106. },
  107. 'ruleName',
  108. ['errorField' => 'name']
  109. );
  110. $this->assertFalse($rules->check($entity, RulesChecker::CREATE));
  111. $this->assertEquals(['ruleName' => 'invalid'], $entity->getError('name'));
  112. }
  113. /**
  114. * Test that returned error messages work.
  115. */
  116. public function testAddWithErrorMessage(): void
  117. {
  118. $entity = new Entity([
  119. 'name' => 'larry',
  120. ]);
  121. $rules = new RulesChecker();
  122. $rules->add(
  123. function () {
  124. return 'worst thing ever';
  125. },
  126. ['errorField' => 'name']
  127. );
  128. $this->assertFalse($rules->check($entity, RulesChecker::CREATE));
  129. $this->assertEquals(['worst thing ever'], $entity->getError('name'));
  130. }
  131. /**
  132. * Test that returned error messages work.
  133. */
  134. public function testAddWithMessageOption(): void
  135. {
  136. $entity = new Entity([
  137. 'name' => 'larry',
  138. ]);
  139. $rules = new RulesChecker();
  140. $rules->add(
  141. function () {
  142. return false;
  143. },
  144. ['message' => 'this is bad', 'errorField' => 'name']
  145. );
  146. $this->assertFalse($rules->check($entity, RulesChecker::CREATE));
  147. $this->assertEquals(['this is bad'], $entity->getError('name'));
  148. }
  149. /**
  150. * Test that returned error messages work.
  151. */
  152. public function testAddWithoutFields(): void
  153. {
  154. $entity = new Entity([
  155. 'name' => 'larry',
  156. ]);
  157. $rules = new RulesChecker();
  158. $rules->add(function () {
  159. return false;
  160. });
  161. $this->assertFalse($rules->check($entity, RulesChecker::CREATE));
  162. $this->assertEmpty($entity->getErrors());
  163. }
  164. public function testRemove(): void
  165. {
  166. $entity = new Entity([
  167. 'name' => 'larry',
  168. ]);
  169. $rules = new RulesChecker();
  170. $rules->add(
  171. function () {
  172. return false;
  173. },
  174. 'ruleName',
  175. );
  176. $this->assertFalse($rules->check($entity, RulesChecker::CREATE));
  177. $rules->remove('ruleName');
  178. $this->assertTrue($rules->check($entity, RulesChecker::CREATE));
  179. }
  180. public function testRemoveCreate(): void
  181. {
  182. $rules = new RulesChecker();
  183. $rules->addCreate(
  184. function () {
  185. return false;
  186. },
  187. 'ruleName',
  188. );
  189. $entity = new Entity();
  190. $this->assertFalse($rules->check($entity, RulesChecker::CREATE));
  191. $rules->removeCreate('ruleName');
  192. $this->assertTrue($rules->check($entity, RulesChecker::CREATE));
  193. }
  194. public function testRemoveUpdate(): void
  195. {
  196. $rules = new RulesChecker();
  197. $rules->addUpdate(
  198. function () {
  199. return false;
  200. },
  201. 'ruleName',
  202. );
  203. $entity = new Entity();
  204. $this->assertFalse($rules->check($entity, RulesChecker::UPDATE));
  205. $rules->removeUpdate('ruleName');
  206. $this->assertTrue($rules->check($entity, RulesChecker::UPDATE));
  207. }
  208. public function testRemoveDelete(): void
  209. {
  210. $rules = new RulesChecker();
  211. $rules->addDelete(
  212. function () {
  213. return false;
  214. },
  215. 'ruleName',
  216. );
  217. $entity = new Entity();
  218. $this->assertFalse($rules->check($entity, RulesChecker::DELETE));
  219. $rules->removeDelete('ruleName');
  220. $this->assertTrue($rules->check($entity, RulesChecker::DELETE));
  221. }
  222. }