X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Ftests%2FDrupal%2FTests%2FCore%2FEntity%2FAccess%2FEntityFormDisplayAccessControlHandlerTest.php;fp=web%2Fcore%2Ftests%2FDrupal%2FTests%2FCore%2FEntity%2FAccess%2FEntityFormDisplayAccessControlHandlerTest.php;h=a92d76abb70d585c2d2db84bb278b15e567f95f2;hp=0000000000000000000000000000000000000000;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/web/core/tests/Drupal/Tests/Core/Entity/Access/EntityFormDisplayAccessControlHandlerTest.php b/web/core/tests/Drupal/Tests/Core/Entity/Access/EntityFormDisplayAccessControlHandlerTest.php new file mode 100644 index 000000000..a92d76abb --- /dev/null +++ b/web/core/tests/Drupal/Tests/Core/Entity/Access/EntityFormDisplayAccessControlHandlerTest.php @@ -0,0 +1,240 @@ +prophesize(EntityTypeManagerInterface::class); + return $entity_type_manager->reveal(); + } + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + $this->anon = $this->getMock(AccountInterface::class); + $this->anon + ->expects($this->any()) + ->method('hasPermission') + ->will($this->returnValue(FALSE)); + $this->anon + ->expects($this->any()) + ->method('id') + ->will($this->returnValue(0)); + + $this->member = $this->getMock(AccountInterface::class); + $this->member + ->expects($this->any()) + ->method('hasPermission') + ->will($this->returnValueMap([ + ['administer foobar form display', TRUE], + ])); + $this->member + ->expects($this->any()) + ->method('id') + ->will($this->returnValue(2)); + + $this->parent_member = $this->getMock(AccountInterface::class); + $this->parent_member + ->expects($this->any()) + ->method('hasPermission') + ->will($this->returnValueMap([ + ['Llama', TRUE], + ])); + $this->parent_member + ->expects($this->any()) + ->method('id') + ->will($this->returnValue(3)); + + $entity_form_display_entity_type = $this->getMock(ConfigEntityTypeInterface::class); + $entity_form_display_entity_type->expects($this->any()) + ->method('getAdminPermission') + ->will($this->returnValue('Llama')); + $entity_form_display_entity_type + ->expects($this->any()) + ->method('getKey') + ->will($this->returnValueMap([ + ['langcode', 'langcode'], + ])); + $entity_form_display_entity_type->expects($this->any()) + ->method('entityClassImplements') + ->will($this->returnValue(TRUE)); + $entity_form_display_entity_type->expects($this->any()) + ->method('getConfigPrefix') + ->willReturn(''); + + $this->moduleHandler = $this->getMock(ModuleHandlerInterface::class); + $this->moduleHandler + ->expects($this->any()) + ->method('getImplementations') + ->will($this->returnValue([])); + $this->moduleHandler + ->expects($this->any()) + ->method('invokeAll') + ->will($this->returnValue([])); + + $storage_access_control_handler = new EntityFormDisplayAccessControlHandler($entity_form_display_entity_type); + $storage_access_control_handler->setModuleHandler($this->moduleHandler); + + $entity_type_manager = $this->getMock(EntityTypeManagerInterface::class); + $entity_type_manager + ->expects($this->any()) + ->method('getStorage') + ->willReturnMap([ + ['entity_display', $this->getMock(EntityStorageInterface::class)], + ]); + $entity_type_manager + ->expects($this->any()) + ->method('getAccessControlHandler') + ->willReturnMap([ + ['entity_display', $storage_access_control_handler], + ]); + $entity_type_manager + ->expects($this->any()) + ->method('getDefinition') + ->will($this->returnValue($entity_form_display_entity_type)); + + $entity_field_manager = $this->getMock(EntityFieldManagerInterface::class); + $entity_field_manager->expects($this->any()) + ->method('getFieldDefinitions') + ->will($this->returnValue([])); + + $entity_manager = new EntityManager(); + $container = new Container(); + $container->set('entity.manager', $entity_manager); + $container->set('entity_type.manager', $entity_type_manager); + $container->set('entity_field.manager', $entity_field_manager); + $container->set('language_manager', $this->getMock(LanguageManagerInterface::class)); + $container->set('plugin.manager.field.widget', $this->prophesize(PluginManagerInterface::class)); + $container->set('plugin.manager.field.field_type', $this->getMock(FieldTypePluginManagerInterface::class)); + $container->set('plugin.manager.field.formatter', $this->prophesize(FormatterPluginManager::class)); + $container->set('uuid', $this->getMock(UuidInterface::class)); + $container->set('renderer', $this->getMock(RendererInterface::class)); + $container->set('cache_contexts_manager', $this->prophesize(CacheContextsManager::class)); + // Inject the container into entity.manager so it can defer to + // entity_type.manager. + $entity_manager->setContainer($container); + \Drupal::setContainer($container); + + $this->entity = new EntityFormDisplay([ + 'targetEntityType' => 'foobar', + 'bundle' => 'bazqux', + 'mode' => 'default', + 'id' => 'foobar.bazqux.default', + 'uuid' => '6f2f259a-f3c7-42ea-bdd5-111ad1f85ed1', + ], 'entity_display'); + + $this->accessControlHandler = $storage_access_control_handler; + } + + /** + * Assert method to verify the access by operations. + * + * @param array $allow_operations + * A list of allowed operations. + * @param \Drupal\Core\Session\AccountInterface $user + * The account to use for get access. + */ + public function assertAllowOperations(array $allow_operations, AccountInterface $user) { + foreach (['view', 'update', 'delete'] as $operation) { + $expected = in_array($operation, $allow_operations); + $actual = $this->accessControlHandler->access($this->entity, $operation, $user); + $this->assertSame($expected, $actual, "Access problem with '$operation' operation."); + } + } + + /** + * @covers ::access + * @covers ::checkAccess + */ + public function testAccess() { + $this->assertAllowOperations([], $this->anon); + $this->assertAllowOperations(['view', 'update', 'delete'], $this->member); + $this->assertAllowOperations(['view', 'update', 'delete'], $this->parent_member); + + $this->entity->enforceIsNew(TRUE)->save(); + // Unfortunately, EntityAccessControlHandler has a static cache, which we + // therefore must reset manually. + $this->accessControlHandler->resetCache(); + + $this->assertAllowOperations([], $this->anon); + $this->assertAllowOperations(['view', 'update'], $this->member); + $this->assertAllowOperations(['view', 'update'], $this->parent_member); + } + +}