You are here

RedirectCheckerTest.php in Redirect 8

File

tests/src/Unit/RedirectCheckerTest.php
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;

/**
 * Tests the redirect logic.
 *
 * @group redirect
 */
class RedirectCheckerTest extends UnitTestCase {

  /**
   * Tests the can redirect check.
   */
  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');
  }

  /**
   * Gets request mock object.
   *
   * @param string $script_name
   *   The result of the getScriptName() method.
   * @param string $method
   *   The request method.
   * @param array $attributes
   *   Attributes to be passed into request->attributes.
   * @param array $query
   *   Query paramter to be passed into request->query.
   *
   * @return PHPUnit_Framework_MockObject_MockObject
   *   Mocked request object.
   */
  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;
  }

}

Classes

Namesort descending Description
RedirectCheckerTest Tests the redirect logic.