diff --git a/core/tests/Drupal/Tests/Core/Routing/RouterTest.php b/core/tests/Drupal/Tests/Core/Routing/RouterTest.php new file mode 100644 index 0000000000..ba0349ab6a --- /dev/null +++ b/core/tests/Drupal/Tests/Core/Routing/RouterTest.php @@ -0,0 +1,159 @@ +route = new Route('test'); + $this->routeProvider = $this->prophesize(RouteProviderInterface::class); + $this->currentPathStack = $this->prophesize(CurrentPathStack::class); + $this->urlGenerator = $this->prophesize(UrlGeneratorInterface::class); + $this->accessManager = $this->prophesize(AccessManagerInterface::class); + $this->account = $this->prophesize(AccountInterface::class); + } + + protected function setupRouter(Request $request, $check_access, AccessResult $access_result) { + $this->accessManager->checkRequest(Argument::type(Request::class), Argument::type(AccountInterface::class), TRUE) + ->shouldBeCalled() + ->willReturn($access_result); + + $route_collection = new RouteCollection(); + $route_collection->add('test', $this->route); + $this->routeProvider->getRouteCollectionForRequest($request) + ->willReturn($route_collection); + + $this->currentPathStack->getPath(Argument::any()) + ->willReturn('/test'); + + return new Router($this->routeProvider->reveal(), $this->currentPathStack->reveal(), $this->urlGenerator->reveal(), $this->accessManager->reveal(), $this->account->reveal(), $check_access); + } + + /** + * Tests the matchRequest() function for access allowed. + * + * @covers ::matchRequest + * @covers ::checkAccess + */ + public function testMatchRequestAllowed() { + $request = Request::create('/test'); + $access_result = AccessResult::allowed(); + + $router = $this->setupRouter($request, TRUE, $access_result); + $router->setContext((new RequestContext())->fromRequest($request)); + + $parameters = $router->matchRequest($request); + $expected = [ + RouteObjectInterface::ROUTE_NAME => 'test', + RouteObjectInterface::ROUTE_OBJECT => $this->route, + AccessAwareRouterInterface::ACCESS_RESULT => $access_result, + ]; + $this->assertSame($expected, $request->attributes->all()); + $this->assertSame($expected, $parameters); + } + + /** + * Tests the matchRequest() function for access denied. + * + * @covers ::matchRequest + * @covers ::checkAccess + */ + public function testMatchRequestDenied() { + $request = Request::create('/test'); + $access_result = AccessResult::forbidden(); + + $router = $this->setupRouter($request, TRUE, $access_result); + $router->setContext((new RequestContext())->fromRequest($request)); + + $this->setExpectedException(AccessDeniedHttpException::class); + $router->matchRequest($request); + } + + /** + * Tests the matchRequest() function for access denied with reason message. + * + * @covers ::matchRequest + * @covers ::checkAccess + */ + public function testCheckAccessResultWithReason() { + $request = Request::create('/test'); + $reason = $this->getRandomGenerator()->string(); + $access_result = AccessResult::forbidden($reason); + + $router = $this->setupRouter($request, TRUE, $access_result); + $router->setContext((new RequestContext())->fromRequest($request)); + + $this->setExpectedException(AccessDeniedHttpException::class, $reason); + $router->matchRequest($request); + } + + +}