Version 1
[yaffs-website] / web / modules / contrib / redirect / tests / src / Unit / RedirectCheckerTest.php
diff --git a/web/modules/contrib/redirect/tests/src/Unit/RedirectCheckerTest.php b/web/modules/contrib/redirect/tests/src/Unit/RedirectCheckerTest.php
new file mode 100644 (file)
index 0000000..35f8233
--- /dev/null
@@ -0,0 +1,155 @@
+<?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 = array('redirect.settings' => array('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;
+  }
+
+}