You are here

public function RedirectCheckerTest::testCanRedirect in Redirect 8

Tests the can redirect check.

File

tests/src/Unit/RedirectCheckerTest.php, line 22

Class

RedirectCheckerTest
Tests the redirect logic.

Namespace

Drupal\Tests\redirect\Unit

Code

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);

  // All fine - we can redirect.
  $request = $this
    ->getRequestStub('index.php', 'GET');
  $this
    ->assertTrue($checker
    ->canRedirect($request), 'Can redirect');

  // The script name is not index.php.
  $request = $this
    ->getRequestStub('statistics.php', 'GET');
  $this
    ->assertFalse($checker
    ->canRedirect($request), 'Cannot redirect script name not index.php');

  // The request method is not GET.
  $request = $this
    ->getRequestStub('index.php', 'POST');
  $this
    ->assertFalse($checker
    ->canRedirect($request), 'Cannot redirect other than GET method');

  // Route access check, deny access.
  $request = $this
    ->getRequestStub('index.php', 'GET');
  $this
    ->assertFalse($checker
    ->canRedirect($request, 'denied_route'), 'Can not redirect');

  // Route access check, allow access.
  $request = $this
    ->getRequestStub('index.php', 'GET');
  $this
    ->assertTrue($checker
    ->canRedirect($request, 'allowed_route'), 'Can redirect');

  // Check destination parameter.
  $request = $this
    ->getRequestStub('index.php', 'GET', [], [
    'destination' => 'paradise',
  ]);
  $this
    ->assertFalse($checker
    ->canRedirect($request), 'Cannot redirect');

  // 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(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');

  // We are at a admin path.
  $state = $this
    ->getMockBuilder('Drupal\\Core\\State\\StateInterface')
    ->getMock();
  $state
    ->expects($this
    ->any())
    ->method('get')
    ->with('system.maintenance_mode')
    ->will($this
    ->returnValue(FALSE));

  //    $checker = new RedirectChecker($this->getConfigFactoryStub($config), $state);
  //
  //    $route = $this->getMockBuilder('Symfony\Component\Routing\Route')
  //      ->disableOriginalConstructor()
  //      ->getMock();
  //    $route->expects($this->any())
  //      ->method('getOption')
  //      ->with('_admin_route')
  //      ->will($this->returnValue('system.admin_config_search'));
  //
  //    $request = $this->getRequestStub('index.php', 'GET',
  //      array(RouteObjectInterface::ROUTE_OBJECT => $route));
  //    $this->assertFalse($checker->canRedirect($request), 'Cannot redirect if we are requesting a admin path');
  //
  //    // We are at admin path with ignore_admin_path set to TRUE.
  //    $config['redirect.settings']['ignore_admin_path'] = TRUE;
  //    $checker = new RedirectChecker($this->getConfigFactoryStub($config), $state);
  //
  //    $request = $this->getRequestStub('index.php', 'GET',
  //      array(RouteObjectInterface::ROUTE_OBJECT => $route));
  //    $this->assertTrue($checker->canRedirect($request), 'Can redirect a admin with ignore_admin_path set to TRUE');
}