You are here

public function ContentTranslationOperationsTest::testOperationTranslateLink in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/content_translation/tests/src/Functional/ContentTranslationOperationsTest.php \Drupal\Tests\content_translation\Functional\ContentTranslationOperationsTest::testOperationTranslateLink()

Tests that the operation "Translate" is displayed in the content listing.

File

core/modules/content_translation/tests/src/Functional/ContentTranslationOperationsTest.php, line 76

Class

ContentTranslationOperationsTest
Tests the content translation operations available in the content listing.

Namespace

Drupal\Tests\content_translation\Functional

Code

public function testOperationTranslateLink() {
  $node = $this
    ->drupalCreateNode([
    'type' => 'article',
    'langcode' => 'es',
  ]);

  // Verify no translation operation links are displayed for users without
  // permission.
  $this
    ->drupalLogin($this->baseUser1);
  $this
    ->drupalGet('admin/content');
  $this
    ->assertSession()
    ->linkByHrefNotExists('node/' . $node
    ->id() . '/translations');
  $this
    ->drupalLogout();

  // Verify there's a translation operation link for users with enough
  // permissions.
  $this
    ->drupalLogin($this->baseUser2);
  $this
    ->drupalGet('admin/content');
  $this
    ->assertSession()
    ->linkByHrefExists('node/' . $node
    ->id() . '/translations');

  // Ensure that an unintended misconfiguration of permissions does not open
  // access to the translation form, see https://www.drupal.org/node/2558905.
  $this
    ->drupalLogout();
  user_role_change_permissions(Role::AUTHENTICATED_ID, [
    'create content translations' => TRUE,
    'access content' => FALSE,
  ]);
  $this
    ->drupalLogin($this->baseUser1);
  $this
    ->drupalGet($node
    ->toUrl('drupal:content-translation-overview'));
  $this
    ->assertSession()
    ->statusCodeEquals(403);

  // Ensure that the translation overview is also not accessible when the user
  // has 'access content', but the node is not published.
  user_role_change_permissions(Role::AUTHENTICATED_ID, [
    'create content translations' => TRUE,
    'access content' => TRUE,
  ]);
  $node
    ->setUnpublished()
    ->save();
  $this
    ->drupalGet($node
    ->toUrl('drupal:content-translation-overview'));
  $this
    ->assertSession()
    ->statusCodeEquals(403);
  $this
    ->drupalLogout();

  // Ensure the 'Translate' local task does not show up anymore when disabling
  // translations for a content type.
  $node
    ->setPublished()
    ->save();
  user_role_change_permissions(Role::AUTHENTICATED_ID, [
    'administer content translation' => TRUE,
    'administer languages' => TRUE,
  ]);
  $this
    ->drupalPlaceBlock('local_tasks_block');
  $this
    ->drupalLogin($this->baseUser2);
  $this
    ->drupalGet('node/' . $node
    ->id());
  $this
    ->assertSession()
    ->linkByHrefExists('node/' . $node
    ->id() . '/translations');
  $this
    ->drupalGet('admin/config/regional/content-language');
  $this
    ->submitForm([
    'settings[node][article][translatable]' => FALSE,
  ], 'Save configuration');
  $this
    ->drupalGet('node/' . $node
    ->id());
  $this
    ->assertSession()
    ->linkByHrefNotExists('node/' . $node
    ->id() . '/translations');
}