Mercurial > hg > cmmr2012-drupal-site
diff core/tests/Drupal/Tests/Component/EventDispatcher/ContainerAwareEventDispatcherTest.php @ 0:c75dbcec494b
Initial commit from drush-created site
author | Chris Cannam |
---|---|
date | Thu, 05 Jul 2018 14:24:15 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/tests/Drupal/Tests/Component/EventDispatcher/ContainerAwareEventDispatcherTest.php Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,251 @@ +<?php +// @codingStandardsIgnoreFile + +namespace Drupal\Tests\Component\EventDispatcher; + +use Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher; +use Symfony\Component\DependencyInjection\Container; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\EventDispatcher\Tests\CallableClass; +use Symfony\Component\EventDispatcher\Tests\ContainerAwareEventDispatcherTest as SymfonyContainerAwareEventDispatcherTest; +use Symfony\Component\EventDispatcher\Tests\TestEventListener; + +/** + * Unit tests for the ContainerAwareEventDispatcher. + * + * NOTE: 98% of this code is a literal copy of Symfony's emerging + * CompiledEventDispatcherTest. + * + * This file does NOT follow Drupal coding standards, so as to simplify future + * synchronizations. + * + * @see https://github.com/symfony/symfony/pull/12521 + * + * @group EventDispatcher + */ +class ContainerAwareEventDispatcherTest extends SymfonyContainerAwareEventDispatcherTest +{ + protected function createEventDispatcher() + { + $container = new Container(); + + return new ContainerAwareEventDispatcher($container); + } + + public function testGetListenersWithCallables() + { + // When passing in callables exclusively as listeners into the event + // dispatcher constructor, the event dispatcher must not attempt to + // resolve any services. + $container = $this->getMockBuilder(ContainerInterface::class)->getMock(); + $container->expects($this->never())->method($this->anything()); + + $firstListener = new CallableClass(); + $secondListener = function () {}; + $thirdListener = array(new TestEventListener(), 'preFoo'); + $listeners = array( + 'test_event' => array( + 0 => array( + array('callable' => $firstListener), + array('callable' => $secondListener), + array('callable' => $thirdListener), + ), + ), + ); + + $dispatcher = new ContainerAwareEventDispatcher($container, $listeners); + $actualListeners = $dispatcher->getListeners(); + + $expectedListeners = array( + 'test_event' => array( + $firstListener, + $secondListener, + $thirdListener, + ), + ); + + $this->assertSame($expectedListeners, $actualListeners); + } + + public function testDispatchWithCallables() + { + // When passing in callables exclusively as listeners into the event + // dispatcher constructor, the event dispatcher must not attempt to + // resolve any services. + $container = $this->getMockBuilder(ContainerInterface::class)->getMock(); + $container->expects($this->never())->method($this->anything()); + + $firstListener = new CallableClass(); + $secondListener = function () {}; + $thirdListener = array(new TestEventListener(), 'preFoo'); + $listeners = array( + 'test_event' => array( + 0 => array( + array('callable' => $firstListener), + array('callable' => $secondListener), + array('callable' => $thirdListener), + ), + ), + ); + + $dispatcher = new ContainerAwareEventDispatcher($container, $listeners); + $dispatcher->dispatch('test_event'); + + $this->assertTrue($thirdListener[0]->preFooInvoked); + } + + public function testGetListenersWithServices() + { + $container = new ContainerBuilder(); + $container->register('listener_service', 'Symfony\Component\EventDispatcher\Tests\TestEventListener'); + + $listeners = array( + 'test_event' => array( + 0 => array( + array('service' => array('listener_service', 'preFoo')), + ), + ), + ); + + $dispatcher = new ContainerAwareEventDispatcher($container, $listeners); + $actualListeners = $dispatcher->getListeners(); + + $listenerService = $container->get('listener_service'); + $expectedListeners = array( + 'test_event' => array( + array($listenerService, 'preFoo'), + ), + ); + + $this->assertSame($expectedListeners, $actualListeners); + } + + public function testDispatchWithServices() + { + $container = new ContainerBuilder(); + $container->register('listener_service', 'Symfony\Component\EventDispatcher\Tests\TestEventListener'); + + $listeners = array( + 'test_event' => array( + 0 => array( + array('service' => array('listener_service', 'preFoo')), + ), + ), + ); + + $dispatcher = new ContainerAwareEventDispatcher($container, $listeners); + + $dispatcher->dispatch('test_event'); + + $listenerService = $container->get('listener_service'); + $this->assertTrue($listenerService->preFooInvoked); + } + + public function testRemoveService() + { + $container = new ContainerBuilder(); + $container->register('listener_service', 'Symfony\Component\EventDispatcher\Tests\TestEventListener'); + $container->register('other_listener_service', 'Symfony\Component\EventDispatcher\Tests\TestEventListener'); + + $listeners = array( + 'test_event' => array( + 0 => array( + array('service' => array('listener_service', 'preFoo')), + array('service' => array('other_listener_service', 'preFoo')), + ), + ), + ); + + $dispatcher = new ContainerAwareEventDispatcher($container, $listeners); + + $listenerService = $container->get('listener_service'); + $dispatcher->removeListener('test_event', array($listenerService, 'preFoo')); + + // Ensure that other service was not initialized during removal of the + // listener service. + $this->assertFalse($container->initialized('other_listener_service')); + + $dispatcher->dispatch('test_event'); + + $this->assertFalse($listenerService->preFooInvoked); + $otherService = $container->get('other_listener_service'); + $this->assertTrue($otherService->preFooInvoked); + } + + public function testGetListenerPriorityWithServices() + { + $container = new ContainerBuilder(); + $container->register('listener_service', TestEventListener::class); + + $listeners = array( + 'test_event' => array( + 5 => array( + array('service' => array('listener_service', 'preFoo')), + ), + ), + ); + + $dispatcher = new ContainerAwareEventDispatcher($container, $listeners); + $listenerService = $container->get('listener_service'); + $actualPriority = $dispatcher->getListenerPriority('test_event', [$listenerService, 'preFoo']); + + $this->assertSame(5, $actualPriority); + } + + /** + * @expectedDeprecation The Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher class is deprecated since Symfony 3.3 and will be removed in 4.0. Use EventDispatcher with closure factories instead. + * @group legacy + */ + public function testAddAListenerService() { + parent::testAddAListenerService(); + } + + /** + * @expectedDeprecation The Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher class is deprecated since Symfony 3.3 and will be removed in 4.0. Use EventDispatcher with closure factories instead. + * @group legacy + */ + public function testPreventDuplicateListenerService() { + parent::testPreventDuplicateListenerService(); + } + + /** + * @expectedDeprecation The Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher class is deprecated since Symfony 3.3 and will be removed in 4.0. Use EventDispatcher with closure factories instead. + * @group legacy + */ + public function testAddASubscriberService() { + parent::testAddASubscriberService(); + } + + /** + * @expectedDeprecation The Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher class is deprecated since Symfony 3.3 and will be removed in 4.0. Use EventDispatcher with closure factories instead. + * @group legacy + */ + public function testHasListenersOnLazyLoad() { + parent::testHasListenersOnLazyLoad(); + } + + /** + * @expectedDeprecation The Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher class is deprecated since Symfony 3.3 and will be removed in 4.0. Use EventDispatcher with closure factories instead. + * @group legacy + */ + public function testGetListenersOnLazyLoad() { + parent::testGetListenersOnLazyLoad(); + } + + /** + * @expectedDeprecation The Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher class is deprecated since Symfony 3.3 and will be removed in 4.0. Use EventDispatcher with closure factories instead. + * @group legacy + */ + public function testRemoveAfterDispatch() { + parent::testRemoveAfterDispatch(); + } + + /** + * @expectedDeprecation The Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher class is deprecated since Symfony 3.3 and will be removed in 4.0. Use EventDispatcher with closure factories instead. + * @group legacy + */ + public function testRemoveBeforeDispatch() { + parent::testRemoveBeforeDispatch(); + } + }