prophesize(AccountInterface::class); // The one listed permission will be returned as instructed; Any others are // always denied. $user->hasPermission($permission)->willReturn($allowed); $user->hasPermission(Argument::type('string'))->willReturn(FALSE); $entity = $this->prophesize(ContentEntityInterface::class); $entity = $entity->reveal(); $entity->moderation_state = new \stdClass(); $entity->moderation_state->value = $from_id; $validator = new StateTransitionValidation($this->setUpModerationInformation($entity)); $has_transition = FALSE; foreach ($validator->getValidTransitions($entity, $user->reveal()) as $transition) { if ($transition->to()->id() === $to_id) { $has_transition = TRUE; break; } } $this->assertSame($result, $has_transition); } protected function setUpModerationInformation(ContentEntityInterface $entity) { // Create a container so that the plugin manager and workflow type can be // mocked. $container = new ContainerBuilder(); $workflow_manager = $this->prophesize(WorkflowTypeManager::class); $workflow_manager->createInstance('content_moderation', Argument::any())->willReturn(new TestType([], '', [])); $container->set('plugin.manager.workflows.type', $workflow_manager->reveal()); \Drupal::setContainer($container); $workflow = new Workflow(['id' => 'process', 'type' => 'content_moderation'], 'workflow'); $workflow ->getTypePlugin() ->addState('draft', 'draft') ->addState('needs_review', 'needs_review') ->addState('published', 'published') ->addTransition('draft', 'draft', ['draft'], 'draft') ->addTransition('review', 'review', ['draft'], 'needs_review') ->addTransition('publish', 'publish', ['needs_review', 'published'], 'published'); $moderation_info = $this->prophesize(ModerationInformationInterface::class); $moderation_info->getWorkflowForEntity($entity)->willReturn($workflow); return $moderation_info->reveal(); } /** * Data provider for the user transition test. */ public function userTransitionsProvider() { // The user has the right permission, so let it through. $ret[] = ['draft', 'draft', 'use process transition draft', TRUE, TRUE]; // The user doesn't have the right permission, block it. $ret[] = ['draft', 'draft', 'use process transition draft', FALSE, FALSE]; // The user has some other permission that doesn't matter. $ret[] = ['draft', 'draft', 'use process transition review', TRUE, FALSE]; return $ret; } }