You are here

public function MultiFormTest::testMultiForm in Drupal 10

Same name and namespace in other branches
  1. 8 core/tests/Drupal/FunctionalJavascriptTests/Ajax/MultiFormTest.php \Drupal\FunctionalJavascriptTests\Ajax\MultiFormTest::testMultiForm()
  2. 9 core/tests/Drupal/FunctionalJavascriptTests/Ajax/MultiFormTest.php \Drupal\FunctionalJavascriptTests\Ajax\MultiFormTest::testMultiForm()

Tests that pages with the 'node_page_form' included twice work correctly.

File

core/tests/Drupal/FunctionalJavascriptTests/Ajax/MultiFormTest.php, line 60

Class

MultiFormTest
Tests that AJAX-enabled forms work when multiple instances of the same form are on a page.

Namespace

Drupal\FunctionalJavascriptTests\Ajax

Code

public function testMultiForm() {

  // HTML IDs for elements within the field are potentially modified with
  // each Ajax submission, but these variables are stable and help target the
  // desired elements.
  $field_name = 'field_ajax_test';
  $form_xpath = '//form[starts-with(@id, "node-page-form")]';
  $field_xpath = '//div[contains(@class, "field--name-field-ajax-test")]';
  $button_name = $field_name . '_add_more';
  $button_xpath_suffix = '//input[@name="' . $button_name . '"]';
  $field_items_xpath_suffix = '//input[@type="text"]';

  // Ensure the initial page contains both node forms and the correct number
  // of field items and "add more" button for the multi-valued field within
  // each form.
  $this
    ->drupalGet('form-test/two-instances-of-same-form');

  // Wait for javascript on the page to prepare the form attributes.
  $this
    ->assertSession()
    ->assertWaitOnAjaxRequest();
  $session = $this
    ->getSession();
  $page = $session
    ->getPage();
  $fields = $page
    ->findAll('xpath', $form_xpath . $field_xpath);
  $this
    ->assertCount(2, $fields);
  foreach ($fields as $field) {
    $this
      ->assertCount(1, $field
      ->findAll('xpath', '.' . $field_items_xpath_suffix), 'Found the correct number of field items on the initial page.');
    $this
      ->assertNotNull($field
      ->find('xpath', '.' . $button_xpath_suffix), 'Found the "add more" button on the initial page.');
  }
  $this
    ->assertSession()
    ->pageContainsNoDuplicateId();

  // Submit the "add more" button of each form twice. After each corresponding
  // page update, ensure the same as above.
  for ($i = 0; $i < 2; $i++) {
    $forms = $page
      ->find('xpath', $form_xpath);
    foreach ($forms as $offset => $form) {
      $button = $form
        ->findButton('Add another item');
      $this
        ->assertNotNull($button, 'Add Another Item button exists');
      $button
        ->press();

      // Wait for page update.
      $this
        ->assertSession()
        ->assertWaitOnAjaxRequest();

      // After AJAX request and response page will update.
      $page_updated = $session
        ->getPage();
      $field = $page_updated
        ->findAll('xpath', '.' . $field_xpath);
      $this
        ->assertCount($i + 2, $field[0]
        ->find('xpath', '.' . $field_items_xpath_suffix), 'Found the correct number of field items after an AJAX submission.');
      $this
        ->assertNotNull($field[0]
        ->find('xpath', '.' . $button_xpath_suffix), 'Found the "add more" button after an AJAX submission.');
      $this
        ->assertSession()
        ->pageContainsNoDuplicateId();
    }
  }
}