|
8 | 8 | use PHPUnit\Framework\TestCase; |
9 | 9 | use Psr\Http\Server\MiddlewareInterface; |
10 | 10 | use Psr\Http\Server\RequestHandlerInterface; |
| 11 | +use Sunrise\Http\Router\Event\RouteEvent; |
11 | 12 | use Sunrise\Http\Router\Exception\InvalidArgumentException; |
12 | 13 | use Sunrise\Http\Router\Exception\MethodNotAllowedException; |
13 | 14 | use Sunrise\Http\Router\Exception\PageNotFoundException; |
|
19 | 20 | use Sunrise\Http\Router\Router; |
20 | 21 | use Sunrise\Http\Message\ResponseFactory; |
21 | 22 | use Sunrise\Http\ServerRequest\ServerRequestFactory; |
| 23 | +use Symfony\Component\EventDispatcher\EventDispatcher; |
22 | 24 |
|
23 | 25 | /** |
24 | 26 | * Import functions |
@@ -819,4 +821,74 @@ public function testMatchWithHosts() : void |
819 | 821 | $router->match((new ServerRequestFactory) |
820 | 822 | ->createServerRequest('GET', 'http://localhost/ping')); |
821 | 823 | } |
| 824 | + |
| 825 | + /** |
| 826 | + * @return void |
| 827 | + */ |
| 828 | + public function testEventDispatcher() : void |
| 829 | + { |
| 830 | + $router = new Router(); |
| 831 | + $this->assertNull($router->getEventDispatcher()); |
| 832 | + |
| 833 | + $eventDispatcher = new EventDispatcher(); |
| 834 | + $router->setEventDispatcher($eventDispatcher); |
| 835 | + $this->assertSame($eventDispatcher, $router->getEventDispatcher()); |
| 836 | + |
| 837 | + $router->setEventDispatcher(null); |
| 838 | + $this->assertNull($router->getEventDispatcher()); |
| 839 | + } |
| 840 | + |
| 841 | + /** |
| 842 | + * @return void |
| 843 | + */ |
| 844 | + public function testRouteEvent() : void |
| 845 | + { |
| 846 | + $routes = [ |
| 847 | + new Fixtures\Route(), |
| 848 | + new Fixtures\Route(), |
| 849 | + new Fixtures\Route(), |
| 850 | + ]; |
| 851 | + |
| 852 | + $request = (new ServerRequestFactory) |
| 853 | + ->createServerRequest( |
| 854 | + $routes[1]->getMethods()[1], |
| 855 | + $routes[1]->getPath() |
| 856 | + ); |
| 857 | + |
| 858 | + $eventDispatcher = new EventDispatcher(); |
| 859 | + $eventDispatcher->addListener(RouteEvent::NAME, function (RouteEvent $event) use ($routes, $request) { |
| 860 | + $this->assertSame($routes[1]->getName(), $event->getRoute()->getName()); |
| 861 | + $this->assertSame($request, $event->getRequest()); |
| 862 | + }); |
| 863 | + |
| 864 | + $router = new Router(); |
| 865 | + $router->addRoute(...$routes); |
| 866 | + $router->setEventDispatcher($eventDispatcher); |
| 867 | + $router->run($request); |
| 868 | + } |
| 869 | + |
| 870 | + /** |
| 871 | + * @return void |
| 872 | + */ |
| 873 | + public function testRouteEventOverrideRequest() : void |
| 874 | + { |
| 875 | + $route = new Fixtures\Route(); |
| 876 | + |
| 877 | + $request = (new ServerRequestFactory) |
| 878 | + ->createServerRequest( |
| 879 | + $route->getMethods()[0], |
| 880 | + $route->getPath() |
| 881 | + ); |
| 882 | + |
| 883 | + $eventDispatcher = new EventDispatcher(); |
| 884 | + $eventDispatcher->addListener(RouteEvent::NAME, function (RouteEvent $event) use ($request) { |
| 885 | + $event->setRequest($request->withAttribute('foo', 'bar')); |
| 886 | + $this->assertNotSame($request, $event->getRequest()); |
| 887 | + }); |
| 888 | + |
| 889 | + $router = new Router(); |
| 890 | + $router->addRoute($route); |
| 891 | + $router->setEventDispatcher($eventDispatcher); |
| 892 | + $router->handle($request); |
| 893 | + } |
822 | 894 | } |
0 commit comments