local_translation-8.x-1.x-dev/modules/local_translation_content/tests/src/Functional/LocalTranslationContentPermissionsTest.php

modules/local_translation_content/tests/src/Functional/LocalTranslationContentPermissionsTest.php
<?php

namespace Drupal\Tests\local_translation_content\Functional;

use Drupal\local_translation_content\LocalTranslationContentTestsTrait;
use Drupal\node\Entity\Node;
use Drupal\Tests\BrowserTestBase;
use Drupal\user\Entity\User;

/**
 * Class LocalTranslationContentPermissionsTest.
 *
 * @package Drupal\Tests\local_translation_content\Functional
 *
 * @group local_translation_content
 */
class LocalTranslationContentPermissionsTest extends BrowserTestBase {
  use LocalTranslationContentTestsTrait;

  /**
   * {@inheritdoc}
   */
  public $profile = 'standard';
  /**
   * {@inheritdoc}
   */
  public static $modules = ['local_translation_content'];

  /**
   * {@inheritdoc}
   */
  public function setUp() {
    parent::setUp();
    // Make all required configurations before testing.
    $this->setUpTest();
  }

  /**
   * Register translation skills for specific user.
   *
   * @param \Drupal\user\Entity\User $user
   *   User to be added with translation skills.
   */
  protected function registerSkillsFor(User $user) {
    \Drupal::service('local_translation.user_skills')
      ->addSkill(['en', 'fr'], $user);
  }

  /**
   * Create testing node.
   *
   * @param bool $with_translation
   *   Flag for create a translation or not.
   *
   * @return int
   *   Node ID.
   */
  protected function createTestNode($with_translation = FALSE) {
    $this->drupalLogin($this->rootUser);
    // Create testing node.
    $this->drupalPostForm('node/add/article', [
      'title[0][value]' => $this->randomString(),
    ], 'Save');

    if ($with_translation) {
      $node = Node::load(1);
      foreach ($this->getAllTestingLanguages() as $language) {
        if (!$node->hasTranslation($language)) {
          $translation = $node->addTranslation(
            $language,
            ['title' => $this->randomString()]
          );
          $translation->save();
        }
      }

    }
    $this->drupalLogout();
    return 1;
  }

  /**
   * Test that all permissions are exist.
   */
  public function testPermissionsExistence() {
    $this->drupalLogin($this->rootUser);
    $this->drupalGet('admin/people/permissions');
    $this->assertResponseCode(200);
    $permissions_prefix = '(limited to translation skills)';

    // Check for Local Translation Content permissions section.
    $this->assertTextHelper('Local Translation Content', FALSE);

    // Check for "static" permissions existence.
    $this->assertTextHelper("Create translations $permissions_prefix", FALSE);
    $this->assertTextHelper("Edit translations $permissions_prefix", FALSE);
    $this->assertTextHelper("Delete translations $permissions_prefix", FALSE);

    // Check for "content" permissions existence.
    $this->assertTextHelper("Article: Create new content $permissions_prefix", FALSE);
    $this->assertTextHelper("Article: Edit own content $permissions_prefix", FALSE);
    $this->assertTextHelper("Article: Edit any content $permissions_prefix", FALSE);
    $this->assertTextHelper("Article: Delete own content $permissions_prefix", FALSE);
    $this->assertTextHelper("Article: Delete any content $permissions_prefix", FALSE);

    // Additionally check that legacy permissions are NOT EXIST anymore!
    $this->assertTextHelper("Translate Article content $permissions_prefix");
    $this->assertTextHelper("Translate any entity $permissions_prefix");
  }

  /**
   * Test permissions visibility while they are enabled and not.
   */
  public function testPermissionsVisibility() {
    $this->drupalLogin($this->rootUser);
    $this->drupalGet('admin/people/permissions');
    $this->assertResponseCode(200);
    $permissions_prefix = '(limited to translation skills)';

    // Check for "static" permissions existence.
    $this->assertSession()->responseContains("Create translations $permissions_prefix");
    $this->assertSession()->responseContains("Edit translations $permissions_prefix");
    $this->assertSession()->responseContains("Delete translations $permissions_prefix");

    // Check for "content" permissions existence.
    $this->assertSession()->responseContains("Article: Create new content $permissions_prefix");
    $this->assertSession()->responseContains("Article: Edit own content $permissions_prefix");
    $this->assertSession()->responseContains("Article: Edit any content $permissions_prefix");
    $this->assertSession()->responseContains("Article: Delete own content $permissions_prefix");
    $this->assertSession()->responseContains("Article: Delete any content $permissions_prefix");

    $this->enablePermissionsChecking(TRUE);

    // Check for "static" permissions NON-existence.
    $this->assertSession()->responseNotContains("Create translations $permissions_prefix");
    $this->assertSession()->responseNotContains("Edit translations $permissions_prefix");
    $this->assertSession()->responseNotContains("Delete translations $permissions_prefix");

    // Check for "content" permissions NON-existence.
    $this->assertSession()->responseNotContains("Article: Create new content $permissions_prefix");
    $this->assertSession()->responseNotContains("Article: Edit own content $permissions_prefix");
    $this->assertSession()->responseNotContains("Article: Edit any content $permissions_prefix");
    $this->assertSession()->responseNotContains("Article: Delete own content $permissions_prefix");
    $this->assertSession()->responseNotContains("Article: Delete any content $permissions_prefix");
  }

