PageRenderTime 52ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/unit/Events/ManagerCest.php

http://github.com/phalcon/cphalcon
PHP | 361 lines | 238 code | 85 blank | 38 comment | 0 complexity | 29fe23440258dab6e603bf6a8c849bdd MD5 | raw file
Possible License(s): BSD-3-Clause
  1. <?php
  2. /**
  3. * This file is part of the Phalcon Framework.
  4. *
  5. * (c) Phalcon Team <team@phalcon.io>
  6. *
  7. * For the full copyright and license information, please view the LICENSE.txt
  8. * file that was distributed with this source code.
  9. */
  10. namespace Phalcon\Test\Unit\Events;
  11. use Codeception\Example;
  12. use Phalcon\Events\Manager;
  13. use Phalcon\Test\Fixtures\Events\ComponentX;
  14. use Phalcon\Test\Fixtures\Events\ComponentY;
  15. use Phalcon\Test\Fixtures\Listener\FirstListener;
  16. use Phalcon\Test\Fixtures\Listener\SecondListener;
  17. use Phalcon\Test\Fixtures\Listener\ThirdListener;
  18. use UnitTester;
  19. class ManagerCest
  20. {
  21. protected $listener;
  22. /**
  23. * Tests attaching event listeners by event name after detaching all
  24. *
  25. * @issue https://github.com/phalcon/cphalcon/issues/1331
  26. * @author Kamil Skowron <kamil@hedonsoftware.com>
  27. * @since 2014-05-28
  28. */
  29. public function attachingListenersByEventNameAfterDetachingAll(UnitTester $I)
  30. {
  31. $first = new FirstListener();
  32. $second = new SecondListener();
  33. $component = new ComponentX();
  34. $eventsManager = new Manager();
  35. $eventsManager->attach('log', $first);
  36. $component->setEventsManager($eventsManager);
  37. $logListeners = $component->getEventsManager()->getListeners('log');
  38. $I->assertCount(
  39. 1,
  40. $logListeners
  41. );
  42. $I->assertInstanceOf(
  43. FirstListener::class,
  44. $logListeners[0]
  45. );
  46. $component->getEventsManager()->attach('log', $second);
  47. $logListeners = $component->getEventsManager()->getListeners('log');
  48. $I->assertCount(
  49. 2,
  50. $logListeners
  51. );
  52. $I->assertInstanceOf(
  53. FirstListener::class,
  54. $logListeners[0]
  55. );
  56. $I->assertInstanceOf(
  57. SecondListener::class,
  58. $logListeners[1]
  59. );
  60. $component->getEventsManager()->detachAll('log');
  61. $logListeners = $component->getEventsManager()->getListeners('log');
  62. $I->assertEmpty($logListeners);
  63. $component->getEventsManager()->attach('log', $second);
  64. $logListeners = $component->getEventsManager()->getListeners('log');
  65. $I->assertCount(
  66. 1,
  67. $logListeners
  68. );
  69. $I->assertInstanceOf(
  70. SecondListener::class,
  71. $logListeners[0]
  72. );
  73. }
  74. /**
  75. * Tests using event listeners
  76. *
  77. * @author Phalcon Team <team@phalcon.io>
  78. * @since 2012-08-14
  79. */
  80. public function usingEvents(UnitTester $I)
  81. {
  82. $listener1 = new ThirdListener();
  83. $listener1->setTestCase($this, $I);
  84. $listener2 = new ThirdListener();
  85. $listener2->setTestCase($this, $I);
  86. $eventsManager = new Manager();
  87. $eventsManager->attach('dummy', $listener1);
  88. $componentX = new ComponentX();
  89. $componentX->setEventsManager($eventsManager);
  90. $componentY = new ComponentY();
  91. $componentY->setEventsManager($eventsManager);
  92. $componentX->leAction();
  93. $componentX->leAction();
  94. $componentY->leAction();
  95. $componentY->leAction();
  96. $componentY->leAction();
  97. $I->assertEquals(
  98. 2,
  99. $listener1->getBeforeCount()
  100. );
  101. $I->assertEquals(
  102. 2,
  103. $listener1->getAfterCount()
  104. );
  105. $eventsManager->attach('dummy', $listener2);
  106. $componentX->leAction();
  107. $componentX->leAction();
  108. $I->assertEquals(
  109. 4,
  110. $listener1->getBeforeCount()
  111. );
  112. $I->assertEquals(
  113. 4,
  114. $listener1->getAfterCount()
  115. );
  116. $I->assertEquals(
  117. 2,
  118. $listener2->getBeforeCount()
  119. );
  120. $I->assertEquals(
  121. 2,
  122. $listener2->getAfterCount()
  123. );
  124. $I->assertSame($listener2, $this->listener);
  125. $eventsManager->detach('dummy', $listener1);
  126. $componentX->leAction();
  127. $componentX->leAction();
  128. $I->assertEquals(
  129. 4,
  130. $listener1->getBeforeCount()
  131. );
  132. $I->assertEquals(
  133. 4,
  134. $listener1->getAfterCount()
  135. );
  136. $I->assertEquals(
  137. 4,
  138. $listener2->getBeforeCount()
  139. );
  140. $I->assertEquals(
  141. 4,
  142. $listener2->getAfterCount()
  143. );
  144. }
  145. /**
  146. * Tests using events with priority
  147. *
  148. * @test
  149. * @author Vladimir Khramov <quant13@gmail.com>
  150. * @since 2014-12-09
  151. */
  152. public function usingEventsWithPriority(UnitTester $I)
  153. {
  154. $listener1 = new ThirdListener();
  155. $listener1->setTestCase($this, $I);
  156. $listener2 = new ThirdListener();
  157. $listener2->setTestCase($this, $I);
  158. $eventsManager = new Manager();
  159. $eventsManager->enablePriorities(true);
  160. $eventsManager->attach('dummy', $listener1, 100);
  161. $componentX = new ComponentX();
  162. $componentX->setEventsManager($eventsManager);
  163. $componentY = new ComponentY();
  164. $componentY->setEventsManager($eventsManager);
  165. $componentX->leAction();
  166. $componentX->leAction();
  167. $componentY->leAction();
  168. $componentY->leAction();
  169. $componentY->leAction();
  170. $I->assertEquals(
  171. 2,
  172. $listener1->getBeforeCount()
  173. );
  174. $I->assertEquals(
  175. 2,
  176. $listener1->getAfterCount()
  177. );
  178. $eventsManager->attach('dummy', $listener2, 150);
  179. $componentX->leAction();
  180. $componentX->leAction();
  181. $I->assertEquals(
  182. 4,
  183. $listener1->getBeforeCount()
  184. );
  185. $I->assertEquals(
  186. 4,
  187. $listener1->getAfterCount()
  188. );
  189. $I->assertEquals(
  190. 2,
  191. $listener2->getBeforeCount()
  192. );
  193. $I->assertEquals(
  194. 2,
  195. $listener2->getAfterCount()
  196. );
  197. $I->assertSame($listener1, $this->listener);
  198. $eventsManager->detach('dummy', $listener1);
  199. $componentX->leAction();
  200. $componentX->leAction();
  201. $I->assertEquals(
  202. 4,
  203. $listener1->getBeforeCount()
  204. );
  205. $I->assertEquals(
  206. 4,
  207. $listener1->getAfterCount()
  208. );
  209. $I->assertEquals(
  210. 4,
  211. $listener2->getBeforeCount()
  212. );
  213. $I->assertEquals(
  214. 4,
  215. $listener2->getAfterCount()
  216. );
  217. }
  218. /**
  219. * Tests detach handler by using a Closure
  220. *
  221. * @test
  222. * @issue https://github.com/phalcon/cphalcon/issues/12882
  223. * @author Phalcon Team <team@phalcon.io>
  224. * @since 2017-06-06
  225. *
  226. * @dataProvider booleanProvider
  227. */
  228. public function detachClosureListener(UnitTester $I, Example $example)
  229. {
  230. $enablePriorities = $example[0];
  231. $manager = new Manager();
  232. $manager->enablePriorities($enablePriorities);
  233. $handler = function () {
  234. echo __METHOD__;
  235. };
  236. $manager->attach('test:detachable', $handler);
  237. $events = $I->getProtectedProperty($manager, 'events');
  238. $I->assertCount(
  239. 1,
  240. $events
  241. );
  242. $I->assertArrayHasKey('test:detachable', $events);
  243. $I->assertCount(
  244. 1,
  245. $events['test:detachable']
  246. );
  247. $manager->detach('test:detachable', $handler);
  248. $events = $I->getProtectedProperty($manager, 'events');
  249. $I->assertCount(1, $events);
  250. $I->assertArrayHasKey('test:detachable', $events);
  251. $I->assertCount(
  252. 0,
  253. $events['test:detachable']
  254. );
  255. }
  256. public function setLastListener($listener)
  257. {
  258. $this->listener = $listener;
  259. }
  260. protected function fireEventWithOutput(Manager $manager, $eventType)
  261. {
  262. $output = '';
  263. ob_start();
  264. $manager->fire($eventType, $this);
  265. $output .= ob_get_contents();
  266. ob_end_clean();
  267. return $output;
  268. }
  269. private function booleanProvider(): array
  270. {
  271. return [
  272. [true],
  273. [false],
  274. ];
  275. }
  276. }