Version 1
[yaffs-website] / web / modules / contrib / redirect / modules / redirect_domain / tests / src / Unit / DomainRedirectRequestSubscriberTest.php
diff --git a/web/modules/contrib/redirect/modules/redirect_domain/tests/src/Unit/DomainRedirectRequestSubscriberTest.php b/web/modules/contrib/redirect/modules/redirect_domain/tests/src/Unit/DomainRedirectRequestSubscriberTest.php
new file mode 100644 (file)
index 0000000..89453ab
--- /dev/null
@@ -0,0 +1,144 @@
+<?php
+
+namespace Drupal\Tests\redirect_domain\Unit;
+
+use Drupal\Core\Path\PathMatcher;
+
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\redirect\RedirectChecker;
+use Drupal\redirect_domain\EventSubscriber\DomainRedirectRequestSubscriber;
+use Drupal\Tests\UnitTestCase;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+/**
+ * Tests the redirect logic.
+ *
+ * @group redirect_domain
+ *
+ * @coversDefaultClass Drupal\redirect_domain\EventSubscriber\DomainRedirectRequestSubscriber
+ */
+class DomainRedirectRequestSubscriberTest extends UnitTestCase {
+
+  /**
+   * Tests redirect between domains.
+   *
+   * @dataProvider providerDomains
+   */
+  public function testDomainRedirect($request_url, $response_url) {
+    $data = [
+      'redirect_domain.domains' => [
+        'domain_redirects' => [
+          'foo:com' => [
+            [
+              'sub_path' => '/fixedredirect',
+              'destination' => 'bar.com/fixedredirect',
+            ],
+            [
+              'sub_path' => '/*',
+              'destination' => 'bar.com/example',
+            ],
+          ],
+          'example:com' => [
+            [
+              'sub_path' => '/foo/*/bar',
+              'destination' => 'example.com/bar/foo',
+            ],
+          ],
+          'simpleexample:com' => [
+            [
+              'sub_path' => '/redirect',
+              'destination' => 'redirected.com/redirect',
+            ],
+          ],
+        ],
+      ],
+      'redirect.settings' => [
+        'default_status_code' => 301,
+      ],
+      'system.site' => [
+        'page.front' => '/',
+      ],
+    ];
+
+    // Create a mock redirect checker.
+    $checker = $this->getMockBuilder(RedirectChecker::class)
+      ->disableOriginalConstructor()
+      ->getMock();
+    $checker->expects($this->any())
+      ->method('canRedirect')
+      ->will($this->returnValue(TRUE));
+
+    // Set up the configuration for the requested domain.
+    $config_factory = $this->getConfigFactoryStub($data);
+
+    // Create a mock path matcher.
+    $route_match = $this->getMock(RouteMatchInterface::class);
+    $path_matcher = new PathMatcher($config_factory, $route_match);
+
+    $subscriber = new DomainRedirectRequestSubscriber(
+      $config_factory,
+      $checker,
+      $path_matcher
+    );
+
+    // Make a request to the urls from the data provider and get the response.
+    $event = $this->getGetResponseEventStub($request_url, http_build_query([]));
+
+    // Run the main redirect method.
+    $subscriber->onKernelRequestCheckDomainRedirect($event);
+
+    // Assert the expected response from the data provider.
+    if ($response_url) {
+      $this->assertTrue($event->getResponse() instanceof RedirectResponse);
+      $response = $event->getResponse();
+      // Make sure that the response is properly redirected.
+      $this->assertEquals($response_url, $response->getTargetUrl());
+      $this->assertEquals(
+        $config_factory->get('redirect.settings')->get('default_status_code'),
+        $response->getStatusCode()
+      );
+    }
+    else {
+      $this->assertNull($event->getResponse());
+    }
+  }
+
+  /**
+   * Gets response event object.
+   *
+   * @param $path_info
+   *   The path info.
+   * @param $query_string
+   *   The query string in the url.
+   *
+   * @return GetResponseEvent
+   *   The response for the request.
+   */
+  protected function getGetResponseEventStub($path_info, $query_string) {
+    $request = Request::create($path_info . '?' . $query_string, 'GET', [], [], [], ['SCRIPT_NAME' => 'index.php']);
+
+    $http_kernel = $this->getMockBuilder(HttpKernelInterface::class)
+      ->getMock();
+    return new GetResponseEvent($http_kernel, $request, 'test');
+  }
+
+  /**
+   * Data provider for the domain redirects.
+   *
+   * @return array
+   *   An array of requests and expected responses for the redirect domains.
+   */
+  public function providerDomains() {
+    $datasets = [];
+    $datasets[] = ['http://foo.com/example', 'http://bar.com/example'];
+    $datasets[] = ['http://example.com/foo/test/bar', 'http://example.com/bar/foo'];
+    $datasets[] = ['http://simpleexample.com/redirect', 'http://redirected.com/redirect'];
+    $datasets[] = ['http://nonexisting.com', NULL];
+    $datasets[] = ['http://simpleexample.com/wrongpath', NULL];
+    $datasets[] = ['http://foo.com/fixedredirect', 'http://bar.com/fixedredirect'];
+    return $datasets;
+  }
+}