‪TYPO3CMS  11.5
ListenerProviderTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Prophecy\PhpUnit\ProphecyTrait;
21 use Prophecy\Prophecy\ObjectProphecy;
22 use Psr\Container\ContainerInterface;
23 use Psr\EventDispatcher\ListenerProviderInterface;
25 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
26 
30 class ‪ListenerProviderTest extends UnitTestCase
31 {
32  use ProphecyTrait;
33 
35  protected ObjectProphecy ‪$containerProphecy;
36 
38 
39  protected function ‪setUp(): void
40  {
41  parent::setUp();
42 
43  $this->containerProphecy = $this->prophesize(ContainerInterface::class);
44 
45  $this->listenerProvider = new ‪ListenerProvider(
46  $this->containerProphecy->reveal()
47  );
48  }
49 
53  public function ‪implementsPsrInterface(): void
54  {
55  self::assertInstanceOf(ListenerProviderInterface::class, $this->listenerProvider);
56  }
57 
62  {
63  $this->listenerProvider->addListener('Event\\Name', 'listener1');
64  $this->listenerProvider->addListener('Event\\Name', 'listener2', 'methodName');
65 
66  self::assertEquals([
67  'Event\\Name' => [
68  [ 'service' => 'listener1', 'method' => null ],
69  [ 'service' => 'listener2', 'method' => 'methodName' ],
70  ],
71  ], $this->listenerProvider->getAllListenerDefinitions());
72  }
73 
78  public function ‪dispatchesEvent($listener, string $method = null): void
79  {
80  $event = new \stdClass();
81  $event->invoked = 0;
82 
83  $this->containerProphecy->get('listener')->willReturn($listener);
84  $this->listenerProvider->addListener(\stdClass::class, 'listener', $method);
85 
86  foreach ($this->listenerProvider->getListenersForEvent($event) as $listener) {
87  $listener($event);
88  }
89 
90  self::assertEquals(1, $event->invoked);
91  }
92 
97  public function ‪associatesToEventParentClass($listener, string $method = null): void
98  {
99  $extendedEvent = new class () extends \stdClass {
100  public $invoked = 0;
101  };
102 
103  $this->containerProphecy->get('listener')->willReturn($listener);
104  $this->listenerProvider->addListener(\stdClass::class, 'listener', $method);
105  foreach ($this->listenerProvider->getListenersForEvent($extendedEvent) as $listener) {
106  $listener($extendedEvent);
107  }
108 
109  self::assertEquals(1, $extendedEvent->invoked);
110  }
111 
116  public function ‪associatesToImplementedInterfaces($listener, string $method = null): void
117  {
118  $eventImplementation = new class () implements \IteratorAggregate {
119  public $invoked = 0;
120 
121  public function getIterator(): \Traversable
122  {
123  throw new \BadMethodCallException('Test', 1586942436);
124  }
125  };
126 
127  $this->containerProphecy->get('listener')->willReturn($listener);
128  $this->listenerProvider->addListener(\IteratorAggregate::class, 'listener', $method);
129  foreach ($this->listenerProvider->getListenersForEvent($eventImplementation) as $listener) {
130  $listener($eventImplementation);
131  }
132 
133  self::assertEquals(1, $eventImplementation->invoked);
134  }
135 
139  public function ‪addListenerPreservesOrder(): void
140  {
141  $this->listenerProvider->addListener(\stdClass::class, 'listener1');
142  $this->listenerProvider->addListener(\stdClass::class, 'listener2');
143 
144  $event = new \stdClass();
145  $event->sequence = '';
146  $this->containerProphecy->get('listener1')->willReturn(static function (object $event): void {
147  $event->sequence .= 'a';
148  });
149  $this->containerProphecy->get('listener2')->willReturn(static function (object $event): void {
150  $event->sequence .= 'b';
151  });
152  foreach ($this->listenerProvider->getListenersForEvent($event) as $listener) {
153  $listener($event);
154  }
155 
156  self::assertEquals('ab', $event->sequence);
157  }
158 
162  public function ‪throwsExceptionForInvalidCallable(): void
163  {
164  $this->expectException(\InvalidArgumentException::class);
165  $this->expectExceptionCode(1549988537);
166 
167  $event = new \stdClass();
168  $this->containerProphecy->get('listener')->willReturn(new \stdClass());
169  $this->listenerProvider->addListener(\stdClass::class, 'listener');
170  foreach ($this->listenerProvider->getListenersForEvent($event) as $listener) {
171  $listener($event);
172  }
173  }
174 
179  public function ‪listeners(): array
180  {
181  return [
182  [
183  // Invokable
184  'listener' => new class () {
185  public function __invoke(object $event): void
186  {
187  $event->invoked = 1;
188  }
189  },
190  'method' => null,
191  ],
192  [
193  // Class + method
194  'listener' => new class () {
195  public function onEvent(object $event): void
196  {
197  $event->invoked = 1;
198  }
199  },
200  'method' => 'onEvent',
201  ],
202  [
203  // Closure
204  'listener' => static function (object $event): void {
205  $event->invoked = 1;
206  },
207  'method' => null,
208  ],
209  ];
210  }
211 }
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest\implementsPsrInterface
‪implementsPsrInterface()
Definition: ListenerProviderTest.php:52
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest\addListenerPreservesOrder
‪addListenerPreservesOrder()
Definition: ListenerProviderTest.php:138
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest
Definition: ListenerProviderTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest\$listenerProvider
‪ListenerProvider $listenerProvider
Definition: ListenerProviderTest.php:36
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest\setUp
‪setUp()
Definition: ListenerProviderTest.php:38
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest\associatesToEventParentClass
‪associatesToEventParentClass($listener, string $method=null)
Definition: ListenerProviderTest.php:96
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest\addedListenersAreReturnedByGetAllListenerDefinitions
‪addedListenersAreReturnedByGetAllListenerDefinitions()
Definition: ListenerProviderTest.php:60
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest\throwsExceptionForInvalidCallable
‪throwsExceptionForInvalidCallable()
Definition: ListenerProviderTest.php:161
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest\dispatchesEvent
‪dispatchesEvent($listener, string $method=null)
Definition: ListenerProviderTest.php:77
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest\$containerProphecy
‪ObjectProphecy $containerProphecy
Definition: ListenerProviderTest.php:34
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher
Definition: EventDispatcherTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest\listeners
‪listeners()
Definition: ListenerProviderTest.php:178
‪TYPO3\CMS\Core\EventDispatcher\ListenerProvider
Definition: ListenerProvider.php:30
‪TYPO3\CMS\Core\Tests\Unit\EventDispatcher\ListenerProviderTest\associatesToImplementedInterfaces
‪associatesToImplementedInterfaces($listener, string $method=null)
Definition: ListenerProviderTest.php:115