  /**
   * Test user's content translation "create" access.
   *
   * @throws \Behat\Mink\Exception\ExpectationException
   */
  public function testContentTranslationCreator() {
    $node_id = $this->createTestNode();

    // Disable filtering as it is only
    // needed to be enabled for testing limited users.
    $this->drupalLogin($this->rootUser);
    $this->enableFilterTranslationTabToSkills(TRUE);
    $this->drupalLogout();

    $creator1 = $this->createUser(
      ['create content translations', 'translate article node'],
      'creator1'
    );
    $creator2 = $this->createUser(
      ['create content translations', 'translate any entity'],
      'creator2'
    );

    $this->drupalLogin($creator1);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Add\']/@href');

    $this->drupalLogout();
    $this->drupalLogin($creator2);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Add\']/@href');
  }

  /**
   * Test user's content translation "edit" access.
   *
   * @throws \Behat\Mink\Exception\ExpectationException
   */
  public function testContentTranslationEditor() {
    $node_id = $this->createTestNode(TRUE);

    // Disable filtering as it is only
    // needed to be enabled for testing limited users.
    $this->drupalLogin($this->rootUser);
    $this->enableFilterTranslationTabToSkills(TRUE);
    $this->drupalLogout();

    $editor1 = $this->createUser(
      ['update content translations', 'translate any entity'],
      'editor1'
    );
    $editor2 = $this->createUser(
      ['update content translations', 'translate article node'],
      'editor2'
    );

    $this->drupalLogin($editor1);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Edit\']/@href');
    $this->assertSession()->elementNotExists('xpath', '//a[@hreflang=\'en\'][text()=\'Edit\']/@href');

    $this->drupalLogout();
    $this->drupalLogin($editor2);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Edit\']/@href');
    $this->assertSession()->elementNotExists('xpath', '//a[@hreflang=\'en\'][text()=\'Edit\']/@href');
  }

  /**
   * Test user's content translation "delete" access.
   *
   * @throws \Behat\Mink\Exception\ExpectationException
   */
  public function testContentTranslationDeleter() {
    $node_id = $this->createTestNode(TRUE);

    // Disable filtering as it is only
    // needed to be enabled for testing limited users.
    $this->drupalLogin($this->rootUser);
    $this->enableFilterTranslationTabToSkills(TRUE);
    $this->drupalLogout();

    $deleter1 = $this->createUser(
      ['delete content translations', 'translate any entity'],
      'deleter1'
    );
    $deleter2 = $this->createUser(
      ['delete content translations', 'translate article node'],
      'deleter2'
    );

    $this->drupalLogin($deleter1);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Delete\']/@href');
    $this->assertSession()->elementNotExists('xpath', '//a[@hreflang=\'en\'][text()=\'Delete\']/@href');

    $this->drupalLogout();
    $this->drupalLogin($deleter2);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Delete\']/@href');
    $this->assertSession()->elementNotExists('xpath', '//a[@hreflang=\'en\'][text()=\'Delete\']/@href');
  }

  /**
   * Test user's local_translation_content "create" access.
   *
   * @throws \Behat\Mink\Exception\ExpectationException
   */
  public function testLimitedCreator() {
    $node_id = $this->createTestNode();

    $creator1 = $this->createUser(
      ['local_translation_content create content translations', 'translate article node'],
      'creator1'
    );
    $creator2 = $this->createUser(
      ['local_translation_content create content translations', 'translate any entity'],
      'creator2'
    );

    $this->drupalLogin($creator1);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementNotExists('xpath', '//a[text()=\'Add\']/@href');

    $this->drupalLogout();

    $this->drupalLogin($creator2);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementNotExists('xpath', '//a[text()=\'Add\']/@href');

    $this->drupalLogout();

    $this->registerSkillsFor($creator1);
    $this->registerSkillsFor($creator2);

    $this->drupalLogin($creator1);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Add\']/@href');

    $this->clickLink('Add');
    $this->assertResponseCode(403, TRUE);

    $this->drupalLogout();
    $this->drupalLogin($creator2);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Add\']/@href');

    $this->clickLink('Add');
    $this->assertResponseCode(403, TRUE);
  }

  /**
   * Test user's local_translation_content "edit" access.
   *
   * @throws \Behat\Mink\Exception\ExpectationException
   */
  public function testLimitedEditor() {
    $node_id = $this->createTestNode(TRUE);

    $editor1 = $this->createUser(
      ['local_translation_content update content translations', 'translate article node'],
      'editor1'
    );
    $editor2 = $this->createUser(
      ['local_translation_content update content translations', 'translate any entity'],
      'editor2'
    );

    $this->drupalLogin($editor1);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementNotExists('xpath', '//a[text()=\'Edit\']/@href');

    $this->drupalLogout();
    $this->drupalLogin($editor2);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementNotExists('xpath', '//a[text()=\'Edit\']/@href');

    $this->drupalLogout();
    $this->registerSkillsFor($editor1);
    $this->registerSkillsFor($editor2);
    $this->drupalLogin($editor1);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Edit\']/@href');
    $this->assertSession()->elementNotExists('xpath', '//a[@hreflang=\'en\'][text()=\'Edit\']/@href');

    $this->clickLink('Edit');
    $this->assertResponseCode(403, TRUE);

    $this->drupalLogout();
    $this->drupalLogin($editor2);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Edit\']/@href');
    $this->assertSession()->elementNotExists('xpath', '//a[@hreflang=\'en\'][text()=\'Edit\']/@href');

    $this->clickLink('Edit');
    $this->assertResponseCode(403, TRUE);

    $this->drupalLogout();
    $this->drupalLogin($editor1);

    $this->drupalGet("de/node/$node_id/edit");
    $this->assertResponseCode(403);

    $this->drupalLogout();
    $this->drupalLogin($editor2);

    $this->drupalGet("sq/node/$node_id/edit");
    $this->assertResponseCode(403);
  }

  /**
   * Test user's local_translation_content "delete" access.
   *
   * @throws \Behat\Mink\Exception\ExpectationException
   */
  public function testLimitedDeleter() {
    $node_id = $this->createTestNode(TRUE);

    $deleter1 = $this->createUser(
      ['local_translation_content delete content translations', 'translate article node'],
      'deleter1'
    );
    $deleter2 = $this->createUser(
      ['local_translation_content delete content translations', 'translate any entity'],
      'deleter2'
    );

    $this->drupalLogin($deleter1);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementNotExists('xpath', '//a[text()=\'Delete\']/@href');

    $this->drupalLogout();
    $this->drupalLogin($deleter2);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementNotExists('xpath', '//a[text()=\'Delete\']/@href');

    $this->drupalLogout();
    $this->registerSkillsFor($deleter1);
    $this->registerSkillsFor($deleter2);
    $this->drupalLogin($deleter1);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Delete\']/@href');
    $this->assertSession()->elementNotExists('xpath', '//a[@hreflang=\'en\'][text()=\'Delete\']/@href');

    $this->clickLink('Delete');
    $this->assertResponseCode(403, TRUE);

    $this->drupalLogout();
    $this->drupalLogin($deleter2);

    $this->drupalGet("node/$node_id/translations");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Delete\']/@href');
    $this->assertSession()->elementNotExists('xpath', '//a[@hreflang=\'en\'][text()=\'Delete\']/@href');

    $this->clickLink('Delete');
    $this->assertResponseCode(403, TRUE);

    $this->drupalLogout();
    $this->drupalLogin($deleter1);

    $this->drupalGet("de/node/$node_id/delete");
    $this->assertResponseCode(403);

    $this->drupalLogout();
    $this->drupalLogin($deleter2);

    $this->drupalGet("sq/node/$node_id/delete");
    $this->assertResponseCode(403);
  }

  /**
   * Test that ensures we don't restrict access to the user's edit form.
   *
   * @throws \Behat\Mink\Exception\ExpectationException
   */
  public function testUserEditFormWorkaround() {
    $user = $this->createUser();
    $this->drupalLogin($user);

    // Check for the tab existence.
    $this->drupalGet("user/{$user->id()}");
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Edit\']/@href');

    // Check for the edit page access.
    $this->drupalGet("user/{$user->id()}/edit");
    $this->assertResponseCode(403, TRUE);
    $this->assertResponseCode(200);

    // Additionally check that we don't give access to this form
    // for anonymous users.
    $this->drupalLogout();
    $this->drupalGet("user/{$user->id()}/edit");
    $this->assertResponseCode(403);
  }

  /**
   * Test entity local task tabs existence.
   */
  public function testEntityLocalTasksAccess() {
    $node_id = $this->createTestNode(TRUE);
    $user = $this->createUser(
      [
        'local_translation_content delete content translations',
        'local_translation_content update content translations',
        'translate article node',
      ],
      'testuser'
    );
    $this->drupalLogin($user);
    $this->registerSkillsFor($user);
    // Check for EXISTING tabs.
    $this->drupalGet('fr/node/' . $node_id);
    $this->assertResponseCode(200);
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Edit\']/@href');
    $this->assertSession()->elementExists('xpath', '//a[text()=\'Delete\']/@href');

    // Check for NON-EXISTING tabs.
    $this->drupalGet('de/node/' . $node_id);
    $this->assertResponseCode(200);
    $this->assertSession()->elementNotExists('xpath', '//a[text()=\'Edit\']/@href');
    $this->assertSession()->elementNotExists('xpath', '//a[text()=\'Delete\']/@href');
  }

}

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

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