BehaviorTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. <?php
  2. /**
  3. * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
  4. * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  5. *
  6. * Licensed under The MIT License
  7. * For full copyright and license information, please see the LICENSE.txt
  8. * Redistributions of files must retain the above copyright notice.
  9. *
  10. * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
  11. * @link http://cakephp.org CakePHP(tm) Project
  12. * @since 3.0.0
  13. * @license http://www.opensource.org/licenses/mit-license.php MIT License
  14. */
  15. namespace Cake\Test\TestCase\ORM;
  16. use Cake\ORM\Behavior;
  17. use Cake\TestSuite\TestCase;
  18. /**
  19. * Test Stub.
  20. */
  21. class TestBehavior extends Behavior
  22. {
  23. /**
  24. * Test for event bindings.
  25. */
  26. public function beforeFind()
  27. {
  28. }
  29. /**
  30. * Test for event bindings.
  31. */
  32. public function beforeRules()
  33. {
  34. }
  35. /**
  36. * Test for event bindings.
  37. */
  38. public function afterRules()
  39. {
  40. }
  41. /**
  42. * Test for event bindings.
  43. */
  44. public function buildRules()
  45. {
  46. }
  47. /**
  48. * Test for event bindings.
  49. */
  50. public function afterSaveCommit()
  51. {
  52. }
  53. /**
  54. * Test for event bindings.
  55. */
  56. public function afterDeleteCommit()
  57. {
  58. }
  59. }
  60. /**
  61. * Test Stub.
  62. */
  63. class Test2Behavior extends Behavior
  64. {
  65. protected $_defaultConfig = [
  66. 'implementedFinders' => [
  67. 'foo' => 'findFoo',
  68. ],
  69. 'implementedMethods' => [
  70. 'doSomething' => 'doSomething',
  71. ]
  72. ];
  73. /**
  74. * Test for event bindings.
  75. */
  76. public function beforeFind()
  77. {
  78. }
  79. /**
  80. * Test finder
  81. */
  82. public function findFoo()
  83. {
  84. }
  85. /**
  86. * Test method
  87. */
  88. public function doSomething()
  89. {
  90. }
  91. }
  92. /**
  93. * Test3Behavior
  94. */
  95. class Test3Behavior extends Behavior
  96. {
  97. /**
  98. * Test for event bindings.
  99. */
  100. public function beforeFind()
  101. {
  102. }
  103. /**
  104. * Test finder
  105. */
  106. public function findFoo()
  107. {
  108. }
  109. /**
  110. * Test method
  111. */
  112. public function doSomething()
  113. {
  114. }
  115. /**
  116. * Test method to ensure it is ignored as a callable method.
  117. */
  118. public function verifyConfig()
  119. {
  120. return parent::verifyConfig();
  121. }
  122. /**
  123. * implementedEvents
  124. *
  125. * This class does pretend to implement beforeFind
  126. *
  127. * @return void
  128. */
  129. public function implementedEvents()
  130. {
  131. return ['Model.beforeFind' => 'beforeFind'];
  132. }
  133. /**
  134. * implementedFinders
  135. */
  136. public function implementedFinders()
  137. {
  138. }
  139. /**
  140. * implementedMethods
  141. */
  142. public function implementedMethods()
  143. {
  144. }
  145. /**
  146. * Expose protected method for testing
  147. *
  148. * Since this is public - it'll show up as callable which is a side-effect
  149. *
  150. * @return array
  151. */
  152. public function testReflectionCache()
  153. {
  154. return $this->_reflectionCache();
  155. }
  156. }
  157. /**
  158. * Behavior test case
  159. */
  160. class BehaviorTest extends TestCase
  161. {
  162. /**
  163. * Test the side effects of the constructor.
  164. *
  165. * @return void
  166. */
  167. public function testConstructor()
  168. {
  169. $table = $this->getMock('Cake\ORM\Table');
  170. $config = ['key' => 'value'];
  171. $behavior = new TestBehavior($table, $config);
  172. $this->assertEquals($config, $behavior->config());
  173. }
  174. public function testReflectionCache()
  175. {
  176. $table = $this->getMock('Cake\ORM\Table');
  177. $behavior = new Test3Behavior($table);
  178. $expected = [
  179. 'finders' => [
  180. 'foo' => 'findFoo'
  181. ],
  182. 'methods' => [
  183. 'doSomething' => 'doSomething',
  184. 'testReflectionCache' => 'testReflectionCache'
  185. ]
  186. ];
  187. $this->assertEquals($expected, $behavior->testReflectionCache());
  188. }
  189. /**
  190. * Test the default behavior of implementedEvents
  191. *
  192. * @return void
  193. */
  194. public function testImplementedEvents()
  195. {
  196. $table = $this->getMock('Cake\ORM\Table');
  197. $behavior = new TestBehavior($table);
  198. $expected = [
  199. 'Model.beforeFind' => 'beforeFind',
  200. 'Model.afterSaveCommit' => 'afterSaveCommit',
  201. 'Model.buildRules' => 'buildRules',
  202. 'Model.beforeRules' => 'beforeRules',
  203. 'Model.afterRules' => 'afterRules',
  204. 'Model.afterDeleteCommit' => 'afterDeleteCommit',
  205. ];
  206. $this->assertEquals($expected, $behavior->implementedEvents());
  207. }
  208. /**
  209. * Test that implementedEvents uses the priority setting.
  210. *
  211. * @return void
  212. */
  213. public function testImplementedEventsWithPriority()
  214. {
  215. $table = $this->getMock('Cake\ORM\Table');
  216. $behavior = new TestBehavior($table, ['priority' => 10]);
  217. $expected = [
  218. 'Model.beforeFind' => [
  219. 'priority' => 10,
  220. 'callable' => 'beforeFind'
  221. ],
  222. 'Model.afterSaveCommit' => [
  223. 'priority' => 10,
  224. 'callable' => 'afterSaveCommit'
  225. ],
  226. 'Model.beforeRules' => [
  227. 'priority' => 10,
  228. 'callable' => 'beforeRules'
  229. ],
  230. 'Model.afterRules' => [
  231. 'priority' => 10,
  232. 'callable' => 'afterRules'
  233. ],
  234. 'Model.buildRules' => [
  235. 'priority' => 10,
  236. 'callable' => 'buildRules'
  237. ],
  238. 'Model.afterDeleteCommit' => [
  239. 'priority' => 10,
  240. 'callable' => 'afterDeleteCommit'
  241. ],
  242. ];
  243. $this->assertEquals($expected, $behavior->implementedEvents());
  244. }
  245. /**
  246. * testImplementedMethods
  247. *
  248. * @return void
  249. */
  250. public function testImplementedMethods()
  251. {
  252. $table = $this->getMock('Cake\ORM\Table');
  253. $behavior = new Test2Behavior($table);
  254. $expected = [
  255. 'doSomething' => 'doSomething'
  256. ];
  257. $this->assertEquals($expected, $behavior->implementedMethods());
  258. }
  259. /**
  260. * testImplementedMethodsAliased
  261. *
  262. * @return void
  263. */
  264. public function testImplementedMethodsAliased()
  265. {
  266. $table = $this->getMock('Cake\ORM\Table');
  267. $behavior = new Test2Behavior($table, [
  268. 'implementedMethods' => [
  269. 'aliased' => 'doSomething'
  270. ]
  271. ]);
  272. $expected = [
  273. 'aliased' => 'doSomething'
  274. ];
  275. $this->assertEquals($expected, $behavior->implementedMethods());
  276. }
  277. /**
  278. * testImplementedMethodsDisabled
  279. *
  280. * @return void
  281. */
  282. public function testImplementedMethodsDisabled()
  283. {
  284. $table = $this->getMock('Cake\ORM\Table');
  285. $behavior = new Test2Behavior($table, [
  286. 'implementedMethods' => []
  287. ]);
  288. $expected = [];
  289. $this->assertEquals($expected, $behavior->implementedMethods());
  290. }
  291. /**
  292. * testImplementedFinders
  293. *
  294. * @return void
  295. */
  296. public function testImplementedFinders()
  297. {
  298. $table = $this->getMock('Cake\ORM\Table');
  299. $behavior = new Test2Behavior($table);
  300. $expected = [
  301. 'foo' => 'findFoo',
  302. ];
  303. $this->assertEquals($expected, $behavior->implementedFinders());
  304. }
  305. /**
  306. * testImplementedFindersAliased
  307. *
  308. * @return void
  309. */
  310. public function testImplementedFindersAliased()
  311. {
  312. $table = $this->getMock('Cake\ORM\Table');
  313. $behavior = new Test2Behavior($table, [
  314. 'implementedFinders' => [
  315. 'aliased' => 'findFoo'
  316. ]
  317. ]);
  318. $expected = [
  319. 'aliased' => 'findFoo'
  320. ];
  321. $this->assertEquals($expected, $behavior->implementedFinders());
  322. }
  323. /**
  324. * testImplementedFindersDisabled
  325. *
  326. * @return void
  327. */
  328. public function testImplementedFindersDisabled()
  329. {
  330. $table = $this->getMock('Cake\ORM\Table');
  331. $behavior = new Test2Behavior($table, [
  332. 'implementedFinders' => []
  333. ]);
  334. $this->assertEquals([], $behavior->implementedFinders());
  335. }
  336. /**
  337. * testVerifyConfig
  338. *
  339. * Don't expect an exception to be thrown
  340. *
  341. * @return void
  342. */
  343. public function testVerifyConfig()
  344. {
  345. $table = $this->getMock('Cake\ORM\Table');
  346. $behavior = new Test2Behavior($table);
  347. $behavior->verifyConfig();
  348. $this->assertTrue(true, 'No exception thrown');
  349. }
  350. /**
  351. * testVerifyConfigImplementedFindersOverridden
  352. *
  353. * Simply don't expect an exception to be thrown
  354. *
  355. * @return void
  356. */
  357. public function testVerifyConfigImplementedFindersOverridden()
  358. {
  359. $table = $this->getMock('Cake\ORM\Table');
  360. $behavior = new Test2Behavior($table, [
  361. 'implementedFinders' => [
  362. 'aliased' => 'findFoo'
  363. ]
  364. ]);
  365. $behavior->verifyConfig();
  366. $this->assertTrue(true, 'No exception thrown');
  367. }
  368. /**
  369. * testVerifyImplementedFindersInvalid
  370. *
  371. * @expectedException \Cake\Core\Exception\Exception
  372. * @expectedExceptionMessage The method findNotDefined is not callable on class Cake\Test\TestCase\ORM\Test2Behavior
  373. *
  374. * @return void
  375. */
  376. public function testVerifyImplementedFindersInvalid()
  377. {
  378. $table = $this->getMock('Cake\ORM\Table');
  379. $behavior = new Test2Behavior($table, [
  380. 'implementedFinders' => [
  381. 'aliased' => 'findNotDefined'
  382. ]
  383. ]);
  384. $behavior->verifyConfig();
  385. }
  386. /**
  387. * testVerifyConfigImplementedMethodsOverridden
  388. *
  389. * Don't expect an exception to be thrown
  390. *
  391. * @return void
  392. */
  393. public function testVerifyConfigImplementedMethodsOverridden()
  394. {
  395. $table = $this->getMock('Cake\ORM\Table');
  396. $behavior = new Test2Behavior($table);
  397. $behavior = new Test2Behavior($table, [
  398. 'implementedMethods' => [
  399. 'aliased' => 'doSomething'
  400. ]
  401. ]);
  402. $behavior->verifyConfig();
  403. $this->assertTrue(true, 'No exception thrown');
  404. }
  405. /**
  406. * testVerifyImplementedMethodsInvalid
  407. *
  408. * @expectedException \Cake\Core\Exception\Exception
  409. * @expectedExceptionMessage The method iDoNotExist is not callable on class Cake\Test\TestCase\ORM\Test2Behavior
  410. *
  411. * @return void
  412. */
  413. public function testVerifyImplementedMethodsInvalid()
  414. {
  415. $table = $this->getMock('Cake\ORM\Table');
  416. $behavior = new Test2Behavior($table, [
  417. 'implementedMethods' => [
  418. 'aliased' => 'iDoNotExist'
  419. ]
  420. ]);
  421. $behavior->verifyConfig();
  422. }
  423. }