View source
<?php
namespace Drupal\Tests\redirect\Unit;
use Drupal\redirect\RedirectChecker;
use Drupal\Tests\UnitTestCase;
use PHPUnit_Framework_MockObject_MockObject;
use Symfony\Cmf\Component\Routing\RouteObjectInterface;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\Routing\Route;
class RedirectCheckerTest extends UnitTestCase {
public function testCanRedirect() {
$config = [
'redirect.settings' => [
'ignore_admin_path' => FALSE,
'access_check' => TRUE,
],
];
$state = $this
->getMockBuilder('Drupal\\Core\\State\\StateInterface')
->getMock();
$state
->expects($this
->any())
->method('get')
->with('system.maintenance_mode')
->will($this
->returnValue(FALSE));
$access = $this
->getMockBuilder('Drupal\\Core\\Access\\AccessManager')
->disableOriginalConstructor()
->getMock();
$account = $this
->getMockBuilder('Drupal\\Core\\Session\\AccountInterface')
->getMock();
$route_provider = $this
->getMockBuilder('Drupal\\Core\\Routing\\RouteProviderInterface')
->getMock();
$route = new Route('/example');
$route_provider
->expects($this
->any())
->method('getRouteByName')
->willReturn($route);
$access
->expects($this
->any())
->method('checkNamedRoute')
->willReturnMap([
[
'denied_route',
[],
$account,
FALSE,
FALSE,
],
[
'allowed_route',
[],
$account,
FALSE,
TRUE,
],
]);
$checker = new RedirectChecker($this
->getConfigFactoryStub($config), $state, $access, $account, $route_provider);
$request = $this
->getRequestStub('index.php', 'GET');
$this
->assertTrue($checker
->canRedirect($request), 'Can redirect');
$request = $this
->getRequestStub('statistics.php', 'GET');
$this
->assertFalse($checker
->canRedirect($request), 'Cannot redirect script name not index.php');
$request = $this
->getRequestStub('index.php', 'POST');
$this
->assertFalse($checker
->canRedirect($request), 'Cannot redirect other than GET method');
$request = $this
->getRequestStub('index.php', 'GET');
$this
->assertFalse($checker
->canRedirect($request, 'denied_route'), 'Can not redirect');
$request = $this
->getRequestStub('index.php', 'GET');
$this
->assertTrue($checker
->canRedirect($request, 'allowed_route'), 'Can redirect');
$request = $this
->getRequestStub('index.php', 'GET', [], [
'destination' => 'paradise',
]);
$this
->assertFalse($checker
->canRedirect($request), 'Cannot redirect');
$state = $this
->getMockBuilder('Drupal\\Core\\State\\StateInterface')
->getMock();
$state
->expects($this
->any())
->method('get')
->with('system.maintenance_mode')
->will($this
->returnValue(TRUE));
$checker = new RedirectChecker($this
->getConfigFactoryStub($config), $state, $access, $account, $route_provider);
$request = $this
->getRequestStub('index.php', 'GET');
$this
->assertFalse($checker
->canRedirect($request), 'Cannot redirect if maintenance mode is on');
$state = $this
->getMockBuilder('Drupal\\Core\\State\\StateInterface')
->getMock();
$state
->expects($this
->any())
->method('get')
->with('system.maintenance_mode')
->will($this
->returnValue(FALSE));
}
protected function getRequestStub($script_name, $method, array $attributes = [], array $query = []) {
$request = $this
->getMockBuilder('Symfony\\Component\\HttpFoundation\\Request')
->disableOriginalConstructor()
->getMock();
$request
->expects($this
->any())
->method('getScriptName')
->will($this
->returnValue($script_name));
$request
->expects($this
->any())
->method('isMethod')
->with($this
->anything())
->will($this
->returnValue($method == 'GET'));
$request->query = new ParameterBag($query);
$request->attributes = new ParameterBag($attributes);
return $request;
}
}