You are here

public function NodeAccessLanguageFallbackTest::testNodeAccessLanguageFallback in Drupal 10

Same name and namespace in other branches
  1. 8 core/modules/node/tests/src/Functional/NodeAccessLanguageFallbackTest.php \Drupal\Tests\node\Functional\NodeAccessLanguageFallbackTest::testNodeAccessLanguageFallback()
  2. 9 core/modules/node/tests/src/Functional/NodeAccessLanguageFallbackTest.php \Drupal\Tests\node\Functional\NodeAccessLanguageFallbackTest::testNodeAccessLanguageFallback()

Tests node access fallback handling with multiple node languages.

File

core/modules/node/tests/src/Functional/NodeAccessLanguageFallbackTest.php, line 52

Class

NodeAccessLanguageFallbackTest
Tests that the node_access system stores the proper fallback marker.

Namespace

Drupal\Tests\node\Functional

Code

public function testNodeAccessLanguageFallback() {

  // The node_access_test module allows nodes to be marked private. We need to
  // ensure that system honors the fallback system of node access properly.
  // Note that node_access_test_language is language-sensitive and does not
  // apply to the fallback test.
  // Create one node in Hungarian and marked as private.
  $node = $this
    ->drupalCreateNode([
    'body' => [
      [],
    ],
    'langcode' => 'hu',
    'private' => [
      [
        'value' => 1,
      ],
    ],
    'status' => 1,
  ]);

  // There should be one entry in node_access, with fallback set to hu.
  $this
    ->checkRecords(1, 'hu');

  // Create a translation user.
  $admin = $this
    ->drupalCreateUser([
    'bypass node access',
    'administer nodes',
    'translate any entity',
    'administer content translation',
  ]);
  $this
    ->drupalLogin($admin);
  $this
    ->drupalGet('node/' . $node
    ->id() . '/translations');
  $this
    ->assertSession()
    ->statusCodeEquals(200);

  // Create a Catalan translation through the UI.
  $url_options = [
    'language' => \Drupal::languageManager()
      ->getLanguage('ca'),
  ];
  $this
    ->drupalGet('node/' . $node
    ->id() . '/translations/add/hu/ca', $url_options);
  $this
    ->assertSession()
    ->statusCodeEquals(200);

  // Save the form.
  $this
    ->getSession()
    ->getPage()
    ->pressButton('Save (this translation)');
  $this
    ->assertSession()
    ->statusCodeEquals(200);

  // Check the node access table.
  $this
    ->checkRecords(2, 'hu');

  // Programmatically create a translation. This process lets us check that
  // both forms and code behave in the same way.
  $storage = \Drupal::entityTypeManager()
    ->getStorage('node');

  // Reload the node.
  $node = $storage
    ->load(1);

  // Create an Afrikaans translation.
  $translation = $node
    ->addTranslation('af');
  $translation->title->value = $this
    ->randomString();
  $translation->status = 1;
  $node
    ->save();

  // Check the node access table.
  $this
    ->checkRecords(3, 'hu');

  // For completeness, edit the Catalan version again.
  $this
    ->drupalGet('node/' . $node
    ->id() . '/edit', $url_options);
  $this
    ->assertSession()
    ->statusCodeEquals(200);

  // Save the form.
  $this
    ->getSession()
    ->getPage()
    ->pressButton('Save (this translation)');
  $this
    ->assertSession()
    ->statusCodeEquals(200);

  // Check the node access table.
  $this
    ->checkRecords(3, 'hu');
}