diff --git a/library/Zend/Mvc/Application.php b/library/Zend/Mvc/Application.php index d4d8f02ee9f..096b9cf8b0b 100644 --- a/library/Zend/Mvc/Application.php +++ b/library/Zend/Mvc/Application.php @@ -66,6 +66,7 @@ class Application implements protected $defaultListeners = array( 'RouteListener', 'DispatchListener', + 'HttpMethodListener', 'ViewManager', 'SendResponseListener', ); diff --git a/tests/ZendTest/Mvc/ApplicationTest.php b/tests/ZendTest/Mvc/ApplicationTest.php index 151473402e5..f390e7a569c 100644 --- a/tests/ZendTest/Mvc/ApplicationTest.php +++ b/tests/ZendTest/Mvc/ApplicationTest.php @@ -137,70 +137,68 @@ public function testEventsAreEmptyAtFirst() $this->assertAttributeEquals(array(), 'identifiers', $sharedEvents); } - public function testBootstrapRegistersRouteListener() + /** + * @param string $listenerServiceName + * @param string $event + * @param string $method + * + * @dataProvider bootstrapRegistersListenersProvider + */ + public function testBootstrapRegistersListeners($listenerServiceName, $event, $method, $isCustom = false) { - $routeListener = $this->serviceManager->get('RouteListener'); - $this->application->bootstrap(); + $listenerService = $this->serviceManager->get($listenerServiceName); + $this->application->bootstrap($isCustom ? (array) $listenerServiceName : array()); $events = $this->application->getEventManager(); - $listeners = $events->getListeners(MvcEvent::EVENT_ROUTE); - $this->assertEquals(1, count($listeners)); - $listener = $listeners->top(); - $callback = $listener->getCallback(); - $this->assertSame(array($routeListener, 'onRoute'), $callback); - } + $listeners = $events->getListeners($event); - public function testBootstrapRegistersDispatchListener() - { - $dispatchListener = $this->serviceManager->get('DispatchListener'); - $this->application->bootstrap(); - $events = $this->application->getEventManager(); - $listeners = $events->getListeners(MvcEvent::EVENT_DISPATCH); - $this->assertEquals(1, count($listeners)); - $listener = $listeners->top(); - $callback = $listener->getCallback(); - $this->assertSame(array($dispatchListener, 'onDispatch'), $callback); + $foundListener = false; + foreach ($listeners as $listener) { + $callback = $listener->getCallback(); + $foundListener = $callback === array($listenerService, $method); + if ($foundListener) { + break; + } + } + $this->assertTrue($foundListener); } - public function testBootstrapRegistersSendResponseListener() + public function bootstrapRegistersListenersProvider() { - $sendResponseListener = $this->serviceManager->get('SendResponseListener'); - $this->application->bootstrap(); - $events = $this->application->getEventManager(); - $listeners = $events->getListeners(MvcEvent::EVENT_FINISH); - $this->assertEquals(1, count($listeners)); - $listener = $listeners->top(); - $callback = $listener->getCallback(); - $this->assertSame(array($sendResponseListener, 'sendResponse'), $callback); + return array( + array('RouteListener', MvcEvent::EVENT_ROUTE, 'onRoute'), + array('DispatchListener', MvcEvent::EVENT_DISPATCH, 'onDispatch'), + array('SendResponseListener', MvcEvent::EVENT_FINISH, 'sendResponse'), + array('ViewManager', MvcEvent::EVENT_BOOTSTRAP, 'onBootstrap'), + array('HttpMethodListener', MvcEvent::EVENT_ROUTE, 'onRoute'), + array('BootstrapListener', MvcEvent::EVENT_BOOTSTRAP, 'onBootstrap', true), + ); } - public function testBootstrapRegistersViewManagerAsBootstrapListener() + public function testBootstrapAlwaysRegistersDefaultListeners() { - $viewManager = $this->serviceManager->get('ViewManager'); - $this->application->bootstrap(); - $events = $this->application->getEventManager(); - $listeners = $events->getListeners(MvcEvent::EVENT_BOOTSTRAP); - $this->assertEquals(1, count($listeners)); - $listener = $listeners->top(); - $callback = $listener->getCallback(); - $this->assertSame(array($viewManager, 'onBootstrap'), $callback); - } + $refl = new \ReflectionProperty($this->application, 'defaultListeners'); + $refl->setAccessible(true); + $defaultListenersNames = $refl->getValue($this->application); + $defaultListeners = array(); + foreach ($defaultListenersNames as $defaultListenerName) { + $defaultListeners[] = $this->serviceManager->get($defaultListenerName); + } - public function testBootstrapCanRegisterHttpMethodListener() - { - $httpMethodListener = $this->serviceManager->get('HttpMethodListener'); - $this->application->bootstrap(array('HttpMethodListener')); - $events = $this->application->getEventManager(); - $listeners = $events->getListeners(MvcEvent::EVENT_ROUTE); - $foundListener = false; - foreach($listeners as $listener) { - $callback = $listener->getCallback(); - $foundListener = $callback === array($httpMethodListener, 'onRoute'); - if ($foundListener) { - break; + $this->application->bootstrap(array('BootstrapListener')); + $eventManager = $this->application->getEventManager(); + + $registeredListeners = array(); + foreach ($eventManager->getEvents() as $event) { + $listeners = $eventManager->getListeners($event); + foreach ($listeners as $listener) { + $callback = $listener->getCallBack(); + $registeredListeners[] = $callback[0]; } } - $this->assertTrue($foundListener); + foreach ($defaultListeners as $defaultListener) { + $this->assertContains($defaultListener, $registeredListeners); + } } public function testBootstrapRegistersConfiguredMvcEvent() @@ -648,28 +646,6 @@ public function testCompleteRequestShouldReturnApplicationInstance() $this->assertSame($this->application, $result); } - - public function testCustomListener() - { - $this->application->bootstrap(array('BootstrapListener')); - - // must contain custom bootstrap listeners - $bootstrapListener = $this->serviceManager->get('BootstrapListener'); - $listeners = $this->application->getEventManager()->getListeners(MvcEvent::EVENT_BOOTSTRAP); - $bootstrapListeners = $bootstrapListener->getListeners(); - $this->assertTrue($listeners->contains($bootstrapListeners[0])); - - // must contain default listeners - $listeners = $this->application->getEventManager()->getListeners(MvcEvent::EVENT_DISPATCH); - $this->assertEquals(1, count($listeners)); - - $listeners = $this->application->getEventManager()->getListeners(MvcEvent::EVENT_ROUTE); - $this->assertEquals(1, count($listeners)); - - $listeners = $this->application->getEventManager()->getListeners(MvcEvent::EVENT_FINISH); - $this->assertEquals(1, count($listeners)); - } - public function testFailedRoutingShouldBePreventable() { $this->application->bootstrap();