You are here

class CasHelperTest in CAS 8

Same name and namespace in other branches
  1. 2.x tests/src/Unit/Service/CasHelperTest.php \Drupal\Tests\cas\Unit\Service\CasHelperTest

CasHelper unit tests.

@group cas

@coversDefaultClass \Drupal\cas\Service\CasHelper

Hierarchy

Expanded class hierarchy of CasHelperTest

File

tests/src/Unit/Service/CasHelperTest.php, line 21

Namespace

Drupal\Tests\cas\Unit\Service
View source
class CasHelperTest extends UnitTestCase {

  /**
   * The mocked Url generator.
   *
   * @var \Drupal\Core\Routing\UrlGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
   */
  protected $urlGenerator;

  /**
   * The mocked logger factory.
   *
   * @var \Drupal\Core\Logger\LoggerChannelFactory|\PHPUnit_Framework_MockObject_MockObject
   */
  protected $loggerFactory;

  /**
   * The mocked log channel.
   *
   * @var \Drupal\Core\Logger\LoggerChannel|\PHPUnit_Framework_MockObject_MockObject
   */
  protected $loggerChannel;

  /**
   * The token service.
   *
   * @var \Prophecy\Prophecy\ObjectProphecy
   */
  protected $token;

  /**
   * {@inheritdoc}
   */
  protected function setUp() {
    parent::setUp();
    $this->loggerFactory = $this
      ->createMock('\\Drupal\\Core\\Logger\\LoggerChannelFactory');
    $this->loggerChannel = $this
      ->getMockBuilder('\\Drupal\\Core\\Logger\\LoggerChannel')
      ->disableOriginalConstructor()
      ->getMock();
    $this->loggerFactory
      ->expects($this
      ->any())
      ->method('get')
      ->with('cas')
      ->will($this
      ->returnValue($this->loggerChannel));
    $this->token = $this
      ->prophesize(Token::class);
    $this->token
      ->replace('Use <a href="[cas:login-url]">CAS login</a>')
      ->willReturn('Use <a href="/caslogin">CAS login</a>');
    $this->token
      ->replace('<script>alert("Hacked!");</script>')
      ->willReturn('<script>alert("Hacked!");</script>');
  }

  /**
   * Provides parameters and expected return values for testGetServerLoginUrl.
   *
   * @return array
   *   The list of parameters and return values.
   *
   * @see \Drupal\Tests\cas\Unit\CasHelperTest::testGetServerLoginUrl()
   */
  public function getServerLoginUrlDataProvider() {
    return [
      [
        [],
        'https://example.com/client',
      ],
      [
        [
          'returnto' => 'node/1',
        ],
        'https://example.com/client?returnto=node%2F1',
      ],
    ];
  }

  /**
   * Test the logging capability.
   *
   * @covers ::log
   * @covers ::__construct
   */
  public function testLogWhenDebugTurnedOn() {

    /** @var \Drupal\Core\Config\ConfigFactory $config_factory */
    $config_factory = $this
      ->getConfigFactoryStub([
      'cas.settings' => [
        'advanced.debug_log' => TRUE,
      ],
    ]);
    $cas_helper = new CasHelper($config_factory, $this->loggerFactory, $this->token
      ->reveal());

    // The actual logger should be called twice.
    $this->loggerChannel
      ->expects($this
      ->exactly(2))
      ->method('log');
    $cas_helper
      ->log(LogLevel::DEBUG, 'This is a debug log');
    $cas_helper
      ->log(LogLevel::ERROR, 'This is an error log');
  }

  /**
   * Test our log wrapper when debug logging is off.
   *
   * @covers ::log
   * @covers ::__construct
   */
  public function testLogWhenDebugTurnedOff() {

    /** @var \Drupal\Core\Config\ConfigFactory $config_factory */
    $config_factory = $this
      ->getConfigFactoryStub([
      'cas.settings' => [
        'advanced.debug_log' => FALSE,
      ],
    ]);
    $cas_helper = new CasHelper($config_factory, $this->loggerFactory, $this->token
      ->reveal());

    // The actual logger should only called once, when we log an error.
    $this->loggerChannel
      ->expects($this
      ->once())
      ->method('log');
    $cas_helper
      ->log(LogLevel::DEBUG, 'This is a debug log');
    $cas_helper
      ->log(LogLevel::ERROR, 'This is an error log');
  }

