4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\EventDispatcher\Tests\DependencyInjection;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\DependencyInjection\ContainerBuilder;
16 use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
18 class RegisterListenersPassTest extends TestCase
21 * Tests that event subscribers not implementing EventSubscriberInterface
22 * trigger an exception.
24 * @expectedException \InvalidArgumentException
26 public function testEventSubscriberWithoutInterface()
28 // one service, not implementing any interface
30 'my_event_subscriber' => array(0 => array()),
33 $definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
34 $definition->expects($this->atLeastOnce())
36 ->will($this->returnValue(true));
37 $definition->expects($this->atLeastOnce())
39 ->will($this->returnValue('stdClass'));
41 $builder = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'getDefinition'))->getMock();
42 $builder->expects($this->any())
43 ->method('hasDefinition')
44 ->will($this->returnValue(true));
46 // We don't test kernel.event_listener here
47 $builder->expects($this->atLeastOnce())
48 ->method('findTaggedServiceIds')
49 ->will($this->onConsecutiveCalls(array(), $services));
51 $builder->expects($this->atLeastOnce())
52 ->method('getDefinition')
53 ->will($this->returnValue($definition));
55 $registerListenersPass = new RegisterListenersPass();
56 $registerListenersPass->process($builder);
59 public function testValidEventSubscriber()
62 'my_event_subscriber' => array(0 => array()),
65 $definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
66 $definition->expects($this->atLeastOnce())
68 ->will($this->returnValue(true));
69 $definition->expects($this->atLeastOnce())
71 ->will($this->returnValue('Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService'));
73 $builder = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'getDefinition', 'findDefinition'))->getMock();
74 $builder->expects($this->any())
75 ->method('hasDefinition')
76 ->will($this->returnValue(true));
78 // We don't test kernel.event_listener here
79 $builder->expects($this->atLeastOnce())
80 ->method('findTaggedServiceIds')
81 ->will($this->onConsecutiveCalls(array(), $services));
83 $builder->expects($this->atLeastOnce())
84 ->method('getDefinition')
85 ->will($this->returnValue($definition));
87 $builder->expects($this->atLeastOnce())
88 ->method('findDefinition')
89 ->will($this->returnValue($definition));
91 $registerListenersPass = new RegisterListenersPass();
92 $registerListenersPass->process($builder);
96 * @expectedException \InvalidArgumentException
97 * @expectedExceptionMessage The service "foo" must be public as event listeners are lazy-loaded.
99 public function testPrivateEventListener()
101 $container = new ContainerBuilder();
102 $container->register('foo', 'stdClass')->setPublic(false)->addTag('kernel.event_listener', array());
103 $container->register('event_dispatcher', 'stdClass');
105 $registerListenersPass = new RegisterListenersPass();
106 $registerListenersPass->process($container);
110 * @expectedException \InvalidArgumentException
111 * @expectedExceptionMessage The service "foo" must be public as event subscribers are lazy-loaded.
113 public function testPrivateEventSubscriber()
115 $container = new ContainerBuilder();
116 $container->register('foo', 'stdClass')->setPublic(false)->addTag('kernel.event_subscriber', array());
117 $container->register('event_dispatcher', 'stdClass');
119 $registerListenersPass = new RegisterListenersPass();
120 $registerListenersPass->process($container);
124 * @expectedException \InvalidArgumentException
125 * @expectedExceptionMessage The service "foo" must not be abstract as event listeners are lazy-loaded.
127 public function testAbstractEventListener()
129 $container = new ContainerBuilder();
130 $container->register('foo', 'stdClass')->setAbstract(true)->addTag('kernel.event_listener', array());
131 $container->register('event_dispatcher', 'stdClass');
133 $registerListenersPass = new RegisterListenersPass();
134 $registerListenersPass->process($container);
138 * @expectedException \InvalidArgumentException
139 * @expectedExceptionMessage The service "foo" must not be abstract as event subscribers are lazy-loaded.
141 public function testAbstractEventSubscriber()
143 $container = new ContainerBuilder();
144 $container->register('foo', 'stdClass')->setAbstract(true)->addTag('kernel.event_subscriber', array());
145 $container->register('event_dispatcher', 'stdClass');
147 $registerListenersPass = new RegisterListenersPass();
148 $registerListenersPass->process($container);
151 public function testEventSubscriberResolvableClassName()
153 $container = new ContainerBuilder();
155 $container->setParameter('subscriber.class', 'Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService');
156 $container->register('foo', '%subscriber.class%')->addTag('kernel.event_subscriber', array());
157 $container->register('event_dispatcher', 'stdClass');
159 $registerListenersPass = new RegisterListenersPass();
160 $registerListenersPass->process($container);
162 $definition = $container->getDefinition('event_dispatcher');
163 $expected_calls = array(
165 'addSubscriberService',
168 'Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService',
172 $this->assertSame($expected_calls, $definition->getMethodCalls());
176 * @expectedException \InvalidArgumentException
177 * @expectedExceptionMessage You have requested a non-existent parameter "subscriber.class"
179 public function testEventSubscriberUnresolvableClassName()
181 $container = new ContainerBuilder();
182 $container->register('foo', '%subscriber.class%')->addTag('kernel.event_subscriber', array());
183 $container->register('event_dispatcher', 'stdClass');
185 $registerListenersPass = new RegisterListenersPass();
186 $registerListenersPass->process($container);
190 class SubscriberService implements \Symfony\Component\EventDispatcher\EventSubscriberInterface
192 public static function getSubscribedEvents()