You are here

protected function SimpleWidgetTest::checkEditAccess in Inline Entity Form 8

Tests that user only has access to the their own nodes.

Parameters

\Drupal\node\NodeInterface $host_node: The node of the type of ief_simple_single.

int $number_of_items: The number of entity reference values in the "single" field.

int $cardinality: The field cardinality with which to check.

1 call to SimpleWidgetTest::checkEditAccess()
SimpleWidgetTest::testSimpleCardinalityOptions in tests/src/FunctionalJavascript/SimpleWidgetTest.php
Tests simple IEF widget with different cardinality options.

File

tests/src/FunctionalJavascript/SimpleWidgetTest.php, line 242

Class

SimpleWidgetTest
Tests the IEF simple widget.

Namespace

Drupal\Tests\inline_entity_form\FunctionalJavascript

Code

protected function checkEditAccess(NodeInterface $host_node, int $number_of_items, int $cardinality) {
  $assert_session = $this
    ->assertSession();
  $page = $this
    ->getSession()
    ->getPage();
  $other_user = $this
    ->createUser([
    'edit own ief_test_custom content',
    'edit any ief_simple_single content',
  ]);
  $first_child_node = $host_node->single[0]->entity;
  $first_child_node
    ->setOwner($other_user)
    ->save();
  $this
    ->drupalGet("node/{$host_node->id()}/edit");
  $assert_session
    ->pageTextContains($first_child_node
    ->label());

  // Assert the form of child node without edit access is not found.
  $assert_session
    ->fieldNotExists('single[0][inline_entity_form][title][0][value]');

  // Check that the forms for other child nodes (if any) appear on the form.
  // If $number_of_items is greater than one, iterate through the other
  // fields that should appear on the page.
  $delta = 1;
  while ($delta < $number_of_items) {
    $child_node = $host_node->single[$delta]->entity;

    // Assert the form of child node with edit access is found.
    $delta_field = $assert_session
      ->fieldExists("single[{$delta}][inline_entity_form][title][0][value]");
    $this
      ->assertStringContainsString($child_node
      ->label(), $delta_field
      ->getValue());
    $delta++;
  }

  // Check that there is NOT an extra "add" form when editing.
  $unexpected_item_number = $number_of_items;

  // Assert no empty "add" entity form is found on edit.
  $assert_session
    ->fieldNotExists("single[{$unexpected_item_number}][inline_entity_form][title][0][value]");
  if ($cardinality == FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) {
    $next_item_number = $number_of_items;
    $page
      ->pressButton('Add another item');

    // Assert item $next_item_number does appear after 'Add More'
    // clicked.
    $this
      ->assertNotEmpty($assert_session
      ->waitForField("single[{$next_item_number}][inline_entity_form][title][0][value]"));

    // Make sure only 1 item is added.
    $unexpected_item_number = $next_item_number + 1;

    // Assert extra item $unexpected_item_number is not added after
    // 'Add More' clicked.
    $assert_session
      ->fieldNotExists("single[{$unexpected_item_number}][inline_entity_form][title][0][value]");
  }

  // Now that we have confirmed the correct fields appear, let's update the
  // values and save them. We do not have access to the form for delta 0
  // because it is owned by another user.
  $delta = 1;
  $new_titles = [];
  $edit = [];

  // Loop through an update all child node titles.
  while ($delta < $number_of_items) {

    /** @var \Drupal\node\Entity\Node $child_node */
    $child_node = $host_node->single[$delta]->entity;
    $new_titles[$delta] = $child_node
      ->label() . ' - updated';
    $edit["single[{$delta}][inline_entity_form][title][0][value]"] = $new_titles[$delta];
    $delta++;
  }

  // If cardinality equals CARDINALITY_UNLIMITED then we should have 1 extra
  // form open.
  if ($cardinality === FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) {
    $new_titles[$delta] = 'Title for new child';
    $edit["single[{$delta}][inline_entity_form][title][0][value]"] = $new_titles[$delta];
  }
  $this
    ->submitForm($edit, 'Save');
  $assert_session
    ->pageTextContains("IEF simple single {$host_node->label()} has been updated.");

  // Reset cache for nodes.
  $node_ids = [
    $host_node
      ->id(),
  ];
  foreach ($host_node->single as $item) {
    $node_ids[] = $item->entity
      ->id();
  }
  $this->container
    ->get('entity_type.manager')
    ->getStorage('node')
    ->resetCache($node_ids);
  $host_node = Node::load($host_node
    ->id());

  // Check that titles were updated.
  foreach ($new_titles as $delta => $new_title) {
    $child_node = $host_node->single[$delta]->entity;
    $this
      ->assertSame($new_title, $child_node
      ->label(), "Child {$delta} node title has been updated.");
  }
}