workflow_participants-8.x-2.x-dev/tests/src/Functional/EntityAccessTest.php

tests/src/Functional/EntityAccessTest.php
<?php

namespace Drupal\Tests\workflow_participants\Functional;

use Drupal\workflows\Entity\Workflow;

/**
 * Tests entity access for workflow participants.
 *
 * @group workflow_participants
 */
class EntityAccessTest extends TestBase {

  /**
   * {@inheritdoc}
   */
  protected function setUp():void {
    parent::setUp();
    $this->drupalLogin($this->participants[1]);
  }

  /**
   * Test read access for editors and reviewers.
   */
  public function testReadAccess() {
    $this->node->setUnpublished();
    $this->node->save();

    // Should not have access if not a participant.
    $this->drupalGet($this->node->toUrl());
    $this->assertSession()->statusCodeEquals(403);

    // Add this user as a reviewer.
    $participants = \Drupal::entityTypeManager()->getStorage('workflow_participants')->loadForModeratedEntity($this->node);
    $participants->reviewers[0] = $this->participants[1];
    $participants->save();

    $this->assertTrue($this->node->access('view'));
    $this->drupalGet($this->node->toUrl());
    $this->assertSession()->statusCodeEquals(200);
  }

  /**
   * Test edit access.
   */
  public function testEditAccess() {
    // Should not have access if not a participant.
    $this->drupalGet($this->node->toUrl('edit-form'));
    $this->assertSession()->statusCodeEquals(403);

    // Add this user as an editor.
    $participants = \Drupal::entityTypeManager()->getStorage('workflow_participants')->loadForModeratedEntity($this->node);
    $participants->editors[0] = $this->participants[1];
    $participants->save();

    // Should not have access if no accessible transitions.
    $this->drupalGet($this->node->toUrl('edit-form'));
    $this->assertSession()->statusCodeEquals(403);

    // Add an accessible transition.
    /** @var \Drupal\content_moderation\ModerationStateTransitionInterface $transition */
    /** @var \Drupal\workflows\WorkflowInterface $workflow */
    $workflow = Workflow::load('editorial');
    $workflow->setThirdPartySetting('workflow_participants', 'editor_transitions', ['publish' => 'publish']);
    $workflow->setThirdPartySetting('workflow_participants', 'reviewer_transitions', ['publish' => 'publish']);
    $workflow->save();

    // User should now have edit access.
    $this->drupalGet($this->node->toUrl('edit-form'));
    $this->assertSession()->statusCodeEquals(200);

    // Remove edit access, add reviewer access, and verify no edit access.
    $participants->editors = [];
    $participants->reviewers[0] = $this->participants[1];
    $participants->save();
    $this->drupalGet($this->node->toUrl('edit-form'));
    $this->assertSession()->statusCodeEquals(403);
  }

  /**
   * Verifies latest version tab access.
   */
  public function testLatestVersion() {
    // Create a forward revision.
    $this->node->moderation_state = 'published';
    $this->node->save();
    $this->node->moderation_state = 'draft';
    $this->node->save();
    $this->assertTrue($this->moderationInfo->hasPendingRevision($this->node));

    // There should be no access initially.
    $this->drupalGet($this->node->toUrl('latest-version'));
    $this->assertSession()->statusCodeEquals(403);

    // Add this user as a reviewer.
    $participants = \Drupal::entityTypeManager()->getStorage('workflow_participants')->loadForModeratedEntity($this->node);
    $participants->reviewers[0] = $this->participants[1];
    $participants->save();

    $this->drupalGet($this->node->toUrl('latest-version'));
    $this->assertSession()->statusCodeEquals(200);

    // There should be no moderatin ability initially.
    $this->assertSession()->fieldNotExists('Log message');
    $this->assertSession()->fieldNotExists('Change to');

    // Add an accessible transition.
    /** @var \Drupal\workflows\WorkflowInterface $workflow */
    $workflow = Workflow::load('editorial');
    $workflow->setThirdPartySetting('workflow_participants', 'reviewer_transitions', ['publish' => 'publish']);
    $workflow->save();

    // Transition the node and post a log message.
    $this->drupalGet($this->node->toUrl('latest-version'));
    $this->assertSession()->statusCodeEquals(200);
    $this->assertSession()->fieldExists('Log message');
    $this->assertSession()->fieldExists('Change to');
    $edit = [
      'new_state' => 'published',
      'revision_log' => $this->randomString(),
    ];
    $this->submitForm($edit, 'Apply');

    // Reload node.
    $node = \Drupal::entityTypeManager()->getStorage('node')->loadUnchanged($this->node->id());
    $this->assertEquals($edit['revision_log'], $node->revision_log->value);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc