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