provider = $this->createMock(RouteProviderInterface::class); $this->routeFilter1 = $this->createMock(RouteFilterInterface::class); $this->routeFilter2 = $this->createMock(RouteFilterInterface::class); $this->finalMatcher = $this->createMock(FinalMatcherInterface::class); } public function testNestedMatcher() { $request = Request::create('/path/one'); $routeCollection = new RouteCollection(); $route = $this->createMock(Route::class); $routeCollection->add('route', $route); $this->provider->expects($this->once()) ->method('getRouteCollectionForRequest') ->with($request) ->will($this->returnValue($routeCollection)) ; $this->routeFilter1->expects($this->once()) ->method('filter') ->with($routeCollection, $request) ->will($this->returnValue($routeCollection)) ; $this->routeFilter2->expects($this->once()) ->method('filter') ->with($routeCollection, $request) ->will($this->returnValue($routeCollection)) ; $this->finalMatcher->expects($this->once()) ->method('finalMatch') ->with($routeCollection, $request) ->will($this->returnValue(['foo' => 'bar'])) ; $matcher = new NestedMatcher($this->provider, $this->finalMatcher); $matcher->addRouteFilter($this->routeFilter1); $matcher->addRouteFilter($this->routeFilter2); $attributes = $matcher->matchRequest($request); $this->assertEquals(['foo' => 'bar'], $attributes); } /** * Test priorities and exception handling. */ public function testNestedMatcherPriority() { $request = Request::create('/path/one'); $routeCollection = new RouteCollection(); $route = $this->createMock(Route::class); $routeCollection->add('route', $route); $wrongProvider = $this->createMock(RouteProviderInterface::class); $wrongProvider->expects($this->never()) ->method('getRouteCollectionForRequest') ; $this->provider->expects($this->once()) ->method('getRouteCollectionForRequest') ->with($request) ->will($this->returnValue($routeCollection)) ; $this->routeFilter1->expects($this->once()) ->method('filter') ->with($routeCollection, $request) ->will($this->throwException(new ResourceNotFoundException())) ; $this->routeFilter2->expects($this->never()) ->method('filter') ; $this->finalMatcher->expects($this->never()) ->method('finalMatch') ; $matcher = new NestedMatcher($wrongProvider, $this->finalMatcher); $matcher->setRouteProvider($this->provider); $matcher->addRouteFilter($this->routeFilter2, 10); $matcher->addRouteFilter($this->routeFilter1, 20); try { $matcher->matchRequest($request); fail('nested matcher is eating exception'); } catch (ResourceNotFoundException $e) { // expected } } public function testProviderNoMatch() { $request = Request::create('/path/one'); $routeCollection = new RouteCollection(); $this->provider->expects($this->once()) ->method('getRouteCollectionForRequest') ->with($request) ->will($this->returnValue($routeCollection)) ; $this->finalMatcher->expects($this->never()) ->method('finalMatch') ; $matcher = new NestedMatcher($this->provider, $this->finalMatcher); $this->expectException(ResourceNotFoundException::class); $matcher->matchRequest($request); } }