View source
<?php
namespace Drupal\Tests\cas\Unit\Service;
use Drupal\cas\CasRedirectData;
use Drupal\cas\Event\CasPreRedirectEvent;
use Drupal\cas\Service\CasHelper;
use Drupal\cas\Service\CasRedirector;
use Drupal\Component\Utility\UrlHelper;
use Drupal\Tests\UnitTestCase;
use Symfony\Component\DependencyInjection\Container;
class CasRedirectorTest extends UnitTestCase {
protected $casHelper;
protected $urlGenerator;
protected $eventDispatcher;
protected $configFactory;
protected $events;
public function setUp() : void {
parent::setUp();
$this->configFactory = $this
->getConfigFactoryStub([
'cas.settings' => [
'server.hostname' => 'example-server.com',
'server.protocol' => 'https',
'server.port' => 443,
'server.path' => '/cas',
'server.version' => '2.0',
'server.verify' => CasHelper::CA_DEFAULT,
'server.cert' => 'foo',
'advanced.connection_timeout' => 30,
],
]);
$this->casHelper = $this
->getMockBuilder('\\Drupal\\cas\\Service\\CasHelper')
->disableOriginalConstructor()
->getMock();
$this->urlGenerator = $this
->createMock('\\Drupal\\Core\\Routing\\UrlGeneratorInterface');
$this->urlGenerator
->method('generate')
->willReturnCallback([
$this,
'getServiceUrl',
]);
$this->eventDispatcher = $this
->getMockBuilder('\\Symfony\\Component\\EventDispatcher\\EventDispatcherInterface')
->disableOriginalConstructor()
->getMock();
$cache_contexts_manager = $this
->getMockBuilder('Drupal\\Core\\Cache\\Context\\CacheContextsManager')
->disableOriginalConstructor()
->getMock();
$cache_contexts_manager
->method('assertValidTokens')
->willReturn(TRUE);
$container = new Container();
$container
->set('cache_contexts_manager', $cache_contexts_manager);
\Drupal::setContainer($container);
}
public function getServiceUrl($route, array $parameters = NULL) {
if ($parameters) {
return 'http://example.com/casservice?' . UrlHelper::buildQuery($parameters);
}
else {
return 'http://example.com/casservice';
}
}
public function dispatchEvent($event_name, CasPreRedirectEvent $event) {
$this->events[$event_name] = $event;
$data = $event
->getCasRedirectData();
$data
->setParameter('strong_auth', 'true');
$data
->forceRedirection();
}
public function testBuildRedirectResponse() {
$cas_redirector = new CasRedirector($this->casHelper, $this->eventDispatcher, $this->urlGenerator, $this->configFactory);
$cas_data = new CasRedirectData();
$cas_data
->forceRedirection();
$response = $cas_redirector
->buildRedirectResponse($cas_data, TRUE);
$this
->assertEquals('https://example-server.com/cas/login?service=http%3A//example.com/casservice', $response
->getTargetUrl());
$this
->assertInstanceOf('\\Drupal\\core\\Routing\\TrustedRedirectResponse', $response);
$cas_data
->preventRedirection();
$response = $cas_redirector
->buildRedirectResponse($cas_data);
$this
->assertNull($response, 'Return null for no response');
$cas_data
->forceRedirection();
$response = $cas_redirector
->buildRedirectResponse($cas_data);
$this
->assertNotNull($response, 'Found response for redirect data');
$cas_data
->setParameter('strong_auth', 'true');
$response = $cas_redirector
->buildRedirectResponse($cas_data);
$this
->assertEquals('https://example-server.com/cas/login?strong_auth=true&service=http%3A//example.com/casservice', $response
->getTargetUrl(), 'Target URL with parameters');
$cas_data
->setParameter('strong_auth', NULL);
$cas_data
->setServiceParameter('returnto', 'node/1');
$response = $cas_redirector
->buildRedirectResponse($cas_data);
$this
->assertEquals('https://example-server.com/cas/login?service=http%3A//example.com/casservice%3Freturnto%3Dnode/1', $response
->getTargetUrl(), 'Service parameters present');
$cas_data
->setIsCacheable(TRUE);
$response = $cas_redirector
->buildRedirectResponse($cas_data);
$this
->assertInstanceOf('\\Drupal\\core\\Routing\\TrustedRedirectResponse', $response);
$data = $response
->getCacheableMetadata();
$tags = $data
->getCacheTags();
$this
->assertContains('config:cas.settings', $tags, 'Cache Tags set');
$cas_data
->setIsCacheable(FALSE);
$response = $cas_redirector
->buildRedirectResponse($cas_data);
$this
->assertInstanceOf('\\Drupal\\cas\\CasRedirectResponse', $response, 'Non-cacheable response');
}
public function testEventsDispatched() {
$this->eventDispatcher
->method('dispatch')
->willReturnCallback([
$this,
'dispatchEvent',
]);
$this->events = [];
$cas_redirector = new CasRedirector($this->casHelper, $this->eventDispatcher, $this->urlGenerator, $this->configFactory);
$cas_data = new CasRedirectData();
$response = $cas_redirector
->buildRedirectResponse($cas_data);
$this
->assertEquals(1, count($this->events), 'One Event was fired');
$this
->assertEquals('https://example-server.com/cas/login?strong_auth=true&service=http%3A//example.com/casservice', $response
->getTargetUrl(), 'Altered parameters');
}
}