RegisterListenersPassTest.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\EventDispatcher\Tests\DependencyInjection;
  11. use Symfony\Component\DependencyInjection\ContainerBuilder;
  12. use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
  13. class RegisterListenersPassTest extends \PHPUnit_Framework_TestCase
  14. {
  15. /**
  16. * Tests that event subscribers not implementing EventSubscriberInterface
  17. * trigger an exception.
  18. *
  19. * @expectedException \InvalidArgumentException
  20. */
  21. public function testEventSubscriberWithoutInterface()
  22. {
  23. // one service, not implementing any interface
  24. $services = array(
  25. 'my_event_subscriber' => array(0 => array()),
  26. );
  27. $definition = $this->getMock('Symfony\Component\DependencyInjection\Definition');
  28. $definition->expects($this->atLeastOnce())
  29. ->method('isPublic')
  30. ->will($this->returnValue(true));
  31. $definition->expects($this->atLeastOnce())
  32. ->method('getClass')
  33. ->will($this->returnValue('stdClass'));
  34. $builder = $this->getMock(
  35. 'Symfony\Component\DependencyInjection\ContainerBuilder',
  36. array('hasDefinition', 'findTaggedServiceIds', 'getDefinition')
  37. );
  38. $builder->expects($this->any())
  39. ->method('hasDefinition')
  40. ->will($this->returnValue(true));
  41. // We don't test kernel.event_listener here
  42. $builder->expects($this->atLeastOnce())
  43. ->method('findTaggedServiceIds')
  44. ->will($this->onConsecutiveCalls(array(), $services));
  45. $builder->expects($this->atLeastOnce())
  46. ->method('getDefinition')
  47. ->will($this->returnValue($definition));
  48. $registerListenersPass = new RegisterListenersPass();
  49. $registerListenersPass->process($builder);
  50. }
  51. public function testValidEventSubscriber()
  52. {
  53. $services = array(
  54. 'my_event_subscriber' => array(0 => array()),
  55. );
  56. $definition = $this->getMock('Symfony\Component\DependencyInjection\Definition');
  57. $definition->expects($this->atLeastOnce())
  58. ->method('isPublic')
  59. ->will($this->returnValue(true));
  60. $definition->expects($this->atLeastOnce())
  61. ->method('getClass')
  62. ->will($this->returnValue('Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService'));
  63. $builder = $this->getMock(
  64. 'Symfony\Component\DependencyInjection\ContainerBuilder',
  65. array('hasDefinition', 'findTaggedServiceIds', 'getDefinition', 'findDefinition')
  66. );
  67. $builder->expects($this->any())
  68. ->method('hasDefinition')
  69. ->will($this->returnValue(true));
  70. // We don't test kernel.event_listener here
  71. $builder->expects($this->atLeastOnce())
  72. ->method('findTaggedServiceIds')
  73. ->will($this->onConsecutiveCalls(array(), $services));
  74. $builder->expects($this->atLeastOnce())
  75. ->method('getDefinition')
  76. ->will($this->returnValue($definition));
  77. $builder->expects($this->atLeastOnce())
  78. ->method('findDefinition')
  79. ->will($this->returnValue($definition));
  80. $registerListenersPass = new RegisterListenersPass();
  81. $registerListenersPass->process($builder);
  82. }
  83. /**
  84. * @expectedException \InvalidArgumentException
  85. * @expectedExceptionMessage The service "foo" must be public as event listeners are lazy-loaded.
  86. */
  87. public function testPrivateEventListener()
  88. {
  89. $container = new ContainerBuilder();
  90. $container->register('foo', 'stdClass')->setPublic(false)->addTag('kernel.event_listener', array());
  91. $container->register('event_dispatcher', 'stdClass');
  92. $registerListenersPass = new RegisterListenersPass();
  93. $registerListenersPass->process($container);
  94. }
  95. /**
  96. * @expectedException \InvalidArgumentException
  97. * @expectedExceptionMessage The service "foo" must be public as event subscribers are lazy-loaded.
  98. */
  99. public function testPrivateEventSubscriber()
  100. {
  101. $container = new ContainerBuilder();
  102. $container->register('foo', 'stdClass')->setPublic(false)->addTag('kernel.event_subscriber', array());
  103. $container->register('event_dispatcher', 'stdClass');
  104. $registerListenersPass = new RegisterListenersPass();
  105. $registerListenersPass->process($container);
  106. }
  107. /**
  108. * @expectedException \InvalidArgumentException
  109. * @expectedExceptionMessage The service "foo" must not be abstract as event listeners are lazy-loaded.
  110. */
  111. public function testAbstractEventListener()
  112. {
  113. $container = new ContainerBuilder();
  114. $container->register('foo', 'stdClass')->setAbstract(true)->addTag('kernel.event_listener', array());
  115. $container->register('event_dispatcher', 'stdClass');
  116. $registerListenersPass = new RegisterListenersPass();
  117. $registerListenersPass->process($container);
  118. }
  119. /**
  120. * @expectedException \InvalidArgumentException
  121. * @expectedExceptionMessage The service "foo" must not be abstract as event subscribers are lazy-loaded.
  122. */
  123. public function testAbstractEventSubscriber()
  124. {
  125. $container = new ContainerBuilder();
  126. $container->register('foo', 'stdClass')->setAbstract(true)->addTag('kernel.event_subscriber', array());
  127. $container->register('event_dispatcher', 'stdClass');
  128. $registerListenersPass = new RegisterListenersPass();
  129. $registerListenersPass->process($container);
  130. }
  131. public function testEventSubscriberResolvableClassName()
  132. {
  133. $container = new ContainerBuilder();
  134. $container->setParameter('subscriber.class', 'Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService');
  135. $container->register('foo', '%subscriber.class%')->addTag('kernel.event_subscriber', array());
  136. $container->register('event_dispatcher', 'stdClass');
  137. $registerListenersPass = new RegisterListenersPass();
  138. $registerListenersPass->process($container);
  139. $definition = $container->getDefinition('event_dispatcher');
  140. $expected_calls = array(
  141. array(
  142. 'addSubscriberService',
  143. array(
  144. 'foo',
  145. 'Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService',
  146. ),
  147. ),
  148. );
  149. $this->assertSame($expected_calls, $definition->getMethodCalls());
  150. }
  151. /**
  152. * @expectedException \InvalidArgumentException
  153. * @expectedExceptionMessage You have requested a non-existent parameter "subscriber.class"
  154. */
  155. public function testEventSubscriberUnresolvableClassName()
  156. {
  157. $container = new ContainerBuilder();
  158. $container->register('foo', '%subscriber.class%')->addTag('kernel.event_subscriber', array());
  159. $container->register('event_dispatcher', 'stdClass');
  160. $registerListenersPass = new RegisterListenersPass();
  161. $registerListenersPass->process($container);
  162. }
  163. }
  164. class SubscriberService implements \Symfony\Component\EventDispatcher\EventSubscriberInterface
  165. {
  166. public static function getSubscribedEvents()
  167. {
  168. }
  169. }