‪TYPO3CMS  11.5
DispatcherTest.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\Log\LoggerInterface;
30 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
31 
35 class ‪DispatcherTest extends UnitTestCase
36 {
37  use ProphecyTrait;
38 
42  protected ‪$resetSingletonInstances = true;
43 
47  protected ‪$objectManagerProphecy;
48 
52  protected ‪$signalSlotDispatcher;
53 
54  protected function ‪setUp(): void
55  {
56  parent::setUp();
57  $this->objectManagerProphecy = $this->prophesize(ObjectManagerInterface::class);
58 
59  $this->signalSlotDispatcher = new ‪Dispatcher(
60  $this->objectManagerProphecy->reveal(),
61  $this->prophesize(LoggerInterface::class)->reveal()
62  );
63  }
64 
68  public function ‪connectAllowsForConnectingASlotWithASignal(): void
69  {
70  $mockSignal = $this->getMockBuilder(\stdClass::class)
71  ->addMethods(['emitSomeSignal'])
72  ->getMock();
73  $mockSlot = $this->getMockBuilder(\stdClass::class)
74  ->addMethods(['someSlotMethod'])
75  ->getMock();
76  $this->signalSlotDispatcher->connect(get_class($mockSignal), 'emitSomeSignal', get_class($mockSlot), 'someSlotMethod', true);
77  $expectedSlots = [
78  ['class' => get_class($mockSlot), 'method' => 'someSlotMethod', 'object' => null, 'passSignalInformation' => true],
79  ];
80  self::assertSame($expectedSlots, $this->signalSlotDispatcher->getSlots(get_class($mockSignal), 'emitSomeSignal'));
81  }
82 
87  {
88  $mockSignal = $this->getMockBuilder(\stdClass::class)
89  ->addMethods(['emitSomeSignal'])
90  ->getMock();
91  $mockSlot = $this->getMockBuilder(\stdClass::class)
92  ->addMethods(['someSlotMethod'])
93  ->getMock();
94  $this->signalSlotDispatcher->connect(get_class($mockSignal), 'emitSomeSignal', $mockSlot, 'someSlotMethod', true);
95  $expectedSlots = [
96  ['class' => null, 'method' => 'someSlotMethod', 'object' => $mockSlot, 'passSignalInformation' => true],
97  ];
98  self::assertSame($expectedSlots, $this->signalSlotDispatcher->getSlots(get_class($mockSignal), 'emitSomeSignal'));
99  }
100 
104  public function ‪connectAlsoAcceptsClosuresActingAsASlot(): void
105  {
106  $mockSignal = $this->getMockBuilder(\stdClass::class)
107  ->addMethods(['emitSomeSignal'])
108  ->getMock();
109  $mockSlot = static function () {};
110  $this->signalSlotDispatcher->connect(get_class($mockSignal), 'emitSomeSignal', $mockSlot, 'foo', true);
111  $expectedSlots = [
112  ['class' => null, 'method' => '__invoke', 'object' => $mockSlot, 'passSignalInformation' => true],
113  ];
114  self::assertSame($expectedSlots, $this->signalSlotDispatcher->getSlots(get_class($mockSignal), 'emitSomeSignal'));
115  }
116 
121  {
122  $arguments = [];
123  $mockSlot = static function () use (&$arguments) {
124  $arguments = func_get_args();
125  };
126  $this->signalSlotDispatcher->connect('Foo', 'bar', $mockSlot, '', false);
127  $this->signalSlotDispatcher->dispatch('Foo', 'bar', ['bar', 'quux']);
128  self::assertSame(['bar', 'quux'], $arguments);
129  }
130 
135  {
136  $slotClassName = OnlyClassNameSpecifiedFixture::class;
137  $mockSlot = new ‪OnlyClassNameSpecifiedFixture();
138  $this->objectManagerProphecy->get($slotClassName)->willReturn($mockSlot);
139  $this->signalSlotDispatcher->connect('Foo', 'emitBar', $slotClassName, 'slot', false);
140  $this->signalSlotDispatcher->dispatch('Foo', 'emitBar', ['bar', 'quux']);
141  self::assertSame($mockSlot->arguments, ['bar', 'quux']);
142  }
143 
148  {
149  $firstMockSlot = $this->createMock(SlotFixture::class);
150  $firstMockSlot->expects(self::once())
151  ->method('slot')
152  ->willReturnCallback(
153  static function ($foo, $baz) {
154  return ['modified_' . $foo, 'modified_' . $baz];
155  }
156  );
157 
158  $secondMockSlot = $this->createMock(SlotFixture::class);
159  $secondMockSlot->expects(self::once())
160  ->method('slot')
161  ->with('modified_bar', 'modified_quux');
162 
163  $this->signalSlotDispatcher->connect('Foo', 'emitBar', $firstMockSlot, 'slot', false);
164  $this->signalSlotDispatcher->connect('Foo', 'emitBar', $secondMockSlot, 'slot', false);
165 
166  $this->signalSlotDispatcher->dispatch('Foo', 'emitBar', ['bar', 'quux']);
167  }
168 
173  {
174  $firstMockSlot = $this->createMock(SlotFixture::class);
175  $firstMockSlot->expects(self::once())
176  ->method('slot')
177  ->willReturnCallback(
178  static function ($foo, $baz) {
179  return ['modified_' . $foo, 'modified_' . $baz];
180  }
181  );
182 
183  $secondMockSlot = $this->createMock(SlotFixture::class);
184  $secondMockSlot->expects(self::once())
185  ->method('slot')
186  ->with('modified_bar', 'modified_quux');
187 
188  $this->signalSlotDispatcher->connect('Foo', 'emitBar', $firstMockSlot, 'slot');
189  $this->signalSlotDispatcher->connect('Foo', 'emitBar', $secondMockSlot, 'slot');
190 
191  $this->signalSlotDispatcher->dispatch('Foo', 'emitBar', ['bar', 'quux']);
192  }
193 
198  {
199  $firstMockSlot = $this->createMock(SlotFixture::class);
200  $firstMockSlot->expects(self::once())
201  ->method('slot')
202  ->willReturnCallback(
203  static function ($foo, $baz) {
204  return ['modified_' . $foo, 'modified_' . $baz];
205  }
206  );
207 
208  $secondMockSlot = $this->createMock(SlotFixture::class);
209  $secondMockSlot->expects(self::once())
210  ->method('slot');
211 
212  $thirdMockSlot = $this->createMock(SlotFixture::class);
213  $thirdMockSlot->expects(self::once())
214  ->method('slot')
215  ->with('modified_bar', 'modified_quux');
216 
217  $this->signalSlotDispatcher->connect('Foo', 'emitBar', $firstMockSlot, 'slot');
218  $this->signalSlotDispatcher->connect('Foo', 'emitBar', $secondMockSlot, 'slot');
219  $this->signalSlotDispatcher->connect('Foo', 'emitBar', $thirdMockSlot, 'slot');
220 
221  $this->signalSlotDispatcher->dispatch('Foo', 'emitBar', ['bar', 'quux']);
222  }
223 
228  {
229  $this->expectException(InvalidSlotReturnException::class);
230  $this->expectExceptionCode(1376683067);
231 
232  $mockSlot = $this->createMock(SlotFixture::class);
233  $mockSlot->expects(self::once())
234  ->method('slot')
235  ->willReturnCallback(
236  static function () {
237  return 'string';
238  }
239  );
240 
241  $this->signalSlotDispatcher->connect('Foo', 'emitBar', $mockSlot, 'slot', false);
242  $this->signalSlotDispatcher->dispatch('Foo', 'emitBar', ['bar', 'quux']);
243  }
244 
249  {
250  $this->expectException(InvalidSlotReturnException::class);
251  $this->expectExceptionCode(1376683066);
252 
253  $mockSlot = $this->createMock(SlotFixture::class);
254  $mockSlot->expects(self::once())
255  ->method('slot')
256  ->willReturnCallback(
257  static function () {
258  return [1, 2, 3];
259  }
260  );
261 
262  $this->signalSlotDispatcher->connect('Foo', 'emitBar', $mockSlot, 'slot', false);
263  $this->signalSlotDispatcher->dispatch('Foo', 'emitBar', ['bar', 'quux']);
264  }
265 
270  {
271  $this->expectException(InvalidSlotException::class);
272  $this->expectExceptionCode(1245673367);
273  $this->signalSlotDispatcher->connect('Foo', 'emitBar', 'NonExistingClassName', 'slot', true);
274  $this->signalSlotDispatcher->dispatch('Foo', 'emitBar', []);
275  }
276 
281  {
282  $this->expectException(InvalidSlotException::class);
283  $this->expectExceptionCode(1245673368);
284  $slotClassName = SlotMethodDoesNotExistFixture::class;
285  $mockSlot = new ‪SlotMethodDoesNotExistFixture();
286  $this->objectManagerProphecy->get($slotClassName)->willReturn($mockSlot);
287  $this->signalSlotDispatcher->connect('Foo', 'emitBar', $slotClassName, 'unknownMethodName', true);
288  $this->signalSlotDispatcher->dispatch('Foo', 'emitBar', ['bar', 'quux']);
289  self::assertSame($mockSlot->arguments, ['bar', 'quux']);
290  }
291 
296  {
297  $arguments = [];
298  $mockSlot = static function () use (&$arguments) {
299  $arguments = func_get_args();
300  };
301  $this->signalSlotDispatcher->connect('SignalClassName', 'methodName', $mockSlot, '', true);
302  $this->signalSlotDispatcher->dispatch('SignalClassName', 'methodName', ['bar', 'quux']);
303  self::assertSame(['bar', 'quux', 'SignalClassName::methodName'], $arguments);
304  }
305 
310  {
311  $this->expectException(\InvalidArgumentException::class);
312  $this->expectExceptionCode(1229531659);
313  $this->signalSlotDispatcher->connect('ClassA', 'emitSomeSignal', 'ClassB', '');
314  }
315 
320  {
321  self::assertSame([], $this->signalSlotDispatcher->dispatch('ClassA', 'someNotRegisteredSignalName'));
322  }
323 
328  {
329  self::assertSame([], $this->signalSlotDispatcher->dispatch('ClassA', 'emitSomeSignal'));
330  }
331 
336  {
337  $arguments = [
338  42,
339  'a string',
340  new \stdClass(),
341  ];
342  self::assertSame($arguments, $this->signalSlotDispatcher->dispatch('ClassA', 'emitSomeSignal', $arguments));
343  }
344 }
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchRetrievesSlotInstanceFromTheObjectManagerIfOnlyAClassNameWasSpecified
‪dispatchRetrievesSlotInstanceFromTheObjectManagerIfOnlyAClassNameWasSpecified()
Definition: DispatcherTest.php:130
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchThrowsAnExceptionIfTheSpecifiedSlotMethodDoesNotExist
‪dispatchThrowsAnExceptionIfTheSpecifiedSlotMethodDoesNotExist()
Definition: DispatcherTest.php:276
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchHandsOverFormerArgumentsIfPreviousSlotDoesNotReturnAnything
‪dispatchHandsOverFormerArgumentsIfPreviousSlotDoesNotReturnAnything()
Definition: DispatcherTest.php:193
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot
Definition: DispatcherTest.php:18
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchHandsOverArgumentsReturnedByAFormerSlotWithoutInterferingWithSignalSlotInformation
‪dispatchHandsOverArgumentsReturnedByAFormerSlotWithoutInterferingWithSignalSlotInformation()
Definition: DispatcherTest.php:168
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\connectAlsoAcceptsClosuresActingAsASlot
‪connectAlsoAcceptsClosuresActingAsASlot()
Definition: DispatcherTest.php:100
‪TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotReturnException
Definition: InvalidSlotReturnException.php:27
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchThrowsAnExceptionIfTheSpecifiedClassOfASlotIsUnknown
‪dispatchThrowsAnExceptionIfTheSpecifiedClassOfASlotIsUnknown()
Definition: DispatcherTest.php:265
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchHandsOverArgumentsReturnedByAFormerSlot
‪dispatchHandsOverArgumentsReturnedByAFormerSlot()
Definition: DispatcherTest.php:143
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest
Definition: DispatcherTest.php:36
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchPassesTheSignalArgumentsToTheSlotMethod
‪dispatchPassesTheSignalArgumentsToTheSlotMethod()
Definition: DispatcherTest.php:116
‪TYPO3\CMS\Extbase\SignalSlot\Exception\InvalidSlotException
Definition: InvalidSlotException.php:27
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\$objectManagerProphecy
‪ObjectManagerInterface ObjectProphecy $objectManagerProphecy
Definition: DispatcherTest.php:44
‪TYPO3\CMS\Extbase\Object\ObjectManagerInterface
Definition: ObjectManagerInterface.php:29
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\connectAlsoAcceptsObjectsInPlaceOfTheClassName
‪connectAlsoAcceptsObjectsInPlaceOfTheClassName()
Definition: DispatcherTest.php:82
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\Fixtures\OnlyClassNameSpecifiedFixture
Definition: OnlyClassNameSpecifiedFixture.php:24
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\connectThrowsInvalidArgumentExceptionIfSlotMethodNameIsEmptyAndSlotClassNameIsNoClosure
‪connectThrowsInvalidArgumentExceptionIfSlotMethodNameIsEmptyAndSlotClassNameIsNoClosure()
Definition: DispatcherTest.php:305
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchPassesFirstArgumentContainingSlotInformationIfTheConnectionStatesSo
‪dispatchPassesFirstArgumentContainingSlotInformationIfTheConnectionStatesSo()
Definition: DispatcherTest.php:291
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchThrowsAnExceptionIfTheSlotReturnsDifferentNumberOfItems
‪dispatchThrowsAnExceptionIfTheSlotReturnsDifferentNumberOfItems()
Definition: DispatcherTest.php:244
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchReturnsEmptyArrayIfSignalNameAndOrSignalClassNameIsNotRegistered
‪dispatchReturnsEmptyArrayIfSignalNameAndOrSignalClassNameIsNotRegistered()
Definition: DispatcherTest.php:315
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\$signalSlotDispatcher
‪TYPO3 CMS Extbase SignalSlot Dispatcher PHPUnit Framework MockObject MockObject TYPO3 TestingFramework Core AccessibleObjectInterface $signalSlotDispatcher
Definition: DispatcherTest.php:48
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\Fixtures\SlotMethodDoesNotExistFixture
Definition: SlotMethodDoesNotExistFixture.php:24
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchReturnsArgumentsArrayAsIsIfSignalIsNotRegistered
‪dispatchReturnsArgumentsArrayAsIsIfSignalIsNotRegistered()
Definition: DispatcherTest.php:331
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchThrowsAnExceptionIfTheSlotReturnsNonArray
‪dispatchThrowsAnExceptionIfTheSlotReturnsNonArray()
Definition: DispatcherTest.php:223
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\dispatchReturnsEmptyArrayIfSignalDoesNotProvideAnyArguments
‪dispatchReturnsEmptyArrayIfSignalDoesNotProvideAnyArguments()
Definition: DispatcherTest.php:323
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\setUp
‪setUp()
Definition: DispatcherTest.php:50
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: DispatcherTest.php:40
‪TYPO3\CMS\Extbase\Tests\Fixture\SlotFixture
Definition: SlotFixture.php:24
‪TYPO3\CMS\Extbase\Tests\UnitDeprecated\SignalSlot\DispatcherTest\connectAllowsForConnectingASlotWithASignal
‪connectAllowsForConnectingASlotWithASignal()
Definition: DispatcherTest.php:64
‪TYPO3\CMS\Extbase\SignalSlot\Dispatcher
Definition: Dispatcher.php:34