Drupal modules for browsing and managing Fedora-based digital repositories.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

141 lines
4.4 KiB

<?php
namespace Drupal\Tests\islandora\Kernel;
use Drupal\jwt\Authentication\Event\JwtAuthGenerateEvent;
use Drupal\jwt\Authentication\Event\JwtAuthValidEvent;
use Drupal\jwt\Authentication\Event\JwtAuthValidateEvent;
use Drupal\jwt\JsonWebToken\JsonWebToken;
use Drupal\jwt\JsonWebToken\JsonWebTokenInterface;
use Drupal\Tests\user\Traits\UserCreationTrait;
use Drupal\core\Entity\EntityStorageInterface;
use Drupal\islandora\EventSubscriber\JwtEventSubscriber;
/**
* JwtEventSubscriber tests.
*
* @group islandora
* @coversDefaultClass \Drupal\islandora\EventSubscriber\JwtEventSubscriber
*/
class JwtEventSubscriberTest extends IslandoraKernelTestBase {
use UserCreationTrait;
/**
* The current user.
*
* @var \Drupal\Core\Session\AccountInterface
*/
protected $user;
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
$this->user = $this->createUser();
}
/**
* @covers \Drupal\islandora\EventSubscriber\JwtEventSubscriber::setIslandoraClaims
*/
public function testGeneratesValidToken() {
$entity_storage = $this->container->get('entity_type.manager')->getStorage('user');
$subscriber = new JwtEventSubscriber($entity_storage, $this->user);
// Generate a new token.
$jwt = new JsonWebToken();
$event = new JwtAuthGenerateEvent($jwt);
$subscriber->setIslandoraClaims($event);
// Validate it.
$validateEvent = new JwtAuthValidateEvent($jwt);
$subscriber->validate($validateEvent);
$this->assertTrue($validateEvent->isValid(), "Generated tokens must be valid.");
}
/**
* @covers \Drupal\islandora\EventSubscriber\JwtEventSubscriber::validate
*/
public function testInvalidatesMalformedToken() {
$entity_storage = $this->container->get('entity_type.manager')->getStorage('user');
$subscriber = new JwtEventSubscriber($entity_storage, $this->user);
// Create a new event with mock jwt that returns null for all functions.
$prophecy = $this->prophesize(JsonWebTokenInterface::class);
$jwt = $prophecy->reveal();
$event = new JwtAuthValidateEvent($jwt);
$subscriber->validate($event);
$this->assertFalse($event->isValid(), "Malformed event must be invalidated");
}
/**
* @covers \Drupal\islandora\EventSubscriber\JwtEventSubscriber::validate
*/
public function testInvalidatesBadUid() {
// Mock user entity storage, returns null when loading user.
$prophecy = $this->prophesize(EntityStorageInterface::class);
$entity_storage = $prophecy->reveal();
$subscriber = new JwtEventSubscriber($entity_storage, $this->user);
// Generate a new token.
$jwt = new JsonWebToken();
$event = new JwtAuthGenerateEvent($jwt);
$subscriber->setIslandoraClaims($event);
// Validate it.
$validateEvent = new JwtAuthValidateEvent($jwt);
$subscriber->validate($validateEvent);
$this->assertFalse($validateEvent->isValid(), "Event must be invalidated when user cannot be loaded.");
}
/**
* @covers \Drupal\islandora\EventSubscriber\JwtEventSubscriber::validate
*/
public function testInvalidatesBadAccount() {
$anotherUser = $this->createUser();
// Mock user entity storage, loads the wrong user.
$prophecy = $this->prophesize(EntityStorageInterface::class);
$prophecy->load($this->user->id())->willReturn($anotherUser);
$entity_storage = $prophecy->reveal();
$subscriber = new JwtEventSubscriber($entity_storage, $this->user);
// Generate a new token.
$jwt = new JsonWebToken();
$event = new JwtAuthGenerateEvent($jwt);
$subscriber->setIslandoraClaims($event);
// Validate it.
$validateEvent = new JwtAuthValidateEvent($jwt);
$subscriber->validate($validateEvent);
$this->assertFalse($validateEvent->isValid(), "Event must be invalidated when users don't align.");
}
/**
* @covers \Drupal\islandora\EventSubscriber\JwtEventSubscriber::loadUser
*/
public function testLoadsUser() {
$entity_storage = $this->container->get('entity_type.manager')->getStorage('user');
$subscriber = new JwtEventSubscriber($entity_storage, $this->user);
// Generate a new token.
$jwt = new JsonWebToken();
$event = new JwtAuthGenerateEvent($jwt);
$subscriber->setIslandoraClaims($event);
$validEvent = new JwtAuthValidEvent($jwt);
$subscriber->loadUser($validEvent);
$this->assertEquals($this->user->id(), $validEvent->getUser()->id(), "Correct user must be loaded to valid event.");
}
}