workbench_access-8.x-1.x-dev/tests/src/Functional/AccessCacheTest.php

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

namespace Drupal\Tests\workbench_access\Functional;

use Drupal\taxonomy\Entity\Term;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\workbench_access\Traits\WorkbenchAccessTestTrait;
use Drupal\workbench_access\WorkbenchAccessManagerInterface;

/**
 * Tests the clearing of access control cache.
 *
 * This is an explicit test for the issue described at
 * https://www.drupal.org/project/workbench_access/issues/3118596
 *
 * @group workbench_access
 */
class AccessCacheTest extends BrowserTestBase {

  use WorkbenchAccessTestTrait;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'workbench_access',
    'node',
    'taxonomy',
    'options',
    'user',
    'system',
  ];

  /**
   * The default theme.
   *
   * @var string
   */
  protected $defaultTheme = 'stark';

  /**
   * Tests that the user can edit the node when allowed.
   */
  public function testNodeEdit() {
    // Set up a content type, taxonomy field, and taxonomy scheme.
    $node_type = $this->createContentType(['type' => 'page']);
    $vocab = $this->setUpVocabulary();
    $field_name = WorkbenchAccessManagerInterface::FIELD_NAME;
    $title = 'Section';
    $cardinality = -1;
    $field = $this->setUpTaxonomyFieldForEntityType('node', $node_type->id(), $vocab->id(), $field_name, $title, $cardinality);
    $this->assertEquals($field->getDefaultValueLiteral(), []);
    $scheme = $this->setUpTaxonomyScheme($node_type, $vocab);
    $user_storage = \Drupal::service('workbench_access.user_section_storage');
    $role_storage = \Drupal::service('workbench_access.role_section_storage');

    // Set up an editor and log in as them.
    $editor = $this->setUpEditorUser();
    $this->drupalLogin($editor);

    // Set up some roles and terms for this test.
    // Create terms and roles.
    $staff_term = Term::create([
      'vid' => $vocab->id(),
      'name' => 'Staff',
    ]);
    $staff_term->save();
    $super_staff_term = Term::create([
      'vid' => $vocab->id(),
      'name' => 'Super staff',
    ]);
    $super_staff_term->save();
    $base_term = Term::create([
      'vid' => $vocab->id(),
      'name' => 'Editor',
    ]);
    $base_term->save();

    // Add the user to the base section.
    $user_storage->addUser($scheme, $editor, [$base_term->id()]);
    $expected = [$editor->id()];
    $existing_users = $user_storage->getEditors($scheme, $base_term->id());
    $this->assertEquals($expected, array_keys($existing_users));

    // Create a node that the user cannot edit.
    $node_values = [
      'type' => 'page',
      'title' => 'foo',
      $field_name => [$super_staff_term->id(), $staff_term->id()],
    ];
    $node = $this->createNode($node_values);

    $this->drupalGet('node/' . $node->id() . '/edit');
    $this->assertSession()->statusCodeEquals(403);

    // Add the user to the super staff section.
    $user_storage->addUser($scheme, $editor, [
      $super_staff_term->id(),
      $base_term->id(),
    ]);
    $this->assertEquals($expected, array_keys($existing_users));

    $this->drupalGet('node/' . $node->id() . '/edit');
    $this->assertSession()->statusCodeEquals(200);

    // Now remove the user.
    $user_storage->removeUser($scheme, $editor, [$super_staff_term->id()]);
    $this->drupalGet('node/' . $node->id() . '/edit');
    $this->assertSession()->statusCodeEquals(403);

    // Now add the user by role.
    $role_storage->addRole($scheme, 'editor', [$super_staff_term->id()]);
    $this->drupalGet('node/' . $node->id() . '/edit');
    $this->assertSession()->statusCodeEquals(200);

    // Now remove the user role.
    $role_storage->removeRole($scheme, 'editor', [$super_staff_term->id()]);
    $this->drupalGet('node/' . $node->id() . '/edit');
    $this->assertSession()->statusCodeEquals(403);

    // Now, add the user again.
    $user_storage->addUser($scheme, $editor, [$super_staff_term->id()]);
    $this->drupalGet('node/' . $node->id() . '/edit');
    $this->assertSession()->statusCodeEquals(200);

    // Now delete the term.
    $super_staff_term->delete();
    $this->drupalGet('node/' . $node->id() . '/edit');
    $this->assertSession()->statusCodeEquals(403);

    // Create another node assigned to a user section. This check tests that
    // we only deleted the section associations we wanted to.
    $node_values = [
      'type' => 'page',
      'title' => 'foo2',
      $field_name => [$base_term->id(), $staff_term->id()],
    ];
    $node2 = $this->createNode($node_values);

    $this->drupalGet('node/' . $node2->id() . '/edit');
    $this->assertSession()->statusCodeEquals(200);

    // Now remove the user.
    $user_storage->removeUser($scheme, $editor, [$base_term->id()]);
    $this->drupalGet('node/' . $node->id() . '/edit');
    $this->assertSession()->statusCodeEquals(403);

    // Now delete the scheme, which should restore access to both nodes.
    $scheme->delete();
    $this->drupalGet('node/' . $node->id() . '/edit');
    $this->assertSession()->statusCodeEquals(200);
    $this->drupalGet('node/' . $node2->id() . '/edit');
    $this->assertSession()->statusCodeEquals(200);

  }

}

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

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