.../workflows/src/WorkflowAccessControlHandler.php | 2 +- .../workflow_type_test/workflow_type_test.module | 4 +- .../Kernel/WorkflowAccessControlHandlerTest.php | 112 +++++++++++---------- 3 files changed, 62 insertions(+), 56 deletions(-) diff --git a/core/modules/workflows/src/WorkflowAccessControlHandler.php b/core/modules/workflows/src/WorkflowAccessControlHandler.php index b81bcd8..e34e647 100644 --- a/core/modules/workflows/src/WorkflowAccessControlHandler.php +++ b/core/modules/workflows/src/WorkflowAccessControlHandler.php @@ -12,7 +12,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** - * Access controller for the Moderation State entity. + * Access controller for the Workflow entity. * * @see \Drupal\workflows\Entity\Workflow. * diff --git a/core/modules/workflows/tests/modules/workflow_type_test/workflow_type_test.module b/core/modules/workflows/tests/modules/workflow_type_test/workflow_type_test.module index 2535996..b97f2c5 100644 --- a/core/modules/workflows/tests/modules/workflow_type_test/workflow_type_test.module +++ b/core/modules/workflows/tests/modules/workflow_type_test/workflow_type_test.module @@ -5,8 +5,6 @@ * Module file for workflow_type_test. */ -use Drupal\Core\Cache\Cache; - /** * Implements hook_workflow_type_info_alter(). */ @@ -19,7 +17,7 @@ function workflow_type_test_workflow_type_info_alter(&$definitions) { } /** - * Set the type plugin definitions override and clear the cache. + * Sets the type plugin definitions override and clear the cache. * * @param array $definitions * Definitions to set. diff --git a/core/modules/workflows/tests/src/Kernel/WorkflowAccessControlHandlerTest.php b/core/modules/workflows/tests/src/Kernel/WorkflowAccessControlHandlerTest.php index 197ebed..cd4e7ce 100644 --- a/core/modules/workflows/tests/src/Kernel/WorkflowAccessControlHandlerTest.php +++ b/core/modules/workflows/tests/src/Kernel/WorkflowAccessControlHandlerTest.php @@ -18,7 +18,7 @@ class WorkflowAccessControlHandlerTest extends KernelTestBase { use UserCreationTrait; /** - * @var array + * {@inheritdoc} */ public static $modules = [ 'workflows', @@ -28,9 +28,9 @@ class WorkflowAccessControlHandlerTest extends KernelTestBase { ]; /** - * The workflows access control handler. + * The workflow access control handler. * - * @var \Drupal\Core\Entity\EntityAccessControlHandlerInterface + * @var \Drupal\workflows\WorkflowAccessControlHandler */ protected $accessControlHandler; @@ -85,7 +85,6 @@ public function testCheckCreateAccess() { ->addCacheTags(['workflow_type_plugins']), $this->accessControlHandler->createAccess(NULL, $this->adminUser, [], TRUE) ); - $this->assertEquals(AccessResult::allowed()->addCacheContexts(['user.permissions'])->addCacheTags(['workflow_type_plugins']), $this->accessControlHandler->createAccess(NULL, $this->adminUser, [], TRUE)); // Remove all plugin types and ensure not even the admin user is allowed to // create a workflow. @@ -101,21 +100,28 @@ public function testCheckCreateAccess() { /** * @covers ::checkAccess - * @dataProvider workflowAdministrationTestCases + * @dataProvider checkAccessProvider */ - public function testWorkflowAdministration($user, $operation, $result) { + public function testCheckAccess($user, $operation, $result, $states_to_create = []) { $workflow = Workflow::create([ 'type' => 'workflow_type_test', 'id' => 'test_workflow', ]); $workflow->save(); + $workflow_type = $workflow->getTypePlugin(); + foreach ($states_to_create as $state_id => $is_required) { + $workflow_type->addState($state_id, $this->randomString()); + } + \Drupal::state()->set('workflow_type_test.required_states', array_filter($states_to_create)); $this->assertEquals($result, $this->accessControlHandler->access($workflow, $operation, $this->{$user}, TRUE)); } /** - * Data provider for ::testWorflowAdministration. + * Data provider for ::testCheckAccess. + * + * @return array */ - public function workflowAdministrationTestCases() { + public function checkAccessProvider() { $container = new ContainerBuilder(); $cache_contexts_manager = $this->prophesize(CacheContextsManager::class); $cache_contexts_manager->assertValidTokens()->willReturn(TRUE); @@ -139,6 +145,28 @@ public function workflowAdministrationTestCases() { 'delete', AccessResult::allowed()->addCacheContexts(['user.permissions']), ], + 'Admin delete only state' => [ + 'adminUser', + 'delete-state:foo', + AccessResult::neutral()->addCacheTags(['config:workflows.workflow.test_workflow']), + ['foo' => FALSE], + ], + 'Admin delete one of two states' => [ + 'adminUser', + 'delete-state:foo', + AccessResult::allowed() + ->addCacheTags(['config:workflows.workflow.test_workflow']) + ->addCacheContexts(['user.permissions']), + ['foo' => FALSE, 'bar' => FALSE], + ], + 'Admin delete required state when there are >1 states' => [ + 'adminUser', + 'delete-state:foo', + AccessResult::allowed() + ->addCacheTags(['config:workflows.workflow.test_workflow']) + ->addCacheContexts(['user.permissions']), + ['foo' => TRUE, 'bar' => FALSE], + ], 'User view' => [ 'user', 'view', @@ -160,51 +188,31 @@ public function workflowAdministrationTestCases() { ->addCacheContexts(['user.permissions']) ->setReason("The 'administer workflows' permission is required."), ], + 'User delete only state' => [ + 'user', + 'delete-state:foo', + AccessResult::neutral()->addCacheTags(['config:workflows.workflow.test_workflow']), + ['foo' => FALSE], + ], + 'User delete one of two states' => [ + 'user', + 'delete-state:foo', + AccessResult::neutral() + ->addCacheTags(['config:workflows.workflow.test_workflow']) + ->addCacheContexts(['user.permissions']) + ->setReason("The 'administer workflows' permission is required."), + ['foo' => FALSE, 'bar' => FALSE], + ], + 'User delete required state when there are >1 states' => [ + 'user', + 'delete-state:foo', + AccessResult::neutral() + ->addCacheTags(['config:workflows.workflow.test_workflow']) + ->addCacheContexts(['user.permissions']) + ->setReason("The 'administer workflows' permission is required."), + ['foo' => TRUE, 'bar' => FALSE], + ], ]; } - /** - * @covers ::checkAccess - */ - public function testStateDeleteAccess() { - $workflow = Workflow::create([ - 'type' => 'workflow_type_test', - 'id' => 'test_workflow', - ]); - $workflow->save(); - $workflow_type = $workflow->getTypePlugin(); - - // Workflows require at least one state. - $workflow_type->addState('foo', 'Foo'); - $this->assertEquals( - AccessResult::neutral() - ->addCacheableDependency($workflow), - $this->accessControlHandler->access($workflow, 'delete-state:foo', $this->adminUser, TRUE) - ); - $workflow_type->addState('bar', 'Boo'); - $this->accessControlHandler->resetCache(); - $this->assertEquals( - AccessResult::allowed() - ->addCacheableDependency($workflow) - ->addCacheContexts(['user.permissions']), - $this->accessControlHandler->access($workflow, 'delete-state:foo', $this->adminUser, TRUE) - ); - - // Required states cannot be deleted. - $this->assertEquals( - AccessResult::allowed() - ->addCacheableDependency($workflow) - ->addCacheContexts(['user.permissions']), - $this->accessControlHandler->access($workflow, 'delete-state:bar', $this->adminUser, TRUE) - ); - \Drupal::state()->set('workflow_type_test.required_states', ['bar']); - $this->accessControlHandler->resetCache(); - $this->assertEquals( - AccessResult::neutral() - ->addCacheableDependency($workflow) - ->addCacheContexts(['user.permissions']), - $this->accessControlHandler->access($workflow, 'delete-state:bar', $this->adminUser, TRUE) - ); - } - }