multiversion-8.x-1.0-beta34/tests/src/Unit/WorkspaceManagerTest.php
tests/src/Unit/WorkspaceManagerTest.php
<?php
namespace Drupal\Tests\multiversion\Unit;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Tests\UnitTestCase;
use Drupal\multiversion\Workspace\WorkspaceManager;
use Prophecy\Argument;
/**
* @coversDefaultClass \Drupal\multiversion\Workspace\WorkspaceManager
* @group multiversion
*/
class WorkspaceManagerTest extends UnitTestCase {
/**
* The entities under test.
*
* @var array
*/
protected $entities;
/**
* The entities values.
*
* @var array
*/
protected $values;
/**
* The dependency injection container.
*
* @var \Symfony\Component\DependencyInjection\ContainerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $container;
/**
* The entity manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $entityTypeManager;
/**
* The request stack.
*
* @var \Symfony\Component\HttpFoundation\RequestStack|\PHPUnit_Framework_MockObject_MockObject
*/
protected $requestStack;
/**
* The ID of the type of the entity under test.
*
* @var string
*/
protected $entityTypeId;
/**
* The entity type used for testing.
*
* @var \Drupal\Core\Entity\EntityTypeInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $entityType;
/**
* The workspace negotiators.
*
* @var array
*/
protected $workspaceNegotiators;
/**
* The current user.
*
* @var \Drupal\Core\Session\AccountProxyInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $currentUser;
/**
* The logger.
*
* @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $logger;
/**
* The block manager.
*
* @var \Drupal\Core\Block\BlockManagerInterface
*/
protected $block_manager;
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
$this->entityTypeId = 'workspace';
$first_machine_name = $this->randomMachineName();
$second_machine_name = $this->randomMachineName();
$this->values = [['machine_name' => $first_machine_name], ['machine_name' => $second_machine_name]];
$this->entityType = $this->getMock('Drupal\multiversion\Entity\WorkspaceInterface');
$this->entityTypeManager = $this->getMock('Drupal\Core\Entity\EntityTypeManagerInterface');
$this->currentUser = $this->getMock('Drupal\Core\Session\AccountProxyInterface');
$this->logger = $this->getMock('Psr\Log\LoggerInterface');
$this->block_manager = $this->getMockBuilder('Drupal\Core\Block\BlockManager')
->disableOriginalConstructor()
->getMock();
$this->entityTypeManager->expects($this->any())
->method('getDefinition')
->with($this->entityTypeId)
->will($this->returnValue($this->entityType));
$this->requestStack = $this->getMock('Symfony\Component\HttpFoundation\RequestStack');
$container = new ContainerBuilder();
$container->set('entity.manager', $this->entityTypeManager);
$container->set('request_stack', $this->requestStack);
$container->setParameter('workspace.default', 1);
\Drupal::setContainer($container);
foreach ($this->values as $value) {
$entity = $this->getMockBuilder('Drupal\multiversion\Entity\Workspace')
->disableOriginalConstructor()
->getMock();
$entity->expects($this->any())
->method('create')
->with($value)
->will($this->returnValue($this->entityType));
$this->entities[] = $entity;
}
$this->workspaceNegotiators[] = [$this->getMock('Drupal\multiversion\Workspace\DefaultWorkspaceNegotiator')];
$session_workspace_negotiator = $this->getMockBuilder('Drupal\multiversion\Workspace\SessionWorkspaceNegotiator')
->disableOriginalConstructor()
->getMock();
$this->workspaceNegotiators[] = [$session_workspace_negotiator];
}
/**
* Tests the addNegotiator() method.
*/
public function testAddNegotiator() {
$workspace_manager = new WorkspaceManager($this->requestStack, $this->entityTypeManager, $this->currentUser, $this->logger);
$workspace_manager->addNegotiator($this->workspaceNegotiators[0][0], 0);
$workspace_manager->addNegotiator($this->workspaceNegotiators[1][0], 1);
$property = new \ReflectionProperty('Drupal\multiversion\Workspace\WorkspaceManager', 'negotiators');
$property->setAccessible(TRUE);
$this->assertSame($this->workspaceNegotiators, $property->getValue($workspace_manager));
}
/**
* Tests the load() method.
*/
public function testLoad() {
$storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface');
$storage->expects($this->once())
->method('load')
->with(1)
->will($this->returnValue($this->entities[0]));
$this->entityTypeManager->expects($this->once())
->method('getStorage')
->with($this->entityTypeId)
->will($this->returnValue($storage));
$workspace_manager = new WorkspaceManager($this->requestStack, $this->entityTypeManager, $this->currentUser, $this->logger);
$entity = $workspace_manager->load(1);
$this->assertSame($this->entities[0], $entity);
}
/**
* Tests the loadMultiple() method.
*/
public function testLoadMultiple() {
$ids = [1,2];
$storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface');
$storage->expects($this->once())
->method('loadMultiple')
->with($ids)
->will($this->returnValue($this->entities));
$this->entityTypeManager->expects($this->once())
->method('getStorage')
->with($this->entityTypeId)
->will($this->returnValue($storage));
$workspace_manager = new WorkspaceManager($this->requestStack, $this->entityTypeManager, $this->currentUser, $this->logger);
$entities = $workspace_manager->loadMultiple($ids);
$this->assertSame($this->entities, $entities);
}
/**
* Tests that setActiveWorkspace() sets the workspace on the negotiator.
*/
public function testSetActiveWorkspace() {
// Create the request we will use.
$request = $this->getMock('Symfony\Component\HttpFoundation\Request');
$this->requestStack->method('getCurrentRequest')->willReturn($request);
// Create the workspace that we will set.
$workspace = $this->getMockBuilder('Drupal\multiversion\Entity\Workspace')
->disableOriginalConstructor()
->getMock();
$workspace->expects($this->any())->method("isPublished")->willReturn(TRUE);
$workspace->expects($this->any())->method("access")->willReturn(TRUE);
// Spy on the negotiator and stub the applies and persist methods.
$negotiator = $this->prophesize('Drupal\multiversion\Workspace\DefaultWorkspaceNegotiator');
$negotiator->applies(Argument::any())->willReturn(TRUE);
$negotiator->persist(Argument::any())->will(function(){ return $this; });
// Create the workspace manager.
$workspace_manager = new WorkspaceManager($this->requestStack, $this->entityTypeManager, $this->currentUser, $this->logger);
$workspace_manager->addNegotiator($negotiator->reveal(), 1);
// Execute the code under test.
$workspace_manager->setActiveWorkspace($workspace);
// Ensure persist with the workspace was called on the negotiator.
$negotiator->persist($workspace)->shouldHaveBeenCalled();
}
/**
* Tests that getActiveWorkspace() gets from the negotiator.
*/
public function testGetActiveWorkspace() {
$workspace_id = '123';
// Create the request we will use.
$request = $this->getMock('Symfony\Component\HttpFoundation\Request');
$this->requestStack->method('getCurrentRequest')->willReturn($request);
// Create the workspace that we will get.
$workspace = $this->getMockBuilder('Drupal\multiversion\Entity\Workspace')
->disableOriginalConstructor()
->getMock();
// Create the negotiator and stub the applies and getWorkspaceId methods.
$negotiator = $this->getMock('Drupal\multiversion\Workspace\DefaultWorkspaceNegotiator');
$negotiator->method('applies')->willReturn(TRUE);
$negotiator->method('getWorkspaceId')->willReturn($workspace_id);
// Create the storage and stub the load method.
$storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface');
$storage->method('load')->with($workspace_id)->willReturn($workspace);
// Stub the entity manager to return $storage.
$this->entityTypeManager->method('getStorage')
->with($this->entityTypeId)
->willReturn($storage);
// Create the workspace manager with the negotiator.
$workspace_manager = new WorkspaceManager($this->requestStack, $this->entityTypeManager, $this->currentUser, $this->logger);
$workspace_manager->addNegotiator($negotiator, 1);
// Execute the code under test.
$active_workspace = $workspace_manager->getActiveWorkspace();
// Ensure value is the workspace we stubbed.
$this->assertSame($workspace, $active_workspace);
}
/**
* Tests the getSortedNegotiators() method.
*/
public function testGetSortedNegotiators() {
$workspace_manager = new WorkspaceManager($this->requestStack, $this->entityTypeManager, $this->currentUser, $this->logger);
$workspace_manager->addNegotiator($this->workspaceNegotiators[0][0], 1);
$workspace_manager->addNegotiator($this->workspaceNegotiators[1][0], 3);
$method = new \ReflectionMethod('Drupal\multiversion\Workspace\WorkspaceManager', 'getSortedNegotiators');
$method->setAccessible(TRUE);
$sorted_negotiators = new \ReflectionProperty('Drupal\multiversion\Workspace\WorkspaceManager', 'sortedNegotiators');
$sorted_negotiators->setAccessible(TRUE);
$sorted_negotiators_value = $sorted_negotiators->getValue($workspace_manager);
$negotiators = new \ReflectionProperty('Drupal\multiversion\Workspace\WorkspaceManager', 'negotiators');
$negotiators->setAccessible(TRUE);
$negotiators_value = $negotiators->getValue($workspace_manager);
if (!isset($sorted_negotiators_value)) {
// Sort the negotiators according to priority.
krsort($negotiators_value);
// Merge nested negotiators from $negotiators_value into
// $sorted_negotiators_value.
$sorted_negotiators_value = [];
foreach ($negotiators_value as $builders) {
$sorted_negotiators_value = array_merge($sorted_negotiators_value, $builders);
}
}
$this->assertSame($sorted_negotiators_value, $method->invoke($workspace_manager));
}
}
