BehaviorTest.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  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.0
  14. * @license https://opensource.org/licenses/mit-license.php MIT License
  15. */
  16. namespace Cake\Test\TestCase\ORM;
  17. use Cake\Core\Exception\CakeException;
  18. use Cake\ORM\Table;
  19. use Cake\TestSuite\TestCase;
  20. use TestApp\Model\Behavior\Test2Behavior;
  21. use TestApp\Model\Behavior\Test3Behavior;
  22. use TestApp\Model\Behavior\TestBehavior;
  23. /**
  24. * Behavior test case
  25. */
  26. class BehaviorTest extends TestCase
  27. {
  28. /**
  29. * Test the side effects of the constructor.
  30. */
  31. public function testConstructor(): void
  32. {
  33. $table = $this->getMockBuilder(Table::class)->getMock();
  34. $config = ['key' => 'value'];
  35. $behavior = new TestBehavior($table, $config);
  36. $this->assertEquals($config, $behavior->getConfig());
  37. }
  38. /**
  39. * Test getting table instance.
  40. */
  41. public function testGetTable(): void
  42. {
  43. $table = $this->getMockBuilder(Table::class)->getMock();
  44. $behavior = new TestBehavior($table);
  45. $this->assertSame($table, $behavior->table());
  46. }
  47. public function testReflectionCache(): void
  48. {
  49. $table = $this->getMockBuilder(Table::class)->getMock();
  50. $behavior = new Test3Behavior($table);
  51. $expected = [
  52. 'finders' => [
  53. 'foo' => 'findFoo',
  54. ],
  55. 'methods' => [
  56. 'doSomething' => 'doSomething',
  57. 'testReflectionCache' => 'testReflectionCache',
  58. ],
  59. ];
  60. $this->assertEquals($expected, $behavior->testReflectionCache());
  61. }
  62. /**
  63. * Test the default behavior of implementedEvents
  64. */
  65. public function testImplementedEvents(): void
  66. {
  67. $table = $this->getMockBuilder(Table::class)->getMock();
  68. $behavior = new TestBehavior($table);
  69. $expected = [
  70. 'Model.beforeFind' => 'beforeFind',
  71. 'Model.afterSaveCommit' => 'afterSaveCommit',
  72. 'Model.buildRules' => 'buildRules',
  73. 'Model.beforeRules' => 'beforeRules',
  74. 'Model.afterRules' => 'afterRules',
  75. 'Model.afterDeleteCommit' => 'afterDeleteCommit',
  76. ];
  77. $this->assertEquals($expected, $behavior->implementedEvents());
  78. }
  79. /**
  80. * Test that implementedEvents uses the priority setting.
  81. */
  82. public function testImplementedEventsWithPriority(): void
  83. {
  84. $table = $this->getMockBuilder(Table::class)->getMock();
  85. $behavior = new TestBehavior($table, ['priority' => 10]);
  86. $expected = [
  87. 'Model.beforeFind' => [
  88. 'priority' => 10,
  89. 'callable' => 'beforeFind',
  90. ],
  91. 'Model.afterSaveCommit' => [
  92. 'priority' => 10,
  93. 'callable' => 'afterSaveCommit',
  94. ],
  95. 'Model.beforeRules' => [
  96. 'priority' => 10,
  97. 'callable' => 'beforeRules',
  98. ],
  99. 'Model.afterRules' => [
  100. 'priority' => 10,
  101. 'callable' => 'afterRules',
  102. ],
  103. 'Model.buildRules' => [
  104. 'priority' => 10,
  105. 'callable' => 'buildRules',
  106. ],
  107. 'Model.afterDeleteCommit' => [
  108. 'priority' => 10,
  109. 'callable' => 'afterDeleteCommit',
  110. ],
  111. ];
  112. $this->assertEquals($expected, $behavior->implementedEvents());
  113. }
  114. /**
  115. * testImplementedMethods
  116. */
  117. public function testImplementedMethods(): void
  118. {
  119. $table = $this->getMockBuilder(Table::class)->getMock();
  120. $behavior = new Test2Behavior($table);
  121. $expected = [
  122. 'doSomething' => 'doSomething',
  123. ];
  124. $this->assertEquals($expected, $behavior->implementedMethods());
  125. }
  126. /**
  127. * testImplementedMethodsAliased
  128. */
  129. public function testImplementedMethodsAliased(): void
  130. {
  131. $table = $this->getMockBuilder(Table::class)->getMock();
  132. $behavior = new Test2Behavior($table, [
  133. 'implementedMethods' => [
  134. 'aliased' => 'doSomething',
  135. ],
  136. ]);
  137. $expected = [
  138. 'aliased' => 'doSomething',
  139. ];
  140. $this->assertEquals($expected, $behavior->implementedMethods());
  141. }
  142. /**
  143. * testImplementedMethodsDisabled
  144. */
  145. public function testImplementedMethodsDisabled(): void
  146. {
  147. $table = $this->getMockBuilder(Table::class)->getMock();
  148. $behavior = new Test2Behavior($table, [
  149. 'implementedMethods' => [],
  150. ]);
  151. $expected = [];
  152. $this->assertEquals($expected, $behavior->implementedMethods());
  153. }
  154. /**
  155. * testImplementedFinders
  156. */
  157. public function testImplementedFinders(): void
  158. {
  159. $table = $this->getMockBuilder(Table::class)->getMock();
  160. $behavior = new Test2Behavior($table);
  161. $expected = [
  162. 'foo' => 'findFoo',
  163. ];
  164. $this->assertEquals($expected, $behavior->implementedFinders());
  165. }
  166. /**
  167. * testImplementedFindersAliased
  168. */
  169. public function testImplementedFindersAliased(): void
  170. {
  171. $table = $this->getMockBuilder(Table::class)->getMock();
  172. $behavior = new Test2Behavior($table, [
  173. 'implementedFinders' => [
  174. 'aliased' => 'findFoo',
  175. ],
  176. ]);
  177. $expected = [
  178. 'aliased' => 'findFoo',
  179. ];
  180. $this->assertEquals($expected, $behavior->implementedFinders());
  181. }
  182. /**
  183. * testImplementedFindersDisabled
  184. */
  185. public function testImplementedFindersDisabled(): void
  186. {
  187. $table = $this->getMockBuilder(Table::class)->getMock();
  188. $behavior = new Test2Behavior($table, [
  189. 'implementedFinders' => [],
  190. ]);
  191. $this->assertEquals([], $behavior->implementedFinders());
  192. }
  193. /**
  194. * testVerifyConfig
  195. *
  196. * Don't expect an exception to be thrown
  197. */
  198. public function testVerifyConfig(): void
  199. {
  200. $table = $this->getMockBuilder(Table::class)->getMock();
  201. $behavior = new Test2Behavior($table);
  202. $behavior->verifyConfig();
  203. $this->assertTrue(true, 'No exception thrown');
  204. }
  205. /**
  206. * testVerifyConfigImplementedFindersOverridden
  207. *
  208. * Simply don't expect an exception to be thrown
  209. */
  210. public function testVerifyConfigImplementedFindersOverridden(): void
  211. {
  212. $table = $this->getMockBuilder(Table::class)->getMock();
  213. $behavior = new Test2Behavior($table, [
  214. 'implementedFinders' => [
  215. 'aliased' => 'findFoo',
  216. ],
  217. ]);
  218. $behavior->verifyConfig();
  219. $this->assertTrue(true, 'No exception thrown');
  220. }
  221. /**
  222. * testVerifyImplementedFindersInvalid
  223. */
  224. public function testVerifyImplementedFindersInvalid(): void
  225. {
  226. $this->expectException(CakeException::class);
  227. $this->expectExceptionMessage('The method findNotDefined is not callable on class ' . Test2Behavior::class);
  228. $table = $this->getMockBuilder(Table::class)->getMock();
  229. $behavior = new Test2Behavior($table, [
  230. 'implementedFinders' => [
  231. 'aliased' => 'findNotDefined',
  232. ],
  233. ]);
  234. $behavior->verifyConfig();
  235. }
  236. /**
  237. * testVerifyConfigImplementedMethodsOverridden
  238. *
  239. * Don't expect an exception to be thrown
  240. */
  241. public function testVerifyConfigImplementedMethodsOverridden(): void
  242. {
  243. $table = $this->getMockBuilder(Table::class)->getMock();
  244. $behavior = new Test2Behavior($table);
  245. $behavior = new Test2Behavior($table, [
  246. 'implementedMethods' => [
  247. 'aliased' => 'doSomething',
  248. ],
  249. ]);
  250. $behavior->verifyConfig();
  251. $this->assertTrue(true, 'No exception thrown');
  252. }
  253. /**
  254. * testVerifyImplementedMethodsInvalid
  255. */
  256. public function testVerifyImplementedMethodsInvalid(): void
  257. {
  258. $this->expectException(CakeException::class);
  259. $this->expectExceptionMessage('The method iDoNotExist is not callable on class ' . Test2Behavior::class);
  260. $table = $this->getMockBuilder(Table::class)->getMock();
  261. $behavior = new Test2Behavior($table, [
  262. 'implementedMethods' => [
  263. 'aliased' => 'iDoNotExist',
  264. ],
  265. ]);
  266. $behavior->verifyConfig();
  267. }
  268. }