  /**
   * @covers ::handleReturnToParameter
   */
  public function testHandleReturnToParameter() {
    $config_factory = $this
      ->getConfigFactoryStub([
      'cas.settings' => [
        'advanced.debug_log' => FALSE,
      ],
    ]);
    $cas_helper = new CasHelper($config_factory, new LoggerChannelFactory(), $this->token
      ->reveal());
    $request = new Request([
      'returnto' => 'node/1',
    ]);
    $this
      ->assertFalse($request->query
      ->has('destination'));
    $this
      ->assertSame('node/1', $request->query
      ->get('returnto'));
    $cas_helper
      ->handleReturnToParameter($request);

    // Check that the 'returnto' has been copied to 'destination'.
    $this
      ->assertSame('node/1', $request->query
      ->get('destination'));
    $this
      ->assertSame('node/1', $request->query
      ->get('returnto'));
  }

  /**
   * Tests the message generator.
   *
   * @covers ::getMessage
   */
  public function testGetMessage() {

    /** @var \Drupal\Core\Config\ConfigFactory $config_factory */
    $config_factory = $this
      ->getConfigFactoryStub([
      'cas.settings' => [
        'arbitrary_message' => 'Use <a href="[cas:login-url]">CAS login</a>',
        'messages' => [
          'empty_message' => '',
          'do_not_trust_user_input' => '<script>alert("Hacked!");</script>',
        ],
      ],
    ]);
    $cas_helper = new CasHelper($config_factory, $this->loggerFactory, $this->token
      ->reveal());
    $message = $cas_helper
      ->getMessage('arbitrary_message');
    $this
      ->assertInstanceOf(FormattableMarkup::class, $message);
    $this
      ->assertEquals('Use <a href="/caslogin">CAS login</a>', $message);

    // Empty message.
    $message = $cas_helper
      ->getMessage('messages.empty_message');
    $this
      ->assertSame('', $message);

    // Check hacker entered message.
    $message = $cas_helper
      ->getMessage('messages.do_not_trust_user_input');

    // Check that the dangerous tags were stripped-out.
    $this
      ->assertEquals('alert("Hacked!");', $message);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CasHelperTest::$loggerChannel protected property The mocked log channel.
CasHelperTest::$loggerFactory protected property The mocked logger factory.
CasHelperTest::$token protected property The token service.
CasHelperTest::$urlGenerator protected property The mocked Url generator.
CasHelperTest::getServerLoginUrlDataProvider public function Provides parameters and expected return values for testGetServerLoginUrl.
CasHelperTest::setUp protected function Overrides UnitTestCase::setUp
CasHelperTest::testGetMessage public function Tests the message generator.
CasHelperTest::testHandleReturnToParameter public function @covers ::handleReturnToParameter
CasHelperTest::testLogWhenDebugTurnedOff public function Test our log wrapper when debug logging is off.
CasHelperTest::testLogWhenDebugTurnedOn public function Test the logging capability.
PhpunitCompatibilityTrait::getMock Deprecated public function Returns a mock object for the specified class using the available method.
PhpunitCompatibilityTrait::setExpectedException Deprecated public function Compatibility layer for PHPUnit 6 to support PHPUnit 4 code.
UnitTestCase::$randomGenerator protected property The random generator.
UnitTestCase::$root protected property The app root. 1
UnitTestCase::assertArrayEquals protected function Asserts if two arrays are equal by sorting them first.
UnitTestCase::getBlockMockWithMachineName Deprecated protected function Mocks a block with a block plugin. 1
UnitTestCase::getClassResolverStub protected function Returns a stub class resolver.
UnitTestCase::getConfigFactoryStub public function Returns a stub config factory that behaves according to the passed array.
UnitTestCase::getConfigStorageStub public function Returns a stub config storage that returns the supplied configuration.
UnitTestCase::getContainerWithCacheTagsInvalidator protected function Sets up a container with a cache tags invalidator.
UnitTestCase::getRandomGenerator protected function Gets the random generator for the utility methods.
UnitTestCase::getStringTranslationStub public function Returns a stub translation manager that just returns the passed string.
UnitTestCase::randomMachineName public function Generates a unique random string containing letters and numbers.